Mercurial > hg > truffle
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 } |