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.SegmenterPrototypeBuiltinsFactory.JSSegmenterResolvedOptionsNodeGen;
import com.oracle.truffle.js.builtins.intl.SegmenterPrototypeBuiltinsFactory.JSSegmenterSegmentNodeGen;
import com.oracle.truffle.js.nodes.JavaScriptBaseNode;
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.JSSegmenter;
public final class SegmenterPrototypeBuiltins extends JSBuiltinsContainer.SwitchEnum<SegmenterPrototypeBuiltins.SegmenterPrototype> {
public static final JSBuiltinsContainer BUILTINS = new SegmenterPrototypeBuiltins();
protected SegmenterPrototypeBuiltins() {
super(JSSegmenter.PROTOTYPE_NAME, SegmenterPrototype.class);
}
public enum SegmenterPrototype implements BuiltinEnum<SegmenterPrototype> {
resolvedOptions(0),
segment(1);
private final int length;
SegmenterPrototype(int length) {
this.length = length;
}
@Override
public int getLength() {
return length;
}
}
@Override
protected Object createNode(JSContext context, JSBuiltin builtin, boolean construct, boolean newTarget, SegmenterPrototype builtinEnum) {
switch (builtinEnum) {
case resolvedOptions:
return JSSegmenterResolvedOptionsNodeGen.create(context, builtin, args().withThis().createArgumentNodes(context));
case segment:
return JSSegmenterSegmentNodeGen.create(context, builtin, args().withThis().fixedArgs(1).createArgumentNodes(context));
}
return null;
}
public abstract static class JSSegmenterResolvedOptionsNode extends JSBuiltinNode {
public JSSegmenterResolvedOptionsNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
}
@Specialization(guards = "isJSSegmenter(segmenter)")
public Object doResolvedOptions(DynamicObject segmenter) {
return JSSegmenter.resolvedOptions(getContext(), segmenter);
}
@Specialization(guards = "!isJSSegmenter(bummer)")
public void doResolvedOptions(@SuppressWarnings("unused") Object bummer) {
throw Errors.createTypeErrorSegmenterExpected();
}
}
public abstract static class JSSegmenterSegmentNode extends JSBuiltinNode {
@Child private CreateSegmentIteratorNode createSegmentIteratorNode;
public JSSegmenterSegmentNode(JSContext context, JSBuiltin builtin) {
super(context, builtin);
this.createSegmentIteratorNode = CreateSegmentIteratorNode.create(context);
}
@Specialization(guards = "isJSSegmenter(segmenter)")
public Object doSegment(DynamicObject segmenter, Object value,
@Cached("create()") JSToStringNode toStringNode) {
return createSegmentIteratorNode.execute(segmenter, toStringNode.executeString(value));
}
@Specialization(guards = "!isJSSegmenter(bummer)")
@SuppressWarnings("unused")
public void throwTypeError(Object bummer, Object value) {
throw Errors.createTypeErrorSegmenterExpected();
}
}
public static class CreateSegmentIteratorNode extends JavaScriptBaseNode {
private final JSContext context;
protected CreateSegmentIteratorNode(JSContext context) {
this.context = context;
}
public static CreateSegmentIteratorNode create(JSContext context) {
return new CreateSegmentIteratorNode(context);
}
public DynamicObject execute(DynamicObject segmenter, String value) {
assert JSSegmenter.isJSSegmenter(segmenter);
return JSSegmenter.createSegmentIterator(context, segmenter, value);
}
}
}