Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/ImplicitCastNodeFactory.java @ 20938:18c0f02fa4d2
Truffle-DSL: make type systems optional.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 14 Apr 2015 15:12:48 +0200 |
parents | a665483c3881 |
children | b1530a6cce8c |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/ImplicitCastNodeFactory.java Tue Apr 14 22:12:03 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/ImplicitCastNodeFactory.java Tue Apr 14 15:12:48 2015 +0200 @@ -44,31 +44,30 @@ public class ImplicitCastNodeFactory { private final ProcessorContext context; - private final TypeData forType; + private final TypeMirror forType; private final TypeSystemData typeSystem; private final DSLOptions options; - private final List<TypeData> sourceTypes; + private final List<TypeMirror> sourceTypes; - public ImplicitCastNodeFactory(ProcessorContext context, TypeData forType) { + public ImplicitCastNodeFactory(ProcessorContext context, TypeSystemData typeSystem, TypeMirror forType) { this.context = context; this.forType = forType; - this.typeSystem = forType.getTypeSystem(); + this.typeSystem = typeSystem; this.options = typeSystem.getOptions(); this.sourceTypes = typeSystem.lookupSourceTypes(forType); } - public static String typeName(TypeData type) { - return "Implicit" + getTypeId(type.getBoxedType()) + "Cast"; + public static String typeName(TypeMirror type) { + return "Implicit" + getTypeId(type) + "Cast"; } - public static TypeMirror type(TypeData type) { - TypeSystemData typeSystem = type.getTypeSystem(); + public static TypeMirror type(TypeSystemData typeSystem, TypeMirror type) { String typeSystemName = TypeSystemCodeGenerator.typeName(typeSystem); return new GeneratedTypeMirror(ElementUtils.getPackageName(typeSystem.getTemplateType()) + "." + typeSystemName, typeName(type)); } - public static CodeTree create(TypeData type, CodeTree value) { - return CodeTreeBuilder.createBuilder().startStaticCall(type(type), "create").tree(value).end().build(); + public static CodeTree create(TypeSystemData typeSystem, TypeMirror type, CodeTree value) { + return CodeTreeBuilder.createBuilder().startStaticCall(type(typeSystem, type), "create").tree(value).end().build(); } public static CodeTree cast(String nodeName, CodeTree value) { @@ -79,8 +78,8 @@ return CodeTreeBuilder.createBuilder().startCall(nodeName, "check").tree(value).end().build(); } - private static String seenFieldName(TypeData type) { - return "seen" + getTypeId(type.getBoxedType()); + private static String seenFieldName(TypeMirror type) { + return "seen" + getTypeId(type); } public CodeTypeElement create() { @@ -88,7 +87,7 @@ TypeMirror baseType = context.getType(Object.class); CodeTypeElement clazz = GeneratorUtils.createClass(typeSystem, null, modifiers(PUBLIC, FINAL, STATIC), typeName, baseType); - for (TypeData sourceType : sourceTypes) { + for (TypeMirror sourceType : sourceTypes) { CodeVariableElement hasSeen = new CodeVariableElement(modifiers(PUBLIC), context.getType(boolean.class), seenFieldName(sourceType)); hasSeen.getAnnotationMirrors().add(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class))); clazz.add(hasSeen); @@ -113,7 +112,7 @@ CodeTreeBuilder builder = method.createBuilder(); builder.startReturn(); String operator = ""; - for (TypeData sourceType : sourceTypes) { + for (TypeMirror sourceType : sourceTypes) { builder.string(operator); builder.string(seenFieldName(sourceType)); operator = " ^ "; @@ -129,15 +128,15 @@ private Element createCreate(CodeTypeElement clazz) { String methodName = "create"; CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), clazz.asType(), methodName); - method.addParameter(new CodeVariableElement(typeSystem.getGenericType(), "value")); + method.addParameter(new CodeVariableElement(context.getType(Object.class), "value")); CodeTreeBuilder builder = method.createBuilder(); builder.declaration(clazz.asType(), "newCast", builder.create().startNew(clazz.asType()).end()); - for (TypeData sourceType : sourceTypes) { + for (TypeMirror sourceType : sourceTypes) { String seenField = seenFieldName(sourceType); builder.startStatement(); - builder.string("newCast.").string(seenField).string(" = ").tree(TypeSystemCodeGenerator.check(sourceType, "value")); + builder.string("newCast.").string(seenField).string(" = ").tree(TypeSystemCodeGenerator.check(typeSystem, sourceType, "value")); builder.end(); } builder.startReturn().string("newCast").end(); @@ -150,7 +149,7 @@ method.addParameter(new CodeVariableElement(clazz.asType(), "otherCast")); CodeTreeBuilder builder = method.createBuilder(); - for (TypeData sourceType : sourceTypes) { + for (TypeMirror sourceType : sourceTypes) { String seenField = seenFieldName(sourceType); builder.startStatement(); builder.string("this.").string(seenField).string(" |= ").string("otherCast.").string(seenField); @@ -162,13 +161,13 @@ private Element createCheck() { String methodName = "check"; CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(boolean.class), methodName); - method.addParameter(new CodeVariableElement(typeSystem.getGenericType(), "value")); + method.addParameter(new CodeVariableElement(context.getType(Object.class), "value")); CodeTreeBuilder builder = method.createBuilder(); boolean elseIf = false; - for (TypeData sourceType : sourceTypes) { + for (TypeMirror sourceType : sourceTypes) { elseIf = builder.startIf(elseIf); - builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(sourceType, "value")); + builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(typeSystem, sourceType, "value")); builder.end(); builder.startBlock().returnTrue().end(); } @@ -178,8 +177,8 @@ private Element createCast(boolean expect) { String methodName = expect ? "expect" : "cast"; - CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), forType.getPrimitiveType(), methodName); - method.addParameter(new CodeVariableElement(typeSystem.getGenericType(), "value")); + CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), forType, methodName); + method.addParameter(new CodeVariableElement(context.getType(Object.class), "value")); if (expect) { method.getThrownTypes().add(context.getType(UnexpectedResultException.class)); } @@ -187,16 +186,16 @@ CodeTreeBuilder builder = method.createBuilder(); boolean elseIf = false; - for (TypeData sourceType : sourceTypes) { + for (TypeMirror sourceType : sourceTypes) { elseIf = builder.startIf(elseIf); - builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(sourceType, "value")); + builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(typeSystem, sourceType, "value")); builder.end(); builder.startBlock(); builder.startReturn(); - CodeTree castTree = TypeSystemCodeGenerator.cast(sourceType, "value"); + CodeTree castTree = TypeSystemCodeGenerator.cast(typeSystem, sourceType, "value"); ImplicitCastData cast = typeSystem.lookupCast(sourceType, forType); if (cast != null) { - builder.tree(TypeSystemCodeGenerator.invokeImplicitCast(cast, castTree)); + builder.tree(TypeSystemCodeGenerator.invokeImplicitCast(typeSystem, cast, castTree)); } else { builder.tree(castTree); }