diff truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/LanguageRegistrationProcessor.java @ 22066:78c3d3d8d86e

Clearly separating the TruffleLanguage definition from context used during its execution. TruffleLanguage now has to have public static field INSTANCE and override createContext method.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Thu, 06 Aug 2015 08:31:49 +0200
parents f878f9778548
children dc83cc1f94f2
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/LanguageRegistrationProcessor.java	Wed Aug 05 10:19:41 2015 -0700
+++ b/truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/LanguageRegistrationProcessor.java	Thu Aug 06 08:31:49 2015 +0200
@@ -93,31 +93,32 @@
                     emitError("Registered language inner-class must be static", e);
                     continue;
                 }
-                TypeMirror truffleLang = processingEnv.getElementUtils().getTypeElement(TruffleLanguage.class.getName()).asType();
+                TypeMirror truffleLang = processingEnv.getTypeUtils().erasure(processingEnv.getElementUtils().getTypeElement(TruffleLanguage.class.getName()).asType());
                 if (!processingEnv.getTypeUtils().isAssignable(e.asType(), truffleLang)) {
                     emitError("Registered language class must subclass TruffleLanguage", e);
                     continue;
                 }
                 boolean found = false;
                 for (Element mem : e.getEnclosedElements()) {
-                    if (mem.getKind() != ElementKind.CONSTRUCTOR) {
+                    if (!mem.getModifiers().contains(Modifier.PUBLIC)) {
+                        continue;
+                    }
+                    if (mem.getKind() != ElementKind.FIELD) {
                         continue;
                     }
-                    ExecutableElement ee = (ExecutableElement) mem;
-                    if (ee.getParameters().size() != 1) {
+                    if (!mem.getModifiers().contains(Modifier.FINAL)) {
                         continue;
                     }
-                    if (!ee.getModifiers().contains(Modifier.PUBLIC)) {
+                    if (!"INSTANCE".equals(mem.getSimpleName().toString())) {
                         continue;
                     }
-                    TypeMirror env = processingEnv.getElementUtils().getTypeElement(TruffleLanguage.Env.class.getCanonicalName()).asType();
-                    if (processingEnv.getTypeUtils().isSameType(ee.getParameters().get(0).asType(), env)) {
+                    if (processingEnv.getTypeUtils().isAssignable(mem.asType(), truffleLang)) {
                         found = true;
                         break;
                     }
                 }
                 if (!found) {
-                    emitError("Language must have a public constructor accepting TruffleLanguage.Env as parameter", e);
+                    emitError("Language class must have public static final singleton field called INSTANCE", e);
                     continue;
                 }
                 assertNoErrorExpected(e);