Mercurial > hg > graal-jvmci-8
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java @ 16832:13cf9b6b325c
Truffle-DSL: implemented import guards feature.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Thu, 14 Aug 2014 16:49:18 +0200 |
parents | c3c07046a74b |
children | 21e0ab3c1395 |
comparison
equal
deleted
inserted
replaced
16830:c3c07046a74b | 16832:13cf9b6b325c |
---|---|
123 | 123 |
124 parsedNodes.put(typeName, node); | 124 parsedNodes.put(typeName, node); |
125 return node; | 125 return node; |
126 } | 126 } |
127 | 127 |
128 @SuppressWarnings("unchecked") | |
128 private NodeData parseNode(TypeElement originalTemplateType) { | 129 private NodeData parseNode(TypeElement originalTemplateType) { |
129 // reloading the type elements is needed for ecj | 130 // reloading the type elements is needed for ecj |
130 TypeElement templateType = ElementUtils.fromTypeMirror(context.reloadTypeElement(originalTemplateType)); | 131 TypeElement templateType = ElementUtils.fromTypeMirror(context.reloadTypeElement(originalTemplateType)); |
131 | 132 |
132 if (ElementUtils.findAnnotationMirror(processingEnv, originalTemplateType, GeneratedBy.class) != null) { | 133 if (ElementUtils.findAnnotationMirror(processingEnv, originalTemplateType, GeneratedBy.class) != null) { |
139 return null; | 140 return null; |
140 } | 141 } |
141 List<? extends Element> elements = CompilerFactory.getCompiler(templateType).getAllMembersInDeclarationOrder(context.getEnvironment(), templateType); | 142 List<? extends Element> elements = CompilerFactory.getCompiler(templateType).getAllMembersInDeclarationOrder(context.getEnvironment(), templateType); |
142 | 143 |
143 NodeData node = parseNodeData(templateType, elements, lookupTypes); | 144 NodeData node = parseNodeData(templateType, elements, lookupTypes); |
145 | |
146 parseImportGuards(node, lookupTypes, (List<Element>) elements); | |
147 | |
144 if (node.hasErrors()) { | 148 if (node.hasErrors()) { |
145 return node; // error sync point | 149 return node; // error sync point |
146 } | 150 } |
147 | 151 |
148 node.setExecutableTypes(groupExecutableTypes(new ExecutableTypeMethodParser(context, node).parse(elements))); | 152 node.setExecutableTypes(groupExecutableTypes(new ExecutableTypeMethodParser(context, node).parse(elements))); |
165 verifyMissingAbstractMethods(node, elements); | 169 verifyMissingAbstractMethods(node, elements); |
166 verifyConstructors(node); | 170 verifyConstructors(node); |
167 verifyNamingConvention(node.getShortCircuits(), "needs"); | 171 verifyNamingConvention(node.getShortCircuits(), "needs"); |
168 verifySpecializationThrows(node); | 172 verifySpecializationThrows(node); |
169 return node; | 173 return node; |
174 } | |
175 | |
176 private void parseImportGuards(NodeData node, List<TypeElement> lookupTypes, List<Element> elements) { | |
177 for (TypeElement lookupType : lookupTypes) { | |
178 AnnotationMirror importAnnotation = ElementUtils.findAnnotationMirror(processingEnv, lookupType, ImportGuards.class); | |
179 if (importAnnotation == null) { | |
180 continue; | |
181 } | |
182 AnnotationValue importClassesValue = ElementUtils.getAnnotationValue(importAnnotation, "value"); | |
183 List<TypeMirror> importClasses = ElementUtils.getAnnotationValueList(TypeMirror.class, importAnnotation, "value"); | |
184 if (importClasses.isEmpty()) { | |
185 node.addError(importAnnotation, importClassesValue, "At least import guard classes must be specified."); | |
186 continue; | |
187 } | |
188 for (TypeMirror importGuardClass : importClasses) { | |
189 if (importGuardClass.getKind() != TypeKind.DECLARED) { | |
190 node.addError(importAnnotation, importClassesValue, "The specified import guard class '%s' is not a declared type.", ElementUtils.getQualifiedName(importGuardClass)); | |
191 continue; | |
192 } | |
193 TypeElement typeElement = ElementUtils.fromTypeMirror(importGuardClass); | |
194 if (!typeElement.getModifiers().contains(Modifier.PUBLIC)) { | |
195 node.addError(importAnnotation, importClassesValue, "The specified import guard class '%s' must be public.", ElementUtils.getQualifiedName(importGuardClass)); | |
196 continue; | |
197 } | |
198 | |
199 List<? extends ExecutableElement> importMethods = ElementFilter.methodsIn(processingEnv.getElementUtils().getAllMembers(typeElement)); | |
200 for (ExecutableElement importMethod : importMethods) { | |
201 if (!importMethod.getModifiers().contains(Modifier.PUBLIC) || !importMethod.getModifiers().contains(Modifier.STATIC)) { | |
202 continue; | |
203 } | |
204 elements.add(importMethod); | |
205 } | |
206 } | |
207 } | |
170 } | 208 } |
171 | 209 |
172 private NodeData parseNodeData(TypeElement templateType, List<? extends Element> elements, List<TypeElement> typeHierarchy) { | 210 private NodeData parseNodeData(TypeElement templateType, List<? extends Element> elements, List<TypeElement> typeHierarchy) { |
173 AnnotationMirror typeSystemMirror = findFirstAnnotation(typeHierarchy, TypeSystemReference.class); | 211 AnnotationMirror typeSystemMirror = findFirstAnnotation(typeHierarchy, TypeSystemReference.class); |
174 if (typeSystemMirror == null) { | 212 if (typeSystemMirror == null) { |