changeset 18783:7d67a33e1bbb

Truffle-DSL: made type name verification more robust. Added some tests. (GRAAL-468 #resolve)
author Christian Humer <christian.humer@gmail.com>
date Mon, 05 Jan 2015 20:23:22 +0100
parents 3ea386a1036f
children 3c7d543d758d
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemErrorsTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java
diffstat 2 files changed, 52 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemErrorsTest.java	Mon Jan 05 20:23:22 2015 +0100
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemErrorsTest.java	Mon Jan 05 20:23:22 2015 +0100
@@ -23,22 +23,62 @@
 package com.oracle.truffle.api.dsl.test;
 
 import com.oracle.truffle.api.dsl.*;
+import com.oracle.truffle.api.dsl.test.TypeSystemErrorsTest.Types1.Type1;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
 
 public class TypeSystemErrorsTest {
 
     @TypeSystem({int.class, boolean.class})
-    public static class Types0 {
+    public static class ErrorTypes0 {
 
     }
 
     @ExpectError("Invalid type order. The type(s) [java.lang.String] are inherited from a earlier defined type java.lang.CharSequence.")
     @TypeSystem({CharSequence.class, String.class})
+    public static class ErrorTypes1 {
+
+    }
+
     public static class Types1 {
+        public static class Type1 {
+        }
+    }
+
+    public static class Types2 {
+        public static class Type1 {
+        }
+    }
+
+    // verify boxed type overlay
+    @ExpectError("Two types result in the same boxed name: Type1.")
+    @TypeSystem({Type1.class, com.oracle.truffle.api.dsl.test.TypeSystemErrorsTest.Types2.Type1.class})
+    public static class ErrorTypes2 {
 
     }
 
-    @TypeSystemReference(Types0.class)
+    public static class Types3 {
+        public static class Object {
+        }
+    }
+
+    // verify Object name cannot appear
+    @ExpectError("Two types result in the same boxed name: Object.")
+    @TypeSystem({com.oracle.truffle.api.dsl.test.TypeSystemErrorsTest.Types3.Object.class})
+    public static class ErrorTypes3 {
+    }
+
+    public static class Types4 {
+        public static class Integer {
+        }
+    }
+
+    // verify int boxed name
+    @ExpectError("Two types result in the same boxed name: Integer.")
+    @TypeSystem({int.class, com.oracle.truffle.api.dsl.test.TypeSystemErrorsTest.Types4.Integer.class})
+    public static class ErrorTypes4 {
+    }
+
+    @TypeSystemReference(ErrorTypes0.class)
     @NodeChild
     @ExpectError("The @TypeSystem of the node and the @TypeSystem of the @NodeChild does not match. Types0 != SimpleTypes. ")
     abstract static class ErrorNode1 extends ValueNode {
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Mon Jan 05 20:23:22 2015 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Mon Jan 05 20:23:22 2015 +0100
@@ -280,15 +280,17 @@
     }
 
     private static void verifyNamesUnique(TypeSystemData typeSystem) {
-        List<TypeData> types = typeSystem.getTypes();
-        for (int i = 0; i < types.size(); i++) {
-            for (int j = i + 1; j < types.size(); j++) {
-                String name1 = ElementUtils.getSimpleName(types.get(i).getBoxedType());
-                String name2 = ElementUtils.getSimpleName(types.get(j).getBoxedType());
-                if (name1.equalsIgnoreCase(name2)) {
-                    typeSystem.addError("Two types result in the same name: %s, %s.", name1, name2);
-                }
+        Set<String> usedNames = new HashSet<>();
+        for (TypeData type : typeSystem.getTypes()) {
+            String boxedName = ElementUtils.getSimpleName(type.getBoxedType());
+            String primitiveName = ElementUtils.getSimpleName(type.getPrimitiveType());
+            if (usedNames.contains(boxedName)) {
+                typeSystem.addError("Two types result in the same boxed name: %s.", boxedName);
+            } else if (usedNames.contains(primitiveName)) {
+                typeSystem.addError("Two types result in the same primitive name: %s.", primitiveName);
             }
+            usedNames.add(boxedName);
+            usedNames.add(primitiveName);
         }
     }
 }