comparison 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
comparison
equal deleted inserted replaced
22065:503529c65456 22066:78c3d3d8d86e
91 } 91 }
92 if (e.getEnclosingElement().getKind() != ElementKind.PACKAGE && !e.getModifiers().contains(Modifier.STATIC)) { 92 if (e.getEnclosingElement().getKind() != ElementKind.PACKAGE && !e.getModifiers().contains(Modifier.STATIC)) {
93 emitError("Registered language inner-class must be static", e); 93 emitError("Registered language inner-class must be static", e);
94 continue; 94 continue;
95 } 95 }
96 TypeMirror truffleLang = processingEnv.getElementUtils().getTypeElement(TruffleLanguage.class.getName()).asType(); 96 TypeMirror truffleLang = processingEnv.getTypeUtils().erasure(processingEnv.getElementUtils().getTypeElement(TruffleLanguage.class.getName()).asType());
97 if (!processingEnv.getTypeUtils().isAssignable(e.asType(), truffleLang)) { 97 if (!processingEnv.getTypeUtils().isAssignable(e.asType(), truffleLang)) {
98 emitError("Registered language class must subclass TruffleLanguage", e); 98 emitError("Registered language class must subclass TruffleLanguage", e);
99 continue; 99 continue;
100 } 100 }
101 boolean found = false; 101 boolean found = false;
102 for (Element mem : e.getEnclosedElements()) { 102 for (Element mem : e.getEnclosedElements()) {
103 if (mem.getKind() != ElementKind.CONSTRUCTOR) { 103 if (!mem.getModifiers().contains(Modifier.PUBLIC)) {
104 continue; 104 continue;
105 } 105 }
106 ExecutableElement ee = (ExecutableElement) mem; 106 if (mem.getKind() != ElementKind.FIELD) {
107 if (ee.getParameters().size() != 1) {
108 continue; 107 continue;
109 } 108 }
110 if (!ee.getModifiers().contains(Modifier.PUBLIC)) { 109 if (!mem.getModifiers().contains(Modifier.FINAL)) {
111 continue; 110 continue;
112 } 111 }
113 TypeMirror env = processingEnv.getElementUtils().getTypeElement(TruffleLanguage.Env.class.getCanonicalName()).asType(); 112 if (!"INSTANCE".equals(mem.getSimpleName().toString())) {
114 if (processingEnv.getTypeUtils().isSameType(ee.getParameters().get(0).asType(), env)) { 113 continue;
114 }
115 if (processingEnv.getTypeUtils().isAssignable(mem.asType(), truffleLang)) {
115 found = true; 116 found = true;
116 break; 117 break;
117 } 118 }
118 } 119 }
119 if (!found) { 120 if (!found) {
120 emitError("Language must have a public constructor accepting TruffleLanguage.Env as parameter", e); 121 emitError("Language class must have public static final singleton field called INSTANCE", e);
121 continue; 122 continue;
122 } 123 }
123 assertNoErrorExpected(e); 124 assertNoErrorExpected(e);
124 registrations.add((TypeElement) e); 125 registrations.add((TypeElement) e);
125 } 126 }