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<<b>?</b>> c) { ... }</code> 44 * <br/><code>boolean addAll(Collection<<b>? extends E</b>> c)</code> 45 * <br/><code>Reference(T referent, ReferenceQueue<<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