Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/typesystem/TypeSystemParser.java @ 11545:2fb276f5e3e9
Truffle-DSL: implemented implicit casts.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Fri, 06 Sep 2013 16:16:40 +0200 |
parents | 43eab069ca9b |
children | e08a9328ce92 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/typesystem/TypeSystemParser.java Fri Sep 06 16:11:15 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/typesystem/TypeSystemParser.java Fri Sep 06 16:16:40 2013 +0200 @@ -71,7 +71,7 @@ } typeSystem.setTypes(parseTypes(typeSystem)); - if (typeSystem.getTypes() == null) { + if (typeSystem.hasErrors()) { return typeSystem; } @@ -91,6 +91,8 @@ if (casts == null || checks == null || implicitCasts == null) { return typeSystem; } + + typeSystem.setImplicitCasts(implicitCasts); typeSystem.setCasts(casts); typeSystem.setChecks(checks); @@ -106,6 +108,7 @@ cast.getTargetType().addTypeCast(cast); } + verifyImplicitCasts(typeSystem); verifyGenericTypeChecksAndCasts(typeSystem); verifyMethodSignatures(typeSystem); verifyNamesUnique(typeSystem); @@ -113,6 +116,24 @@ return typeSystem; } + private static void verifyImplicitCasts(TypeSystemData typeSystem) { + Set<TypeData> types = new HashSet<>(); + Set<TypeData> duplicateSourceTypes = new HashSet<>(); + for (ImplicitCastData cast : typeSystem.getImplicitCasts()) { + if (types.contains(cast.getSourceType())) { + duplicateSourceTypes.add(cast.getSourceType()); + } + types.add(cast.getSourceType()); + } + for (TypeData duplicateType : duplicateSourceTypes) { + for (ImplicitCastData cast : typeSystem.getImplicitCasts()) { + if (cast.getSourceType().equals(duplicateType)) { + cast.addError("Duplicate cast source type %s.", Utils.getSimpleName(duplicateType.getPrimitiveType()), ImplicitCast.class.getSimpleName()); + } + } + } + } + private static void verifyGenericTypeChecksAndCasts(TypeSystemData typeSystem) { for (TypeData type : typeSystem.getTypes()) { if (!type.getTypeChecks().isEmpty()) {