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) {