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);
             }