package com.oracle.truffle.js.builtins.intl;
import com.oracle.truffle.api.dsl.Fallback;
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.NumberFormatPrototypeBuiltinsFactory.JSNumberFormatFormatToPartsNodeGen;
import com.oracle.truffle.js.builtins.intl.NumberFormatPrototypeBuiltinsFactory.JSNumberFormatResolvedOptionsNodeGen;
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.builtins.BuiltinEnum;
import com.oracle.truffle.js.runtime.builtins.intl.JSNumberFormat;
public final class NumberFormatPrototypeBuiltins extends JSBuiltinsContainer.SwitchEnum<NumberFormatPrototypeBuiltins.NumberFormatPrototype> {
public static final JSBuiltinsContainer BUILTINS = new NumberFormatPrototypeBuiltins();
protected NumberFormatPrototypeBuiltins() {
super(JSNumberFormat.PROTOTYPE_NAME, NumberFormatPrototype.class);
}
public enum NumberFormatPrototype implements BuiltinEnum<NumberFormatPrototype> {
resolvedOptions(0),
formatToParts(1);
private final int length;
NumberFormatPrototype(int length) {
this.length = length;
}
@Override
public int getLength() {
return length;
}
}
@Override
protected Object createNode(JSContext context, JSBuiltin builtin, boolean construct, boolean newTarget, NumberFormatPrototype builtinEnum) {
switch (builtinEnum) {
case resolvedOptions:
return JSNumberFormatResolvedOptionsNodeGen.create(context, builtin, args().withThis().createArgumentNodes(context));
case formatToParts:
return JSNumberFormatFormatToPartsNodeGen.create(context, builtin, args().withThis().fixedArgs(1).createArgumentNodes(context));
}
return null;
}
public abstract static class JSNumberFormatResolvedOptionsNode extends JSBuiltinNode {
public JSNumberFormatResolvedOptionsNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = {"isJSNumberFormat(numberFormat)"})
public Object doResolvedOptions(DynamicObject numberFormat) {
return JSNumberFormat.resolvedOptions(getContext(), numberFormat);
}
@Fallback
public void doResolvedOptions(@SuppressWarnings("unused") Object bummer) {
throw Errors.createTypeErrorTypeXExpected(JSNumberFormat.CLASS_NAME);
}
}
public abstract static class JSNumberFormatFormatToPartsNode extends JSBuiltinNode {
public JSNumberFormatFormatToPartsNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = {"isJSNumberFormat(numberFormat)"})
public Object doFormatToParts(DynamicObject numberFormat, Object value) {
return JSNumberFormat.formatToParts(getContext(), numberFormat, value);
}
@Fallback
@SuppressWarnings("unused")
public void throwTypeError(Object bummer, Object value) {
throw Errors.createTypeErrorTypeXExpected(JSNumberFormat.CLASS_NAME);
}
}
}