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;