• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
3  * Copyright (C) 2011, 2013-2016 The JavaParser Team.
4  *
5  * This file is part of JavaParser.
6  *
7  * JavaParser can be used either under the terms of
8  * a) the GNU Lesser General Public License as published by
9  *     the Free Software Foundation, either version 3 of the License, or
10  *     (at your option) any later version.
11  * b) the terms of the Apache License
12  *
13  * You should have received a copy of both licenses in LICENCE.LGPL and
14  * LICENCE.APACHE. Please refer to those files for details.
15  *
16  * JavaParser is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU Lesser General Public License for more details.
20  */
21 package com.github.javaparser.ast.type;
22 
23 import com.github.javaparser.ast.AllFieldsConstructor;
24 import com.github.javaparser.ast.Node;
25 import com.github.javaparser.ast.NodeList;
26 import com.github.javaparser.ast.expr.AnnotationExpr;
27 import com.github.javaparser.ast.observer.ObservableProperty;
28 import com.github.javaparser.ast.visitor.CloneVisitor;
29 import com.github.javaparser.metamodel.JavaParserMetaModel;
30 import com.github.javaparser.metamodel.TypeMetaModel;
31 import static com.github.javaparser.utils.Utils.assertNotNull;
32 import com.github.javaparser.TokenRange;
33 import com.github.javaparser.resolution.Resolvable;
34 import com.github.javaparser.resolution.types.ResolvedType;
35 import com.github.javaparser.ast.Generated;
36 import java.util.function.Consumer;
37 import static com.github.javaparser.utils.CodeGenerationUtils.f;
38 import java.util.Optional;
39 
40 /**
41  * Base class for types.
42  *
43  * @author Julio Vilmar Gesser
44  */
45 public abstract class Type extends Node implements Resolvable<ResolvedType> {
46 
47     private NodeList<AnnotationExpr> annotations;
48 
49     /**
50      * Several sub classes do not support annotations.
51      * This is a support constructor for them.
52      */
Type(TokenRange range)53     protected Type(TokenRange range) {
54         this(range, new NodeList<>());
55     }
56 
57     @AllFieldsConstructor
Type(NodeList<AnnotationExpr> annotations)58     public Type(NodeList<AnnotationExpr> annotations) {
59         this(null, annotations);
60     }
61 
62     /**
63      * This constructor is used by the parser and is considered private.
64      */
65     @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
Type(TokenRange tokenRange, NodeList<AnnotationExpr> annotations)66     public Type(TokenRange tokenRange, NodeList<AnnotationExpr> annotations) {
67         super(tokenRange);
68         setAnnotations(annotations);
69         customInitialization();
70     }
71 
72     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
getAnnotations()73     public NodeList<AnnotationExpr> getAnnotations() {
74         return annotations;
75     }
76 
getAnnotation(int i)77     public AnnotationExpr getAnnotation(int i) {
78         return getAnnotations().get(i);
79     }
80 
81     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
setAnnotations(final NodeList<AnnotationExpr> annotations)82     public Type setAnnotations(final NodeList<AnnotationExpr> annotations) {
83         assertNotNull(annotations);
84         if (annotations == this.annotations) {
85             return (Type) this;
86         }
87         notifyPropertyChange(ObservableProperty.ANNOTATIONS, this.annotations, annotations);
88         if (this.annotations != null)
89             this.annotations.setParentNode(null);
90         this.annotations = annotations;
91         setAsParentNodeOf(annotations);
92         return this;
93     }
94 
95     /**
96      * Finds the element type, meaning: the type without ArrayTypes around it.
97      * <p>
98      * In "<code>int[] a[];</code>", the element type is int.
99      */
getElementType()100     public Type getElementType() {
101         if (this instanceof ArrayType) {
102             return ((ArrayType) this).getComponentType().getElementType();
103         }
104         return this;
105     }
106 
getArrayLevel()107     public int getArrayLevel() {
108         if (this instanceof ArrayType) {
109             return 1 + ((ArrayType) this).getComponentType().getArrayLevel();
110         } else {
111             return 0;
112         }
113     }
114 
115     @Override
116     @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
remove(Node node)117     public boolean remove(Node node) {
118         if (node == null)
119             return false;
120         for (int i = 0; i < annotations.size(); i++) {
121             if (annotations.get(i) == node) {
122                 annotations.remove(i);
123                 return true;
124             }
125         }
126         return super.remove(node);
127     }
128 
asString()129     public abstract String asString();
130 
131     @Override
132     @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
clone()133     public Type clone() {
134         return (Type) accept(new CloneVisitor(), null);
135     }
136 
137     @Override
138     @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
getMetaModel()139     public TypeMetaModel getMetaModel() {
140         return JavaParserMetaModel.typeMetaModel;
141     }
142 
143     @Override
144     @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
replace(Node node, Node replacementNode)145     public boolean replace(Node node, Node replacementNode) {
146         if (node == null)
147             return false;
148         for (int i = 0; i < annotations.size(); i++) {
149             if (annotations.get(i) == node) {
150                 annotations.set(i, (AnnotationExpr) replacementNode);
151                 return true;
152             }
153         }
154         return super.replace(node, replacementNode);
155     }
156 
157     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isArrayType()158     public boolean isArrayType() {
159         return false;
160     }
161 
162     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asArrayType()163     public ArrayType asArrayType() {
164         throw new IllegalStateException(f("%s is not an ArrayType", this));
165     }
166 
167     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isClassOrInterfaceType()168     public boolean isClassOrInterfaceType() {
169         return false;
170     }
171 
172     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asClassOrInterfaceType()173     public ClassOrInterfaceType asClassOrInterfaceType() {
174         throw new IllegalStateException(f("%s is not an ClassOrInterfaceType", this));
175     }
176 
177     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isIntersectionType()178     public boolean isIntersectionType() {
179         return false;
180     }
181 
182     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asIntersectionType()183     public IntersectionType asIntersectionType() {
184         throw new IllegalStateException(f("%s is not an IntersectionType", this));
185     }
186 
187     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isPrimitiveType()188     public boolean isPrimitiveType() {
189         return false;
190     }
191 
192     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asPrimitiveType()193     public PrimitiveType asPrimitiveType() {
194         throw new IllegalStateException(f("%s is not an PrimitiveType", this));
195     }
196 
197     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isReferenceType()198     public boolean isReferenceType() {
199         return false;
200     }
201 
202     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asReferenceType()203     public ReferenceType asReferenceType() {
204         throw new IllegalStateException(f("%s is not an ReferenceType", this));
205     }
206 
207     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isTypeParameter()208     public boolean isTypeParameter() {
209         return false;
210     }
211 
212     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asTypeParameter()213     public TypeParameter asTypeParameter() {
214         throw new IllegalStateException(f("%s is not an TypeParameter", this));
215     }
216 
217     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isUnionType()218     public boolean isUnionType() {
219         return false;
220     }
221 
222     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asUnionType()223     public UnionType asUnionType() {
224         throw new IllegalStateException(f("%s is not an UnionType", this));
225     }
226 
227     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isUnknownType()228     public boolean isUnknownType() {
229         return false;
230     }
231 
232     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asUnknownType()233     public UnknownType asUnknownType() {
234         throw new IllegalStateException(f("%s is not an UnknownType", this));
235     }
236 
237     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isVoidType()238     public boolean isVoidType() {
239         return false;
240     }
241 
242     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asVoidType()243     public VoidType asVoidType() {
244         throw new IllegalStateException(f("%s is not an VoidType", this));
245     }
246 
247     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isWildcardType()248     public boolean isWildcardType() {
249         return false;
250     }
251 
252     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asWildcardType()253     public WildcardType asWildcardType() {
254         throw new IllegalStateException(f("%s is not an WildcardType", this));
255     }
256 
257     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifArrayType(Consumer<ArrayType> action)258     public void ifArrayType(Consumer<ArrayType> action) {
259     }
260 
261     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifClassOrInterfaceType(Consumer<ClassOrInterfaceType> action)262     public void ifClassOrInterfaceType(Consumer<ClassOrInterfaceType> action) {
263     }
264 
265     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifIntersectionType(Consumer<IntersectionType> action)266     public void ifIntersectionType(Consumer<IntersectionType> action) {
267     }
268 
269     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifPrimitiveType(Consumer<PrimitiveType> action)270     public void ifPrimitiveType(Consumer<PrimitiveType> action) {
271     }
272 
273     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifReferenceType(Consumer<ReferenceType> action)274     public void ifReferenceType(Consumer<ReferenceType> action) {
275     }
276 
277     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifTypeParameter(Consumer<TypeParameter> action)278     public void ifTypeParameter(Consumer<TypeParameter> action) {
279     }
280 
281     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifUnionType(Consumer<UnionType> action)282     public void ifUnionType(Consumer<UnionType> action) {
283     }
284 
285     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifUnknownType(Consumer<UnknownType> action)286     public void ifUnknownType(Consumer<UnknownType> action) {
287     }
288 
289     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifVoidType(Consumer<VoidType> action)290     public void ifVoidType(Consumer<VoidType> action) {
291     }
292 
293     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifWildcardType(Consumer<WildcardType> action)294     public void ifWildcardType(Consumer<WildcardType> action) {
295     }
296 
297     @Override
resolve()298     public abstract ResolvedType resolve();
299 
300     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toArrayType()301     public Optional<ArrayType> toArrayType() {
302         return Optional.empty();
303     }
304 
305     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toClassOrInterfaceType()306     public Optional<ClassOrInterfaceType> toClassOrInterfaceType() {
307         return Optional.empty();
308     }
309 
310     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toIntersectionType()311     public Optional<IntersectionType> toIntersectionType() {
312         return Optional.empty();
313     }
314 
315     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toPrimitiveType()316     public Optional<PrimitiveType> toPrimitiveType() {
317         return Optional.empty();
318     }
319 
320     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toReferenceType()321     public Optional<ReferenceType> toReferenceType() {
322         return Optional.empty();
323     }
324 
325     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toTypeParameter()326     public Optional<TypeParameter> toTypeParameter() {
327         return Optional.empty();
328     }
329 
330     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toUnionType()331     public Optional<UnionType> toUnionType() {
332         return Optional.empty();
333     }
334 
335     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toUnknownType()336     public Optional<UnknownType> toUnknownType() {
337         return Optional.empty();
338     }
339 
340     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toVoidType()341     public Optional<VoidType> toVoidType() {
342         return Optional.empty();
343     }
344 
345     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toWildcardType()346     public Optional<WildcardType> toWildcardType() {
347         return Optional.empty();
348     }
349 
350     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isVarType()351     public boolean isVarType() {
352         return false;
353     }
354 
355     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asVarType()356     public VarType asVarType() {
357         throw new IllegalStateException(f("%s is not an VarType", this));
358     }
359 
360     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toVarType()361     public Optional<VarType> toVarType() {
362         return Optional.empty();
363     }
364 
365     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifVarType(Consumer<VarType> action)366     public void ifVarType(Consumer<VarType> action) {
367     }
368 }
369