private static void generateErrorNode(ProcessorContext context, NodeData node, CodeTypeElement type) { for (ExecutableElement superConstructor : GeneratorUtils.findUserConstructors(node.getTemplateType().asType())) { CodeExecutableElement constructor = GeneratorUtils.createConstructorUsingFields(modifiers(), type, superConstructor); ElementUtils.setVisibility(constructor.getModifiers(), ElementUtils.getVisibility(superConstructor.getModifiers())); List<CodeVariableElement> childParameters = new ArrayList<>(); for (NodeChildData child : node.getChildren()) { childParameters.add(new CodeVariableElement(child.getOriginalType(), child.getName())); } constructor.getParameters().addAll(superConstructor.getParameters().size(), childParameters); type.add(constructor); } for (ExecutableElement method : ElementFilter.methodsIn(context.getEnvironment().getElementUtils().getAllMembers(node.getTemplateType()))) { if (method.getModifiers().contains(Modifier.ABSTRACT) && ElementUtils.getVisibility(method.getModifiers()) != Modifier.PRIVATE) { CodeExecutableElement overrideMethod = CodeExecutableElement.clone(context.getEnvironment(), method); overrideMethod.getModifiers().remove(Modifier.ABSTRACT); List<Message> messages = node.collectMessages(); String message = messages.toString(); message = message.replaceAll("\"", "\\\\\""); message = message.replaceAll("\n", "\\\\n"); overrideMethod.createBuilder().startThrow().startNew(context.getType(RuntimeException.class)).doubleQuote("Truffle DSL compiler errors: " + message).end().end(); type.add(overrideMethod); } } }
private CodeTree createCallDelegate(String methodName, String reason, ExecutableTypeData forType, LocalContext currentValues) { CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); builder.startCall(methodName); if (reason != null) { builder.doubleQuote(reason); } currentValues.addReferencesTo(builder, FRAME_VALUE); builder.end(); CodeTree expectOrCast = expectOrCast(genericType, forType, builder.build()); return expectOrCast; }
private static CodeTree createBuildOptionDescriptor(ProcessorContext context, OptionInfo info) { CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); builder.startStaticCall(context.getType(OptionDescriptor.class), "newBuilder"); VariableElement var = info.field; builder.staticReference(var.getEnclosingElement().asType(), var.getSimpleName().toString()); builder.doubleQuote(info.name); builder.end(); // newBuilder call if (info.deprecated) { builder.startCall("", "deprecated").string("true").end(); } else { builder.startCall("", "deprecated").string("false").end(); } builder.startCall("", "help").doubleQuote(info.help).end(); builder.startCall("", "category").staticReference(context.getType(OptionCategory.class), info.category.name()).end(); builder.startCall("", "build").end(); return builder.build(); }
builder.startThrow().startNew(getType(AssertionError.class)).doubleQuote("Delegation failed.").end().end(); } else { SpecializationGroup group = SpecializationGroup.create(implementedSpecializations);
builder.doubleQuote("Invalid create signature."); builder.end().end();
builder.doubleQuote("Invalid create signature."); builder.end().end();
builder.startSwitch().string(nameVariableName).end().startBlock(); for (OptionInfo info : model.options) { builder.startCase().doubleQuote(info.name).end().startCaseBlock(); builder.startReturn().tree(createBuildOptionDescriptor(context, info)).end();
private CodeTree createCallRemove(String reason, ExecutableTypeData forType, LocalContext currentValues) { if (singleSpecializable) { return createThrowUnsupported(currentValues); } CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); builder.startCall("remove"); builder.doubleQuote(reason); currentValues.addReferencesTo(builder, FRAME_VALUE); builder.end(); CodeTree call = builder.build(); builder = builder.create(); builder.startReturn(); builder.tree(expectOrCast(genericType, forType, call)); builder.end(); return builder.build(); }
private CodeExecutableElement createAsTypeMethod(TypeMirror type) { if (typeSystem.getCast(type) != null) { return null; } CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), type, TypeSystemCodeGenerator.asTypeMethodName(typeSystem, type)); method.addParameter(new CodeVariableElement(context.getType(Object.class), LOCAL_VALUE)); CodeTreeBuilder body = method.createBuilder(); String assertMessage = typeName(typeSystem) + "." + asTypeMethodName(typeSystem, type) + ": " + ElementUtils.getSimpleName(type) + " expected"; body.startAssert().tree(check(typeSystem, type, LOCAL_VALUE)).string(" : ").doubleQuote(assertMessage).end(); body.startReturn().tree(cast(typeSystem, type, LOCAL_VALUE)).end(); return method; }
private CodeExecutableElement createAsTypeMethod(TypeMirror type) { if (typeSystem.getCast(type) != null) { return null; } CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), type, TypeSystemCodeGenerator.asTypeMethodName(typeSystem, type)); method.addParameter(new CodeVariableElement(context.getType(Object.class), LOCAL_VALUE)); CodeTreeBuilder body = method.createBuilder(); String assertMessage = typeName(typeSystem) + "." + asTypeMethodName(typeSystem, type) + ": " + ElementUtils.getSimpleName(type) + " expected"; body.startAssert().tree(check(typeSystem, type, LOCAL_VALUE)).string(" : ").doubleQuote(assertMessage).end(); body.startReturn().tree(cast(typeSystem, type, LOCAL_VALUE)).end(); return method; }
for (SpecializationData specialization : filteredSpecializations) { builder.startStatement().string("s = ").startNewArray(objectArray, CodeTreeBuilder.singleString("3")).end().end(); builder.startStatement().string("s[0] = ").doubleQuote(specialization.getMethodName()).end();
builder.startThrow().startNew(context.getType(IllegalArgumentException.class)).doubleQuote("Illegal type ").end().end(); builder.end(); return method;
private CodeExecutableElement createGetImplicitClass(TypeMirror type) { CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), context.getType(Class.class), TypeSystemCodeGenerator.getImplicitClass(typeSystem, type)); method.addParameter(new CodeVariableElement(context.getType(Object.class), LOCAL_VALUE)); List<TypeMirror> sourceTypes = typeSystem.lookupSourceTypes(type); CodeTreeBuilder builder = method.createBuilder(); boolean elseIf = false; for (TypeMirror sourceType : sourceTypes) { elseIf = builder.startIf(elseIf); builder.tree(check(typeSystem, sourceType, LOCAL_VALUE)).end(); builder.end().startBlock(); builder.startReturn().typeLiteral(sourceType).end(); builder.end(); } builder.startElseIf().string(LOCAL_VALUE).string(" == ").nullLiteral().end(); builder.startBlock(); builder.startReturn().typeLiteral(context.getType(Object.class)).end(); builder.end(); builder.startElseBlock(); builder.tree(createTransferToInterpreterAndInvalidate()); builder.startThrow().startNew(context.getType(IllegalArgumentException.class)).doubleQuote("Illegal type ").end().end(); builder.end(); return method; }
builder.startThrow().startNew(context.getType(IllegalArgumentException.class)).doubleQuote("Illegal type ").end().end(); builder.end(); return method;