comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeElement.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 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTypeElement.java@0cd0bdedd4ad
children 224a89858453
comparison
equal deleted inserted replaced
16758:c5f8eeb3cbc8 16759:23415229349b
1 /*
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package com.oracle.truffle.dsl.processor.java.model;
24
25 import java.util.*;
26
27 import javax.lang.model.element.*;
28 import javax.lang.model.type.*;
29 import javax.lang.model.util.*;
30
31 import com.oracle.truffle.dsl.processor.java.model.CodeTypeMirror.DeclaredCodeTypeMirror;
32
33 public class CodeTypeElement extends CodeElement<Element> implements TypeElement {
34
35 private final List<? extends CodeImport> imports = parentableList(this, new ArrayList<CodeImport>());
36
37 private final PackageElement packageElement;
38
39 private final Name simpleName;
40 private final Name packageName;
41 private Name qualifiedName;
42
43 private final List<TypeMirror> implementsInterfaces = new ArrayList<>();
44 private final ElementKind kind;
45 private TypeMirror superClass;
46
47 private final DeclaredCodeTypeMirror mirror = new DeclaredCodeTypeMirror(this);
48
49 public CodeTypeElement(Set<Modifier> modifiers, ElementKind kind, PackageElement packageElement, String simpleName) {
50 super(modifiers);
51 this.kind = kind;
52 this.packageElement = packageElement;
53 this.simpleName = CodeNames.of(simpleName);
54 if (this.packageElement != null) {
55 this.packageName = packageElement.getQualifiedName();
56 } else {
57 this.packageName = CodeNames.of("default");
58 }
59 this.qualifiedName = createQualifiedName();
60 }
61
62 @Override
63 public TypeMirror asType() {
64 return mirror;
65 }
66
67 @Override
68 public ElementKind getKind() {
69 return kind;
70 }
71
72 public boolean containsField(String name) {
73 for (VariableElement field : getFields()) {
74 if (field.getSimpleName().toString().equals(name)) {
75 return true;
76 }
77 }
78 return false;
79 }
80
81 @Override
82 public NestingKind getNestingKind() {
83 return isTopLevelClass() ? NestingKind.TOP_LEVEL : NestingKind.LOCAL;
84 }
85
86 @Override
87 public Element getEnclosingElement() {
88 if (isTopLevelClass()) {
89 return packageElement;
90 } else {
91 return super.getEnclosingElement();
92 }
93 }
94
95 @Override
96 public TypeMirror getSuperclass() {
97 return superClass;
98 }
99
100 @Override
101 public List<TypeMirror> getInterfaces() {
102 return implementsInterfaces;
103 }
104
105 @Override
106 public List<? extends TypeParameterElement> getTypeParameters() {
107 return Collections.emptyList();
108 }
109
110 public boolean isTopLevelClass() {
111 return super.getEnclosingElement() instanceof CodeCompilationUnit;
112 }
113
114 private Name createQualifiedName() {
115 TypeElement enclosingType = getEnclosingClass();
116 if (enclosingType == null) {
117 return CodeNames.of(packageName + "." + simpleName);
118 } else {
119 return CodeNames.of(enclosingType.getQualifiedName() + "." + simpleName);
120 }
121 }
122
123 @Override
124 protected void setEnclosingElement(Element element) {
125 super.setEnclosingElement(element);
126
127 // update qualified name on container change
128 this.qualifiedName = createQualifiedName();
129 }
130
131 public Name getPackageName() {
132 return packageName;
133 }
134
135 @Override
136 public Name getQualifiedName() {
137 return qualifiedName;
138 }
139
140 @Override
141 public Name getSimpleName() {
142 return simpleName;
143 }
144
145 public void setSuperClass(TypeMirror superType) {
146 this.superClass = superType;
147 }
148
149 public List<? extends CodeImport> getImports() {
150 return imports;
151 }
152
153 public List<TypeMirror> getImplements() {
154 return implementsInterfaces;
155 }
156
157 @Override
158 public int hashCode() {
159 return getQualifiedName().hashCode();
160 }
161
162 @Override
163 public boolean equals(Object obj) {
164 if (obj == this) {
165 return true;
166 } else if (obj instanceof TypeElement) {
167 return getQualifiedName().equals(((TypeElement) obj).getQualifiedName());
168 }
169 return false;
170 }
171
172 public List<VariableElement> getFields() {
173 return ElementFilter.fieldsIn(getEnclosedElements());
174 }
175
176 public ExecutableElement getMethod(String name) {
177 for (Element element : getEnclosedElements()) {
178 if (element.getKind() == ElementKind.METHOD && element.getSimpleName().toString().equals(name)) {
179 return (ExecutableElement) element;
180 }
181 }
182 return null;
183 }
184
185 public List<ExecutableElement> getMethods() {
186 return ElementFilter.methodsIn(getEnclosedElements());
187 }
188
189 public List<TypeElement> getInnerClasses() {
190 return ElementFilter.typesIn(getEnclosedElements());
191 }
192
193 @Override
194 public String toString() {
195 return getQualifiedName().toString();
196 }
197
198 @Override
199 public <R, P> R accept(ElementVisitor<R, P> v, P p) {
200 return v.visitType(this, p);
201 }
202
203 }