• 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.nodeTypes.NodeWithAnnotations;
28 import com.github.javaparser.ast.observer.ObservableProperty;
29 import com.github.javaparser.ast.visitor.CloneVisitor;
30 import com.github.javaparser.ast.visitor.GenericVisitor;
31 import com.github.javaparser.ast.visitor.VoidVisitor;
32 import com.github.javaparser.metamodel.JavaParserMetaModel;
33 import com.github.javaparser.metamodel.OptionalProperty;
34 import com.github.javaparser.metamodel.WildcardTypeMetaModel;
35 import java.util.Optional;
36 import com.github.javaparser.TokenRange;
37 import com.github.javaparser.resolution.types.ResolvedWildcard;
38 import com.github.javaparser.ast.Generated;
39 import java.util.function.Consumer;
40 
41 /**
42  * A wildcard type argument.
43  * <br/><code>void printCollection(Collection&lt;<b>?</b>> c) { ... }</code>
44  * <br/><code>boolean addAll(Collection&lt;<b>? extends E</b>> c)</code>
45  * <br/><code>Reference(T referent, ReferenceQueue&lt;<b>? super T</b>> queue)</code>
46  *
47  * @author Julio Vilmar Gesser
48  */
49 public class WildcardType extends Type implements NodeWithAnnotations<WildcardType> {
50 
51     @OptionalProperty
52     private ReferenceType extendedType;
53 
54     @OptionalProperty
55     private ReferenceType superType;
56 
WildcardType()57     public WildcardType() {
58         this(null, null, null, new NodeList<>());
59     }
60 
WildcardType(final ReferenceType extendedType)61     public WildcardType(final ReferenceType extendedType) {
62         this(null, extendedType, null, new NodeList<>());
63     }
64 
65     @AllFieldsConstructor
WildcardType(final ReferenceType extendedType, final ReferenceType superType, final NodeList<AnnotationExpr> annotations)66     public WildcardType(final ReferenceType extendedType, final ReferenceType superType, final NodeList<AnnotationExpr> annotations) {
67         this(null, extendedType, superType, annotations);
68     }
69 
70     /**
71      * This constructor is used by the parser and is considered private.
72      */
73     @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
WildcardType(TokenRange tokenRange, ReferenceType extendedType, ReferenceType superType, NodeList<AnnotationExpr> annotations)74     public WildcardType(TokenRange tokenRange, ReferenceType extendedType, ReferenceType superType, NodeList<AnnotationExpr> annotations) {
75         super(tokenRange, annotations);
76         setExtendedType(extendedType);
77         setSuperType(superType);
78         customInitialization();
79     }
80 
81     @Override
82     @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
accept(final GenericVisitor<R, A> v, final A arg)83     public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) {
84         return v.visit(this, arg);
85     }
86 
87     @Override
88     @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
accept(final VoidVisitor<A> v, final A arg)89     public <A> void accept(final VoidVisitor<A> v, final A arg) {
90         v.visit(this, arg);
91     }
92 
93     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
getExtendedType()94     public Optional<ReferenceType> getExtendedType() {
95         return Optional.ofNullable(extendedType);
96     }
97 
98     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
getSuperType()99     public Optional<ReferenceType> getSuperType() {
100         return Optional.ofNullable(superType);
101     }
102 
103     /**
104      * Sets the extended type
105      *
106      * @param extendedType the extends, can be null
107      * @return this, the WildcardType
108      */
109     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
setExtendedType(final ReferenceType extendedType)110     public WildcardType setExtendedType(final ReferenceType extendedType) {
111         if (extendedType == this.extendedType) {
112             return (WildcardType) this;
113         }
114         notifyPropertyChange(ObservableProperty.EXTENDED_TYPE, this.extendedType, extendedType);
115         if (this.extendedType != null)
116             this.extendedType.setParentNode(null);
117         this.extendedType = extendedType;
118         setAsParentNodeOf(extendedType);
119         return this;
120     }
121 
122     /**
123      * Sets the supertype
124      *
125      * @param superType the super, can be null
126      * @return this, the WildcardType
127      */
128     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
setSuperType(final ReferenceType superType)129     public WildcardType setSuperType(final ReferenceType superType) {
130         if (superType == this.superType) {
131             return (WildcardType) this;
132         }
133         notifyPropertyChange(ObservableProperty.SUPER_TYPE, this.superType, superType);
134         if (this.superType != null)
135             this.superType.setParentNode(null);
136         this.superType = superType;
137         setAsParentNodeOf(superType);
138         return this;
139     }
140 
141     @Override
setAnnotations(NodeList<AnnotationExpr> annotations)142     public WildcardType setAnnotations(NodeList<AnnotationExpr> annotations) {
143         return (WildcardType) super.setAnnotations(annotations);
144     }
145 
146     @Override
147     @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
remove(Node node)148     public boolean remove(Node node) {
149         if (node == null)
150             return false;
151         if (extendedType != null) {
152             if (node == extendedType) {
153                 removeExtendedType();
154                 return true;
155             }
156         }
157         if (superType != null) {
158             if (node == superType) {
159                 removeSuperType();
160                 return true;
161             }
162         }
163         return super.remove(node);
164     }
165 
166     @Override
asString()167     public String asString() {
168         StringBuilder str = new StringBuilder("?");
169         getExtendedType().ifPresent(t -> str.append(" extends ").append(t.asString()));
170         getSuperType().ifPresent(t -> str.append(" super ").append(t.asString()));
171         return str.toString();
172     }
173 
174     @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
removeExtendedType()175     public WildcardType removeExtendedType() {
176         return setExtendedType((ReferenceType) null);
177     }
178 
179     @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
removeSuperType()180     public WildcardType removeSuperType() {
181         return setSuperType((ReferenceType) null);
182     }
183 
184     @Override
185     @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
clone()186     public WildcardType clone() {
187         return (WildcardType) accept(new CloneVisitor(), null);
188     }
189 
190     @Override
191     @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
getMetaModel()192     public WildcardTypeMetaModel getMetaModel() {
193         return JavaParserMetaModel.wildcardTypeMetaModel;
194     }
195 
196     @Override
197     @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
replace(Node node, Node replacementNode)198     public boolean replace(Node node, Node replacementNode) {
199         if (node == null)
200             return false;
201         if (extendedType != null) {
202             if (node == extendedType) {
203                 setExtendedType((ReferenceType) replacementNode);
204                 return true;
205             }
206         }
207         if (superType != null) {
208             if (node == superType) {
209                 setSuperType((ReferenceType) replacementNode);
210                 return true;
211             }
212         }
213         return super.replace(node, replacementNode);
214     }
215 
216     /**
217      * This constructor is used by the parser and is considered private.
218      */
219     @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
WildcardType(TokenRange tokenRange, ReferenceType extendedType, ReferenceType superType)220     public WildcardType(TokenRange tokenRange, ReferenceType extendedType, ReferenceType superType) {
221         super(tokenRange);
222         setExtendedType(extendedType);
223         setSuperType(superType);
224         customInitialization();
225     }
226 
227     @Override
228     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
isWildcardType()229     public boolean isWildcardType() {
230         return true;
231     }
232 
233     @Override
234     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
asWildcardType()235     public WildcardType asWildcardType() {
236         return this;
237     }
238 
239     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
ifWildcardType(Consumer<WildcardType> action)240     public void ifWildcardType(Consumer<WildcardType> action) {
241         action.accept(this);
242     }
243 
244     @Override
resolve()245     public ResolvedWildcard resolve() {
246         return getSymbolResolver().toResolvedType(this, ResolvedWildcard.class);
247     }
248 
249     @Override
250     @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
toWildcardType()251     public Optional<WildcardType> toWildcardType() {
252         return Optional.of(this);
253     }
254 }
255