package com.oracle.truffle.js.builtins.intl;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.js.builtins.JSBuiltinsContainer;
import com.oracle.truffle.js.builtins.intl.RelativeTimeFormatPrototypeBuiltinsFactory.JSRelativeTimeFormatFormatNodeGen;
import com.oracle.truffle.js.builtins.intl.RelativeTimeFormatPrototypeBuiltinsFactory.JSRelativeTimeFormatFormatToPartsNodeGen;
import com.oracle.truffle.js.builtins.intl.RelativeTimeFormatPrototypeBuiltinsFactory.JSRelativeTimeFormatResolvedOptionsNodeGen;
import com.oracle.truffle.js.nodes.cast.JSToNumberNode;
import com.oracle.truffle.js.nodes.cast.JSToStringNode;
import com.oracle.truffle.js.nodes.function.JSBuiltin;
import com.oracle.truffle.js.nodes.function.JSBuiltinNode;
import com.oracle.truffle.js.runtime.Errors;
import com.oracle.truffle.js.runtime.JSContext;
import com.oracle.truffle.js.runtime.JSRuntime;
import com.oracle.truffle.js.runtime.builtins.BuiltinEnum;
import com.oracle.truffle.js.runtime.builtins.intl.JSRelativeTimeFormat;
public final class RelativeTimeFormatPrototypeBuiltins extends JSBuiltinsContainer.SwitchEnum<RelativeTimeFormatPrototypeBuiltins.RelativeTimeFormatPrototype> {
public static final JSBuiltinsContainer BUILTINS = new RelativeTimeFormatPrototypeBuiltins();
protected RelativeTimeFormatPrototypeBuiltins() {
super(JSRelativeTimeFormat.PROTOTYPE_NAME, RelativeTimeFormatPrototype.class);
}
public enum RelativeTimeFormatPrototype implements BuiltinEnum<RelativeTimeFormatPrototype> {
resolvedOptions(0),
format(2),
formatToParts(2);
private final int length;
RelativeTimeFormatPrototype(int length) {
this.length = length;
}
@Override
public int getLength() {
return length;
}
}
@Override
protected Object createNode(JSContext context, JSBuiltin builtin, boolean construct, boolean newTarget, RelativeTimeFormatPrototype builtinEnum) {
switch (builtinEnum) {
case resolvedOptions:
return JSRelativeTimeFormatResolvedOptionsNodeGen.create(context, builtin, args().withThis().createArgumentNodes(context));
case format:
return JSRelativeTimeFormatFormatNodeGen.create(context, builtin, args().withThis().fixedArgs(2).createArgumentNodes(context));
case formatToParts:
return JSRelativeTimeFormatFormatToPartsNodeGen.create(context, builtin, args().withThis().fixedArgs(2).createArgumentNodes(context));
}
return null;
}
public abstract static class JSRelativeTimeFormatResolvedOptionsNode extends JSBuiltinNode {
public JSRelativeTimeFormatResolvedOptionsNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = "isJSRelativeTimeFormat(relativeTimeFormat)")
public Object doResolvedOptions(DynamicObject relativeTimeFormat) {
return JSRelativeTimeFormat.resolvedOptions(getContext(), relativeTimeFormat);
}
@Specialization(guards = "!isJSRelativeTimeFormat(bummer)")
public void doResolvedOptions(@SuppressWarnings("unused") Object bummer) {
throw Errors.createTypeErrorTypeXExpected(JSRelativeTimeFormat.CLASS_NAME);
}
}
public abstract static class JSRelativeTimeFormatFormatNode extends JSBuiltinNode {
public JSRelativeTimeFormatFormatNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = "isJSRelativeTimeFormat(relativeTimeFormat)")
public String doFormat(DynamicObject relativeTimeFormat, Object value, Object unit,
@Cached("create()") JSToStringNode toStringNode,
@Cached("create()") JSToNumberNode toNumberNode) {
return JSRelativeTimeFormat.format(relativeTimeFormat, JSRuntime.doubleValue(toNumberNode.executeNumber(value)), toStringNode.executeString(unit));
}
@Specialization(guards = "!isJSRelativeTimeFormat(bummer)")
@SuppressWarnings("unused")
public void throwTypeError(Object bummer, Object value, Object unit) {
throw Errors.createTypeErrorTypeXExpected(JSRelativeTimeFormat.CLASS_NAME);
}
}
public abstract static class JSRelativeTimeFormatFormatToPartsNode extends JSBuiltinNode {
public JSRelativeTimeFormatFormatToPartsNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = {"isJSRelativeTimeFormat(relativeTimeFormat)"})
public Object doFormatToParts(DynamicObject relativeTimeFormat, Object value, Object unit,
@Cached("create()") JSToStringNode toStringNode,
@Cached("create()") JSToNumberNode toNumberNode) {
return JSRelativeTimeFormat.formatToParts(getContext(), relativeTimeFormat, JSRuntime.doubleValue(toNumberNode.executeNumber(value)), toStringNode.executeString(unit));
}
@Specialization(guards = "!isJSRelativeTimeFormat(bummer)")
@SuppressWarnings("unused")
public void throwTypeError(Object bummer, Object value, Object unit) {
throw Errors.createTypeErrorTypeXExpected(JSRelativeTimeFormat.CLASS_NAME);
}
}
}