changeset 16923:93e061157811

Truffle-DSL: better support for types with type arguments.
author Christian Humer <christian.humer@gmail.com>
date Mon, 25 Aug 2014 20:59:56 +0200
parents 0ea0c4133b78
children 29aa6f015c16
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeMirror.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/transform/OrganizedImports.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java
diffstat 5 files changed, 76 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java	Mon Aug 25 16:30:40 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java	Mon Aug 25 20:59:56 2014 +0200
@@ -34,6 +34,7 @@
 import com.oracle.truffle.dsl.processor.*;
 import com.oracle.truffle.dsl.processor.java.model.*;
 import com.oracle.truffle.dsl.processor.java.model.CodeTypeMirror.DeclaredCodeTypeMirror;
+import com.oracle.truffle.dsl.processor.java.model.CodeTypeMirror.WildcardTypeMirror;
 
 /**
  * THIS IS NOT PUBLIC API.
@@ -1034,4 +1035,35 @@
         return actualType.getKind() == TypeKind.DECLARED && getQualifiedName(actualType).equals("java.lang.Object");
     }
 
+    public static TypeMirror fillInGenericWildcards(TypeMirror type) {
+        if (type.getKind() != TypeKind.DECLARED) {
+            return type;
+        }
+        DeclaredType declaredType = (DeclaredType) type;
+        TypeElement element = (TypeElement) declaredType.asElement();
+        if (element == null) {
+            return type;
+        }
+        int typeParameters = element.getTypeParameters().size();
+        if (typeParameters > 0 && declaredType.getTypeArguments().size() != typeParameters) {
+            List<TypeMirror> genericTypes = new ArrayList<>();
+            for (int i = 0; i < typeParameters; i++) {
+                genericTypes.add(new WildcardTypeMirror(null, null));
+            }
+            return new DeclaredCodeTypeMirror(element, genericTypes);
+        }
+        return type;
+    }
+
+    public static TypeMirror eraseGenericTypes(TypeMirror type) {
+        if (type.getKind() != TypeKind.DECLARED) {
+            return type;
+        }
+        DeclaredType declaredType = (DeclaredType) type;
+        if (declaredType.getTypeArguments().size() == 0) {
+            return type;
+        }
+        return new DeclaredCodeTypeMirror((TypeElement) declaredType.asElement());
+    }
+
 }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java	Mon Aug 25 16:30:40 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java	Mon Aug 25 20:59:56 2014 +0200
@@ -592,7 +592,7 @@
     }
 
     public CodeTreeBuilder typeLiteral(TypeMirror type) {
-        return startGroup().type(type).string(".class").end();
+        return startGroup().type(ElementUtils.eraseGenericTypes(type)).string(".class").end();
     }
 
     private void assertRoot() {
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeMirror.java	Mon Aug 25 16:30:40 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeMirror.java	Mon Aug 25 20:59:56 2014 +0200
@@ -46,6 +46,27 @@
         throw new UnsupportedOperationException();
     }
 
+    public static class WildcardTypeMirror extends CodeTypeMirror implements WildcardType {
+
+        private final TypeMirror extendsBounds;
+        private final TypeMirror superBounds;
+
+        public WildcardTypeMirror(TypeMirror extendsBounds, TypeMirror superBounds) {
+            super(TypeKind.WILDCARD);
+            this.extendsBounds = extendsBounds;
+            this.superBounds = superBounds;
+        }
+
+        public TypeMirror getExtendsBound() {
+            return extendsBounds;
+        }
+
+        public TypeMirror getSuperBound() {
+            return superBounds;
+        }
+
+    }
+
     public static class ArrayCodeTypeMirror extends CodeTypeMirror implements ArrayType {
 
         private final TypeMirror component;
@@ -65,13 +86,13 @@
     public static class DeclaredCodeTypeMirror extends CodeTypeMirror implements DeclaredType {
 
         private final TypeElement clazz;
-        private final List<? extends TypeMirror> typeArguments;
+        private final List<TypeMirror> typeArguments;
 
         public DeclaredCodeTypeMirror(TypeElement clazz) {
             this(clazz, Collections.<TypeMirror> emptyList());
         }
 
-        public DeclaredCodeTypeMirror(TypeElement clazz, List<? extends TypeMirror> typeArguments) {
+        public DeclaredCodeTypeMirror(TypeElement clazz, List<TypeMirror> typeArguments) {
             super(TypeKind.DECLARED);
             this.clazz = clazz;
             this.typeArguments = typeArguments;
@@ -88,7 +109,7 @@
         }
 
         @Override
-        public List<? extends TypeMirror> getTypeArguments() {
+        public List<TypeMirror> getTypeArguments() {
             return typeArguments;
         }
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/transform/OrganizedImports.java	Mon Aug 25 16:30:40 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/transform/OrganizedImports.java	Mon Aug 25 20:59:56 2014 +0200
@@ -107,6 +107,8 @@
             b.append("? extends ").append(createTypeReference(enclosedElement, type.getExtendsBound()));
         } else if (type.getSuperBound() != null) {
             b.append("? super ").append(createTypeReference(enclosedElement, type.getExtendsBound()));
+        } else {
+            b.append("?");
         }
         return b.toString();
     }
@@ -122,18 +124,23 @@
             }
         }
 
-        if (type.getTypeArguments().size() == 0) {
+        List<? extends TypeMirror> genericTypes = type.getTypeArguments();
+        if (genericTypes.size() == 0) {
             return name;
         }
 
         StringBuilder b = new StringBuilder(name);
         b.append("<");
-        if (type.getTypeArguments().size() > 0) {
-            for (int i = 0; i < type.getTypeArguments().size(); i++) {
-                b.append(createTypeReference(enclosedElement, type.getTypeArguments().get(i)));
-                if (i < type.getTypeArguments().size() - 1) {
-                    b.append(", ");
-                }
+        for (int i = 0; i < genericTypes.size(); i++) {
+            TypeMirror genericType = i < genericTypes.size() ? genericTypes.get(i) : null;
+            if (genericType != null) {
+                b.append(createTypeReference(enclosedElement, genericType));
+            } else {
+                b.append("?");
+            }
+
+            if (i < genericTypes.size() - 1) {
+                b.append(", ");
             }
         }
         b.append(">");
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Mon Aug 25 16:30:40 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Mon Aug 25 20:59:56 2014 +0200
@@ -183,10 +183,12 @@
 
         int index = 0;
         for (TypeMirror primitiveType : typeMirrors) {
-            TypeMirror boxedType = ElementUtils.boxType(context, primitiveType);
-            TypeData typeData = new TypeData(typeSystem, index, annotationValue, primitiveType, boxedType);
+            TypeMirror primitive = ElementUtils.fillInGenericWildcards(primitiveType);
 
-            if (isPrimitiveWrapper(primitiveType)) {
+            TypeMirror boxedType = ElementUtils.boxType(context, primitive);
+            TypeData typeData = new TypeData(typeSystem, index, annotationValue, primitive, boxedType);
+
+            if (isPrimitiveWrapper(primitive)) {
                 typeData.addError("Types must not contain primitive wrapper types.");
             }