KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > compiler > apt > model > TypeElementImpl


1 /*******************************************************************************
2  * Copyright (c) 2005, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.compiler.apt.model;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.Collections JavaDoc;
15 import java.util.List JavaDoc;
16 import java.util.Set JavaDoc;
17
18 import javax.lang.model.element.Element;
19 import javax.lang.model.element.ElementKind;
20 import javax.lang.model.element.ElementVisitor;
21 import javax.lang.model.element.ExecutableElement;
22 import javax.lang.model.element.Modifier;
23 import javax.lang.model.element.Name;
24 import javax.lang.model.element.NestingKind;
25 import javax.lang.model.element.PackageElement;
26 import javax.lang.model.element.TypeElement;
27 import javax.lang.model.element.TypeParameterElement;
28 import javax.lang.model.element.VariableElement;
29 import javax.lang.model.type.TypeKind;
30 import javax.lang.model.type.TypeMirror;
31
32 import org.eclipse.jdt.core.compiler.CharOperation;
33 import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl;
34 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
35 import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
36 import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
37 import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
38 import org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
39 import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
40 import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
41
42 public class TypeElementImpl extends ElementImpl implements TypeElement {
43     
44     /**
45      * In general, clients should call {@link Factory#newDeclaredType(ReferenceBinding)} or
46      * {@link Factory#newElement(org.eclipse.jdt.internal.compiler.lookup.Binding)} to
47      * create new instances.
48      */

49     TypeElementImpl(BaseProcessingEnvImpl env, ReferenceBinding binding) {
50         super(env, binding);
51     }
52     
53     @Override JavaDoc
54     public <R, P> R accept(ElementVisitor<R, P> v, P p)
55     {
56         return v.visitType(this, p);
57     }
58
59     @Override JavaDoc
60     protected AnnotationBinding[] getAnnotationBindings()
61     {
62         return ((ReferenceBinding)_binding).getAnnotations();
63     }
64
65     @Override JavaDoc
66     public List JavaDoc<? extends Element> getEnclosedElements() {
67         ReferenceBinding binding = (ReferenceBinding)_binding;
68         List JavaDoc<Element> enclosed = new ArrayList JavaDoc<Element>(binding.fieldCount() + binding.methods().length);
69         for (MethodBinding method : binding.methods()) {
70             ExecutableElement executable = new ExecutableElementImpl(_env, method);
71             enclosed.add(executable);
72         }
73         for (FieldBinding field : binding.fields()) {
74             // TODO no field should be excluded according to the JLS
75
if (!field.isSynthetic()) {
76                  VariableElement variable = new VariableElementImpl(_env, field);
77                  enclosed.add(variable);
78             }
79         }
80         for (ReferenceBinding memberType : binding.memberTypes()) {
81             TypeElement type = new TypeElementImpl(_env, memberType);
82             enclosed.add(type);
83         }
84         return Collections.unmodifiableList(enclosed);
85     }
86
87     @Override JavaDoc
88     public Element getEnclosingElement() {
89         ReferenceBinding binding = (ReferenceBinding)_binding;
90         ReferenceBinding enclosingType = binding.enclosingType();
91         if (null == enclosingType) {
92             // this is a top level type; get its package
93
return _env.getFactory().newPackageElement(binding.fPackage);
94         }
95         else {
96             return _env.getFactory().newElement(binding.enclosingType());
97         }
98     }
99
100     @Override JavaDoc
101     public String JavaDoc getFileName() {
102         char[] name = ((ReferenceBinding)_binding).getFileName();
103         if (name == null)
104             return null;
105         return new String JavaDoc(name);
106     }
107     
108     @Override JavaDoc
109     public List JavaDoc<? extends TypeMirror> getInterfaces() {
110         ReferenceBinding binding = (ReferenceBinding)_binding;
111         if (null == binding.superInterfaces() || binding.superInterfaces().length == 0) {
112             return Collections.emptyList();
113         }
114         List JavaDoc<TypeMirror> interfaces = new ArrayList JavaDoc<TypeMirror>(binding.superInterfaces().length);
115         for (ReferenceBinding interfaceBinding : binding.superInterfaces()) {
116             TypeMirror interfaceType = _env.getFactory().newTypeMirror(interfaceBinding);
117             interfaces.add(interfaceType);
118         }
119         return Collections.unmodifiableList(interfaces);
120     }
121
122     @Override JavaDoc
123     public ElementKind getKind() {
124         ReferenceBinding refBinding = (ReferenceBinding)_binding;
125         // The order of these comparisons is important: e.g., enum is subset of class
126
if (refBinding.isEnum()) {
127             return ElementKind.ENUM;
128         }
129         else if (refBinding.isAnnotationType()) {
130             return ElementKind.ANNOTATION_TYPE;
131         }
132         else if (refBinding.isInterface()) {
133             return ElementKind.INTERFACE;
134         }
135         else if (refBinding.isClass()) {
136             return ElementKind.CLASS;
137         }
138         else {
139             throw new IllegalArgumentException JavaDoc("TypeElement " + new String JavaDoc(refBinding.shortReadableName()) + //$NON-NLS-1$
140
" has unexpected attributes " + refBinding.modifiers); //$NON-NLS-1$
141
}
142     }
143
144     @Override JavaDoc
145     public Set JavaDoc<Modifier> getModifiers()
146     {
147         ReferenceBinding refBinding = (ReferenceBinding)_binding;
148         int modifiers = refBinding.modifiers;
149         if (refBinding.isInterface() && refBinding.isNestedType()) {
150             modifiers |= ClassFileConstants.AccStatic;
151         }
152         return Factory.getModifiers(modifiers, getKind(), refBinding.isBinaryBinding());
153     }
154
155     @Override JavaDoc
156     public NestingKind getNestingKind() {
157         ReferenceBinding refBinding = (ReferenceBinding)_binding;
158         if (refBinding.isAnonymousType()) {
159             return NestingKind.ANONYMOUS;
160         } else if (refBinding.isLocalType()) {
161             return NestingKind.LOCAL;
162         } else if (refBinding.isMemberType()) {
163             return NestingKind.MEMBER;
164         }
165         return NestingKind.TOP_LEVEL;
166     }
167
168     @Override JavaDoc
169     PackageElement getPackage()
170     {
171         ReferenceBinding binding = (ReferenceBinding)_binding;
172         return _env.getFactory().newPackageElement((PackageBinding)binding.fPackage);
173     }
174
175     @Override JavaDoc
176     public Name getQualifiedName() {
177         ReferenceBinding binding = (ReferenceBinding)_binding;
178         char[] qName;
179         if (binding.isMemberType()) {
180             qName = CharOperation.concatWith(binding.enclosingType().compoundName, binding.sourceName, '.');
181             CharOperation.replace(qName, '$', '.');
182         } else {
183             qName = CharOperation.concatWith(binding.compoundName, '.');
184         }
185         return new NameImpl(qName);
186     }
187
188     /*
189      * (non-Javadoc)
190      * @see org.eclipse.jdt.internal.compiler.apt.model.ElementImpl#getSimpleName()
191      * @return last segment of name, e.g. for pa.pb.X.Y return Y.
192      */

