# HG changeset patch # User Christian Humer # Date 1420485802 -3600 # Node ID 7d67a33e1bbb1f1a93e698cda83a3ab961b6794f # Parent 3ea386a1036f0c1b04b7f4cee69c42c4aab9f422 Truffle-DSL: made type name verification more robust. Added some tests. (GRAAL-468 #resolve) diff -r 3ea386a1036f -r 7d67a33e1bbb graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemErrorsTest.java --- 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 { diff -r 3ea386a1036f -r 7d67a33e1bbb graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java --- 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 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 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); } } }