Mercurial > hg > graal-jvmci-8
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ProcessorContext.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 |
---|---|
20 * or visit www.oracle.com if you need additional information or have any | 20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. | 21 * questions. |
22 */ | 22 */ |
23 package com.oracle.truffle.dsl.processor; | 23 package com.oracle.truffle.dsl.processor; |
24 | 24 |
25 import static com.oracle.truffle.dsl.processor.Utils.*; | |
26 | |
27 import java.util.*; | 25 import java.util.*; |
28 | 26 |
29 import javax.annotation.processing.*; | 27 import javax.annotation.processing.*; |
30 import javax.lang.model.element.*; | 28 import javax.lang.model.element.*; |
31 import javax.lang.model.type.*; | 29 import javax.lang.model.type.*; |
32 import javax.lang.model.util.*; | 30 import javax.lang.model.util.*; |
33 | 31 |
34 import com.oracle.truffle.dsl.processor.ast.*; | 32 import com.oracle.truffle.dsl.processor.java.*; |
35 import com.oracle.truffle.dsl.processor.ast.CodeTypeMirror.ArrayCodeTypeMirror; | 33 import com.oracle.truffle.dsl.processor.java.model.*; |
36 import com.oracle.truffle.dsl.processor.template.*; | 34 import com.oracle.truffle.dsl.processor.model.*; |
37 | 35 |
38 /** | 36 /** |
39 * THIS IS NOT PUBLIC API. | 37 * THIS IS NOT PUBLIC API. |
40 */ | 38 */ |
41 public class ProcessorContext { | 39 public class ProcessorContext { |
42 | 40 |
43 private final ProcessingEnvironment environment; | 41 private final ProcessingEnvironment environment; |
44 | 42 |
45 private final Map<String, Template> models = new HashMap<>(); | 43 private final Map<String, Template> models = new HashMap<>(); |
46 private final Map<String, Map<String, TypeMirror>> generatedClasses = new HashMap<>(); | |
47 | 44 |
48 private final ProcessCallback callback; | 45 private final ProcessCallback callback; |
49 private final Log log; | 46 private final Log log; |
50 private final TruffleTypes truffleTypes; | 47 private final TruffleTypes truffleTypes; |
51 | 48 |
52 public ProcessorContext(ProcessingEnvironment env, ProcessCallback callback) { | 49 ProcessorContext(ProcessingEnvironment env, ProcessCallback callback) { |
53 this.environment = env; | 50 this.environment = env; |
54 this.callback = callback; | 51 this.callback = callback; |
55 this.log = new Log(environment); | 52 this.log = new Log(environment); |
56 this.truffleTypes = new TruffleTypes(this); | 53 this.truffleTypes = new TruffleTypes(this); |
57 } | 54 } |
67 public ProcessingEnvironment getEnvironment() { | 64 public ProcessingEnvironment getEnvironment() { |
68 return environment; | 65 return environment; |
69 } | 66 } |
70 | 67 |
71 public boolean containsTemplate(TypeElement element) { | 68 public boolean containsTemplate(TypeElement element) { |
72 return models.containsKey(Utils.getQualifiedName(element)); | 69 return models.containsKey(ElementUtils.getQualifiedName(element)); |
73 } | 70 } |
74 | 71 |
75 public void registerTemplate(TypeElement element, Template model) { | 72 public void registerTemplate(TypeElement element, Template model) { |
76 models.put(Utils.getQualifiedName(element), model); | 73 models.put(ElementUtils.getQualifiedName(element), model); |
77 } | |
78 | |
79 public void registerType(TypeElement templateType, TypeMirror generatedTypeMirror) { | |
80 String templateQualifiedName = getQualifiedName(templateType); | |
81 Map<String, TypeMirror> simpleNameToType = generatedClasses.get(templateQualifiedName); | |
82 if (simpleNameToType == null) { | |
83 simpleNameToType = new HashMap<>(); | |
84 generatedClasses.put(templateQualifiedName, simpleNameToType); | |
85 } | |
86 String generatedSimpleName = getSimpleName(generatedTypeMirror); | |
87 simpleNameToType.put(generatedSimpleName, generatedTypeMirror); | |
88 } | 74 } |
89 | 75 |
90 public Template getTemplate(TypeMirror templateTypeMirror, boolean invokeCallback) { | 76 public Template getTemplate(TypeMirror templateTypeMirror, boolean invokeCallback) { |
91 String qualifiedName = Utils.getQualifiedName(templateTypeMirror); | 77 String qualifiedName = ElementUtils.getQualifiedName(templateTypeMirror); |
92 Template model = models.get(qualifiedName); | 78 Template model = models.get(qualifiedName); |
93 if (model == null && invokeCallback) { | 79 if (model == null && invokeCallback) { |
94 callback.callback(Utils.fromTypeMirror(templateTypeMirror)); | 80 callback.callback(ElementUtils.fromTypeMirror(templateTypeMirror)); |
95 model = models.get(qualifiedName); | 81 model = models.get(qualifiedName); |
96 } | 82 } |
97 return model; | 83 return model; |
98 } | |
99 | |
100 public TypeMirror resolveNotYetCompiledType(TypeMirror mirror, Template templateHint) { | |
101 TypeMirror resolvedType = null; | |
102 if (mirror.getKind() == TypeKind.ARRAY) { | |
103 TypeMirror originalComponentType = ((ArrayType) mirror).getComponentType(); | |
104 TypeMirror resolvedComponent = resolveNotYetCompiledType(originalComponentType, templateHint); | |
105 if (resolvedComponent != originalComponentType) { | |
106 return new ArrayCodeTypeMirror(resolvedComponent); | |
107 } | |
108 } | |
109 | |
110 if (mirror.getKind() == TypeKind.ERROR) { | |
111 Element element = ((ErrorType) mirror).asElement(); | |
112 ElementKind kind = element.getKind(); | |
113 if (kind == ElementKind.CLASS || kind == ElementKind.PARAMETER || kind == ElementKind.ENUM) { | |
114 String simpleName = element.getSimpleName().toString(); | |
115 resolvedType = findGeneratedClassBySimpleName(simpleName, templateHint); | |
116 } | |
117 } else { | |
118 resolvedType = mirror; | |
119 } | |
120 | |
121 return resolvedType; | |
122 } | |
123 | |
124 public TypeMirror findGeneratedClassBySimpleName(String simpleName, Template templateHint) { | |
125 if (templateHint == null) { | |
126 // search all | |
127 for (String qualifiedTemplateName : generatedClasses.keySet()) { | |
128 Map<String, TypeMirror> mirrors = generatedClasses.get(qualifiedTemplateName); | |
129 if (mirrors.get(simpleName) != null) { | |
130 return mirrors.get(simpleName); | |
131 } | |
132 } | |
133 return null; | |
134 } else { | |
135 String templateQualifiedName = getQualifiedName(templateHint.getTemplateType()); | |
136 Map<String, TypeMirror> simpleNameToType = generatedClasses.get(templateQualifiedName); | |
137 if (simpleNameToType == null) { | |
138 return null; | |
139 } | |
140 return simpleNameToType.get(simpleName); | |
141 } | |
142 } | |
143 | |
144 public TypeMirror getType(String className) { | |
145 TypeElement element = environment.getElementUtils().getTypeElement(className); | |
146 if (element != null) { | |
147 return element.asType(); | |
148 } | |
149 return null; | |
150 } | 84 } |
151 | 85 |
152 public TypeMirror getType(Class<?> element) { | 86 public TypeMirror getType(Class<?> element) { |
153 TypeMirror mirror; | 87 TypeMirror mirror; |
154 if (element.isPrimitive()) { | 88 if (element.isPrimitive()) { |
189 | 123 |
190 public TypeMirror reloadTypeElement(TypeElement type) { | 124 public TypeMirror reloadTypeElement(TypeElement type) { |
191 return getType(type.getQualifiedName().toString()); | 125 return getType(type.getQualifiedName().toString()); |
192 } | 126 } |
193 | 127 |
128 private TypeMirror getType(String className) { | |
129 TypeElement element = environment.getElementUtils().getTypeElement(className); | |
130 if (element != null) { | |
131 return element.asType(); | |
132 } | |
133 return null; | |
134 } | |
135 | |
194 public TypeMirror reloadType(TypeMirror type) { | 136 public TypeMirror reloadType(TypeMirror type) { |
195 if (type instanceof CodeTypeMirror) { | 137 if (type instanceof CodeTypeMirror) { |
196 return type; | 138 return type; |
197 } else if (type.getKind().isPrimitive()) { | 139 } else if (type.getKind().isPrimitive()) { |
198 return type; | 140 return type; |