193     @Override JavaDoc
194     public Name getSimpleName()
195     {
196         ReferenceBinding binding = (ReferenceBinding)_binding;
197         return new NameImpl(binding.sourceName());
198     }
199
200     @Override JavaDoc
201     public TypeMirror getSuperclass() {
202         ReferenceBinding binding = (ReferenceBinding)_binding;
203         ReferenceBinding superBinding = binding.superclass();
204         if (null == superBinding || binding.isInterface()) {
205             return _env.getFactory().getNoType(TypeKind.NONE);
206         }
207         // superclass of a type must be a DeclaredType
208
return _env.getFactory().newDeclaredType(superBinding);
209     }
210     
211     @Override JavaDoc
212     public List JavaDoc<? extends TypeParameterElement> getTypeParameters() {
213         ReferenceBinding binding = (ReferenceBinding)_binding;
214         TypeVariableBinding[] variables = binding.typeVariables();
215         if (variables.length == 0) {
216             return Collections.emptyList();
217         }
218         List JavaDoc<TypeParameterElement> params = new ArrayList JavaDoc<TypeParameterElement>(variables.length);
219         for (TypeVariableBinding variable : variables) {
220             params.add(_env.getFactory().newTypeParameterElement(variable, this));
221         }
222         return Collections.unmodifiableList(params);
223     }
224
225     @Override JavaDoc
226     public boolean hides(Element hidden)
227     {
228         if (!(hidden instanceof TypeElementImpl)) {
229             return false;
230         }
231         ReferenceBinding hiddenBinding = (ReferenceBinding)((TypeElementImpl)hidden)._binding;
232         if (hiddenBinding.isPrivate()) {
233             return false;
234         }
235         ReferenceBinding hiderBinding = (ReferenceBinding)_binding;
236         if (hiddenBinding == hiderBinding) {
237             return false;
238         }
239         if (!hiddenBinding.isMemberType() || !hiderBinding.isMemberType()) {
240             return false;
241         }
242         if (!CharOperation.equals(hiddenBinding.sourceName, hiderBinding.sourceName)) {
243             return false;
244         }
245         return null != hiderBinding.enclosingType().findSuperTypeWithSameErasure(hiddenBinding.enclosingType());
246     }
247
248     @Override JavaDoc
249     public String JavaDoc toString() {
250         ReferenceBinding binding = (ReferenceBinding) this._binding;
251         char[] concatWith = CharOperation.concatWith(binding.compoundName, '.');
252         if (binding.isNestedType()) {
253             CharOperation.replace(concatWith, '$', '.');
254             return new String JavaDoc(concatWith);
255         }
256         return new String JavaDoc(concatWith);
257
258     }
259
260 }
261
Popular Tags