comparison truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeElement.java @ 21951:9c8c0937da41

Moving all sources into truffle subdirectory
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Wed, 17 Jun 2015 10:58:08 +0200
parents graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeElement.java@ae81dd154fb6
children dc83cc1f94f2
comparison
equal deleted inserted replaced
21950:2a5011c7e641 21951:9c8c0937da41
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 || super.getEnclosingElement() == null;
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 public 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 List<ExecutableElement> getMethods() {
177 return ElementFilter.methodsIn(getEnclosedElements());
178 }
179
180 public List<TypeElement> getInnerClasses() {
181 return ElementFilter.typesIn(getEnclosedElements());
182 }
183
184 @Override
185 public String toString() {
186 return getQualifiedName().toString();
187 }
188
189 @Override
190 public <R, P> R accept(ElementVisitor<R, P> v, P p) {
191 return v.visitType(this, p);
192 }
193
194 }