comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/AnnotationProcessor.java @ 16759:23415229349b

Truffle-DSL: new package structure.
author Christian Humer <christian.humer@gmail.com>
date Mon, 11 Aug 2014 15:57:14 +0200
parents bd28da642eea
children 45c8f64978d6
comparison
equal deleted inserted replaced
16758:c5f8eeb3cbc8 16759:23415229349b
28 import javax.annotation.processing.*; 28 import javax.annotation.processing.*;
29 import javax.lang.model.element.*; 29 import javax.lang.model.element.*;
30 import javax.lang.model.type.*; 30 import javax.lang.model.type.*;
31 import javax.tools.*; 31 import javax.tools.*;
32 32
33 import com.oracle.truffle.dsl.processor.ast.*; 33 import com.oracle.truffle.dsl.processor.generator.*;
34 import com.oracle.truffle.dsl.processor.codewriter.*; 34 import com.oracle.truffle.dsl.processor.java.*;
35 import com.oracle.truffle.dsl.processor.compiler.*; 35 import com.oracle.truffle.dsl.processor.java.compiler.*;
36 import com.oracle.truffle.dsl.processor.node.*; 36 import com.oracle.truffle.dsl.processor.java.model.*;
37 import com.oracle.truffle.dsl.processor.template.*; 37 import com.oracle.truffle.dsl.processor.java.transform.*;
38 import com.oracle.truffle.dsl.processor.model.*;
39 import com.oracle.truffle.dsl.processor.parser.*;
38 40
39 /** 41 /**
40 * THIS IS NOT PUBLIC API. 42 * THIS IS NOT PUBLIC API.
41 */ 43 */
42 class AnnotationProcessor<M extends Template> { 44 class AnnotationProcessor<M extends Template> {
43 45
44 private final AbstractParser<M> parser; 46 private final AbstractParser<M> parser;
45 private final CompilationUnitFactory<M> factory; 47 private final AbstractCompilationUnitFactory<M> factory;
46 48
47 private final Set<String> processedElements = new HashSet<>(); 49 private final Set<String> processedElements = new HashSet<>();
48 50
49 public AnnotationProcessor(AbstractParser<M> parser, CompilationUnitFactory<M> factory) { 51 public AnnotationProcessor(AbstractParser<M> parser, AbstractCompilationUnitFactory<M> factory) {
50 this.parser = parser; 52 this.parser = parser;
51 this.factory = factory; 53 this.factory = factory;
52 } 54 }
53 55
54 public AbstractParser<M> getParser() { 56 public AbstractParser<M> getParser() {
55 return parser; 57 return parser;
56 } 58 }
57 59
58 @SuppressWarnings({"unchecked"}) 60 @SuppressWarnings({"unchecked"})
59 public void process(RoundEnvironment env, Element element, boolean callback) { 61 public void process(Element element, boolean callback) {
60 // since it is not guaranteed to be called only once by the compiler 62 // since it is not guaranteed to be called only once by the compiler
61 // we check for already processed elements to avoid errors when writing files. 63 // we check for already processed elements to avoid errors when writing files.
62 if (!callback && element instanceof TypeElement) { 64 if (!callback && element instanceof TypeElement) {
63 String qualifiedName = Utils.getQualifiedName((TypeElement) element); 65 String qualifiedName = ElementUtils.getQualifiedName((TypeElement) element);
64 if (processedElements.contains(qualifiedName)) { 66 if (processedElements.contains(qualifiedName)) {
65 return; 67 return;
66 } 68 }
67 processedElements.add(qualifiedName); 69 processedElements.add(qualifiedName);
68 } 70 }
73 M model = (M) context.getTemplate(type.asType(), false); 75 M model = (M) context.getTemplate(type.asType(), false);
74 boolean firstRun = !context.containsTemplate(type); 76 boolean firstRun = !context.containsTemplate(type);
75 77
76 if (firstRun || !callback) { 78 if (firstRun || !callback) {
77 context.registerTemplate(type, null); 79 context.registerTemplate(type, null);
78 model = parser.parse(env, element); 80 model = parser.parse(element);
79 context.registerTemplate(type, model); 81 context.registerTemplate(type, model);
80 82
81 if (model != null) { 83 if (model != null) {
82 CodeCompilationUnit unit = factory.process(null, model); 84 CodeCompilationUnit unit = factory.process(null, model);
83 patchGeneratedTypes(unit);
84 unit.setGeneratorAnnotationMirror(model.getTemplateTypeAnnotation()); 85 unit.setGeneratorAnnotationMirror(model.getTemplateTypeAnnotation());
85 unit.setGeneratorElement(model.getTemplateType()); 86 unit.setGeneratorElement(model.getTemplateType());
86 87
87 DeclaredType overrideType = (DeclaredType) context.getType(Override.class); 88 DeclaredType overrideType = (DeclaredType) context.getType(Override.class);
88 DeclaredType unusedType = (DeclaredType) context.getType(SuppressWarnings.class); 89 DeclaredType unusedType = (DeclaredType) context.getType(SuppressWarnings.class);
92 if (!callback) { 93 if (!callback) {
93 unit.accept(new CodeWriter(context.getEnvironment(), element), null); 94 unit.accept(new CodeWriter(context.getEnvironment(), element), null);
94 } 95 }
95 } 96 }
96 } 97 }
97 }
98
99 private static void patchGeneratedTypes(CodeCompilationUnit unit) {
100 final Map<String, CodeTypeElement> classes = new HashMap<>();
101
102 unit.accept(new CodeElementScanner<Void, Void>() {
103 @Override
104 public Void visitType(CodeTypeElement e, Void p) {
105 classes.put(e.getSimpleName().toString(), e);
106 return super.visitType(e, p);
107 }
108
109 }, null);
110
111 unit.accept(new CodeElementScanner<Void, Void>() {
112 @Override
113 public Void visitExecutable(CodeExecutableElement e, Void p) {
114 if (e.getReturnType() instanceof GeneratedTypeMirror) {
115 e.setReturnType(patchType(e.getReturnType()));
116 }
117 for (VariableElement element : e.getParameters()) {
118 if (element instanceof CodeVariableElement) {
119 CodeVariableElement var = ((CodeVariableElement) element);
120 if (var.getType() instanceof GeneratedTypeMirror) {
121 var.setType(patchType(var.getType()));
122 }
123 }
124 }
125 return super.visitExecutable(e, p);
126 }
127
128 @Override
129 public void visitTree(CodeTree e, Void p) {
130 if (e.getType() instanceof GeneratedTypeMirror) {
131 e.setType(patchType(e.asType()));
132 }
133 }
134
135 private TypeMirror patchType(TypeMirror typeMirror) {
136 assert typeMirror instanceof GeneratedTypeMirror;
137 GeneratedTypeMirror type = (GeneratedTypeMirror) typeMirror;
138 CodeTypeElement generatedType = classes.get(Utils.fromTypeMirror(type).getSimpleName().toString());
139 if (generatedType == null) {
140 return type;
141 }
142 return generatedType.asType();
143 }
144 }, null);
145
146 } 98 }
147 99
148 private static class CodeWriter extends AbstractCodeWriter { 100 private static class CodeWriter extends AbstractCodeWriter {
149 101
150 private final Element originalElement; 102 private final Element originalElement;