package com.oracle.truffle.js.builtins.intl;
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.DisplayNamesPrototypeBuiltinsFactory.JSDisplayNamesOfNodeGen;
import com.oracle.truffle.js.builtins.intl.DisplayNamesPrototypeBuiltinsFactory.JSDisplayNamesResolvedOptionsNodeGen;
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.builtins.BuiltinEnum;
import com.oracle.truffle.js.runtime.builtins.intl.JSDisplayNames;
public final class DisplayNamesPrototypeBuiltins extends JSBuiltinsContainer.SwitchEnum<DisplayNamesPrototypeBuiltins.DisplayNamesPrototype> {
public static final JSBuiltinsContainer BUILTINS = new DisplayNamesPrototypeBuiltins();
protected DisplayNamesPrototypeBuiltins() {
super(JSDisplayNames.PROTOTYPE_NAME, DisplayNamesPrototype.class);
}
public enum DisplayNamesPrototype implements BuiltinEnum<DisplayNamesPrototype> {
resolvedOptions(0),
of(1);
private final int length;
DisplayNamesPrototype(int length) {
this.length = length;
}
@Override
public int getLength() {
return length;
}
}
@Override
protected Object createNode(JSContext context, JSBuiltin builtin, boolean construct, boolean newTarget, DisplayNamesPrototype builtinEnum) {
switch (builtinEnum) {
case resolvedOptions:
return JSDisplayNamesResolvedOptionsNodeGen.create(context, builtin, args().withThis().createArgumentNodes(context));
case of:
return JSDisplayNamesOfNodeGen.create(context, builtin, args().withThis().fixedArgs(1).createArgumentNodes(context));
}
return null;
}
public abstract static class JSDisplayNamesResolvedOptionsNode extends JSBuiltinNode {
public JSDisplayNamesResolvedOptionsNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = "isJSDisplayNames(displayNames)")
public Object doDisplayNames(DynamicObject displayNames) {
return JSDisplayNames.resolvedOptions(getContext(), displayNames);
}
@Specialization(guards = "!isJSDisplayNames(bummer)")
public Object doOther(@SuppressWarnings("unused") Object bummer) {
throw Errors.createTypeErrorDisplayNamesExpected();
}
}
public abstract static class JSDisplayNamesOfNode extends JSBuiltinNode {
@Child JSToStringNode toStringNode;
public JSDisplayNamesOfNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
toStringNode = JSToStringNode.create();
}
@Specialization(guards = "isJSDisplayNames(displayNames)")
public Object doDisplayNames(DynamicObject displayNames, Object code) {
String codeString = toStringNode.executeString(code);
return JSDisplayNames.of(displayNames, codeString);
}
@Specialization(guards = "!isJSDisplayNames(bummer)")
public Object doOther(@SuppressWarnings("unused") Object bummer, @SuppressWarnings("unused") Object code) {
throw Errors.createTypeErrorDisplayNamesExpected();
}
}
}