blob: c3f8cedab139a5233638d776999afde9ebb76eec [file] [log] [blame]
Nicholas Smith0bf897c2014-10-01 10:31:08 +01001/*
Didier Villevaloisb8ac3562015-03-09 15:11:11 +01002 * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
matozoid6a40f1d2016-07-18 13:00:08 +02003 * Copyright (C) 2011, 2013-2016 The JavaParser Team.
Nicholas Smith0bf897c2014-10-01 10:31:08 +01004 *
Didier Villevaloisb8ac3562015-03-09 15:11:11 +01005 * This file is part of JavaParser.
Federico Tomassetti76f5dc92016-12-18 10:36:12 +01006 *
Federico Tomassettiedc1e4c2015-07-25 15:05:25 +02007 * 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.
Federico Tomassetti76f5dc92016-12-18 10:36:12 +010011 * b) the terms of the Apache License
Didier Villevaloisb8ac3562015-03-09 15:11:11 +010012 *
Federico Tomassettiedc1e4c2015-07-25 15:05:25 +020013 * You should have received a copy of both licenses in LICENCE.LGPL and
14 * LICENCE.APACHE. Please refer to those files for details.
Nicholas Smith0bf897c2014-10-01 10:31:08 +010015 *
Didier Villevaloisb8ac3562015-03-09 15:11:11 +010016 * JavaParser is distributed in the hope that it will be useful,
Nicholas Smith0bf897c2014-10-01 10:31:08 +010017 * 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.
Nicholas Smith0bf897c2014-10-01 10:31:08 +010020 */
Danny van Bruggen95245a52016-09-30 13:57:32 +020021package com.github.javaparser.ast.type;
Nicholas Smith0bf897c2014-10-01 10:31:08 +010022
matozoidb8a29552016-07-12 22:21:55 +020023import com.github.javaparser.Range;
Danny van Bruggen04c097f2017-01-28 00:17:30 +010024import com.github.javaparser.ast.AllFieldsConstructor;
Danny van Bruggen515a9392016-10-16 21:56:09 +020025import com.github.javaparser.ast.NodeList;
Nicholas Smithdf6c84c2014-12-10 14:37:45 +000026import com.github.javaparser.ast.expr.AnnotationExpr;
Danny van Bruggen02b3c5e2016-11-10 10:33:44 +010027import com.github.javaparser.ast.expr.SimpleName;
Danny van Bruggen807a3122017-01-18 19:59:30 +010028import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
Danny van Bruggen02b3c5e2016-11-10 10:33:44 +010029import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName;
Danny van Bruggen0f8bbe62016-12-13 15:41:45 +010030import com.github.javaparser.ast.observer.ObservableProperty;
Nicholas Smithdf6c84c2014-12-10 14:37:45 +000031import com.github.javaparser.ast.visitor.GenericVisitor;
32import com.github.javaparser.ast.visitor.VoidVisitor;
Danny van Bruggen515a9392016-10-16 21:56:09 +020033import static com.github.javaparser.utils.Utils.assertNotNull;
Danny van Bruggen7cd83c22017-04-14 15:43:20 +020034import static java.util.stream.Collectors.joining;
Danny van Bruggen01f005b2017-02-07 16:33:56 +010035import com.github.javaparser.ast.Node;
Danny van Bruggend92096b2017-02-08 15:44:39 +010036import com.github.javaparser.ast.visitor.CloneVisitor;
Danny van Bruggen083a2e12017-02-10 14:43:02 +010037import com.github.javaparser.metamodel.TypeParameterMetaModel;
38import com.github.javaparser.metamodel.JavaParserMetaModel;
Danny van Bruggen4e845ed2017-04-23 00:14:48 +020039import javax.annotation.Generated;
Danny van Bruggen4f564982017-05-18 22:36:35 +020040import com.github.javaparser.TokenRange;
Federico Tomassettibe673bc2017-09-27 11:58:32 +020041import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
Federico Tomassettifdfe1f62017-10-01 18:30:16 +020042import com.github.javaparser.resolution.types.ResolvedTypeVariable;
Danny van Bruggen54abb202017-09-21 20:59:14 +020043import java.util.function.Consumer;
Danny van Bruggenec67c242017-12-08 22:33:51 +010044import java.util.Optional;
j0ach1mmall3498d5ad2016-09-28 12:46:37 +020045
Nicholas Smith0bf897c2014-10-01 10:31:08 +010046/**
Danny van Bruggen15c2aa02016-12-21 23:36:21 +010047 * A type parameter.
48 * <br/><code>&lt;<b>U</b>> U getU() { ... }</code>
49 * <br/><code>class D &lt;<b>@Brain T extends B & A & @Tripe C</b>> { ... }</code>
50 * <p>U and T are type parameter names.
51 * <br/>B, A, and C are type parameter bounds.
52 * <br/>Tripe is an annotation on type parameter bound C.
53 * <br/>Brain is an annotation on type parameter T.
Danny van Bruggen4296abb2016-12-05 19:47:51 +010054 *
Nicholas Smith0bf897c2014-10-01 10:31:08 +010055 * @author Julio Vilmar Gesser
Danny van Bruggen15c2aa02016-12-21 23:36:21 +010056 * @see com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters
Nicholas Smith0bf897c2014-10-01 10:31:08 +010057 */
Danny van Bruggen33115b32017-10-11 19:38:31 +020058public final class TypeParameter extends ReferenceType implements NodeWithSimpleName<TypeParameter>, NodeWithAnnotations<TypeParameter> {
Nicholas Smith0bf897c2014-10-01 10:31:08 +010059
Danny van Bruggen4296abb2016-12-05 19:47:51 +010060 private SimpleName name;
Nicholas Smith0bf897c2014-10-01 10:31:08 +010061
Danny van Bruggen4296abb2016-12-05 19:47:51 +010062 private NodeList<ClassOrInterfaceType> typeBound;
Nicholas Smith0bf897c2014-10-01 10:31:08 +010063
Danny van Bruggen4296abb2016-12-05 19:47:51 +010064 public TypeParameter() {
Danny van Bruggen5adafb02017-01-28 18:42:52 +010065 this(null, new SimpleName(), new NodeList<>(), new NodeList<>());
Danny van Bruggen4296abb2016-12-05 19:47:51 +010066 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +010067
Danny van Bruggen8c6c0572016-12-16 22:08:55 +010068 public TypeParameter(final String name) {
Danny van Bruggen5adafb02017-01-28 18:42:52 +010069 this(null, new SimpleName(name), new NodeList<>(), new NodeList<>());
Danny van Bruggen8c6c0572016-12-16 22:08:55 +010070 }
71
Danny van Bruggen4296abb2016-12-05 19:47:51 +010072 public TypeParameter(final String name, final NodeList<ClassOrInterfaceType> typeBound) {
Danny van Bruggen5adafb02017-01-28 18:42:52 +010073 this(null, new SimpleName(name), typeBound, new NodeList<>());
Danny van Bruggen4296abb2016-12-05 19:47:51 +010074 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +010075
Danny van Bruggen4f564982017-05-18 22:36:35 +020076 /**
77 * @deprecated range shouldn't be in utility constructors.
78 */
79 @Deprecated
Danny van Bruggen4296abb2016-12-05 19:47:51 +010080 public TypeParameter(Range range, final SimpleName name, final NodeList<ClassOrInterfaceType> typeBound) {
Danny van Bruggen4f564982017-05-18 22:36:35 +020081 this(null, name, typeBound, new NodeList<>());
82 setRange(range);
Danny van Bruggen4296abb2016-12-05 19:47:51 +010083 }
Danny van Bruggen515a9392016-10-16 21:56:09 +020084
Danny van Bruggen04c097f2017-01-28 00:17:30 +010085 @AllFieldsConstructor
86 public TypeParameter(SimpleName name, NodeList<ClassOrInterfaceType> typeBound, NodeList<AnnotationExpr> annotations) {
87 this(null, name, typeBound, annotations);
88 }
89
Danny van Bruggen07d556b2017-10-20 18:19:33 +020090 /**
91 * This constructor is used by the parser and is considered private.
92 */
Danny van Bruggen4e845ed2017-04-23 00:14:48 +020093 @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
Danny van Bruggen4f564982017-05-18 22:36:35 +020094 public TypeParameter(TokenRange tokenRange, SimpleName name, NodeList<ClassOrInterfaceType> typeBound, NodeList<AnnotationExpr> annotations) {
95 super(tokenRange, annotations);
Danny van Bruggen4296abb2016-12-05 19:47:51 +010096 setName(name);
97 setTypeBound(typeBound);
Danny van Bruggen4e845ed2017-04-23 00:14:48 +020098 customInitialization();
Danny van Bruggen4296abb2016-12-05 19:47:51 +010099 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100100
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100101 @Override
Danny van Bruggen179d3402017-10-17 20:55:14 +0200102 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100103 public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) {
104 return v.visit(this, arg);
105 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100106
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100107 @Override
Danny van Bruggen179d3402017-10-17 20:55:14 +0200108 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100109 public <A> void accept(final VoidVisitor<A> v, final A arg) {
110 v.visit(this, arg);
111 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100112
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100113 /**
114 * Return the name of the paramenter.
115 *
116 * @return the name of the paramenter
117 */
Danny van Bruggen21d256c2017-04-23 02:46:13 +0200118 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100119 public SimpleName getName() {
120 return name;
121 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100122
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100123 /**
124 * Return the list of {@link ClassOrInterfaceType} that this parameter
125 * extends. Return <code>null</code> null if there are no type.
126 *
127 * @return list of types that this paramente extends or <code>null</code>
128 */
Danny van Bruggen21d256c2017-04-23 02:46:13 +0200129 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100130 public NodeList<ClassOrInterfaceType> getTypeBound() {
Federico Tomassetti0429bcc2015-09-05 10:35:37 +0200131 return typeBound;
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100132 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100133
Danny van Bruggene4610d52017-04-23 02:41:07 +0200134 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
Danny van Bruggen02b3c5e2016-11-10 10:33:44 +0100135 public TypeParameter setName(final SimpleName name) {
Danny van Bruggen38f64582017-01-31 17:20:41 +0100136 assertNotNull(name);
Federico Tomassettiaa1fa252017-03-29 17:52:52 +0200137 if (name == this.name) {
138 return (TypeParameter) this;
139 }
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100140 notifyPropertyChange(ObservableProperty.NAME, this.name, name);
Danny van Bruggen0831b412017-01-31 19:42:51 +0100141 if (this.name != null)
142 this.name.setParentNode(null);
Danny van Bruggen38f64582017-01-31 17:20:41 +0100143 this.name = name;
Danny van Bruggen02b3c5e2016-11-10 10:33:44 +0100144 setAsParentNodeOf(name);
Maximilien CRUZdce5d3e2016-07-17 14:38:56 +0200145 return this;
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100146 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100147
Danny van Bruggene4610d52017-04-23 02:41:07 +0200148 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100149 public TypeParameter setTypeBound(final NodeList<ClassOrInterfaceType> typeBound) {
Danny van Bruggen38f64582017-01-31 17:20:41 +0100150 assertNotNull(typeBound);
Federico Tomassettiaa1fa252017-03-29 17:52:52 +0200151 if (typeBound == this.typeBound) {
152 return (TypeParameter) this;
153 }
Federico Tomassettidf29c712016-11-12 09:26:08 +0100154 notifyPropertyChange(ObservableProperty.TYPE_BOUND, this.typeBound, typeBound);
Danny van Bruggen0831b412017-01-31 19:42:51 +0100155 if (this.typeBound != null)
156 this.typeBound.setParentNode(null);
Danny van Bruggen38f64582017-01-31 17:20:41 +0100157 this.typeBound = typeBound;
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100158 setAsParentNodeOf(typeBound);
159 return this;
160 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100161
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100162 @Override
Danny van Bruggen515a9392016-10-16 21:56:09 +0200163 public TypeParameter setAnnotations(NodeList<AnnotationExpr> annotations) {
Danny van Bruggen807a3122017-01-18 19:59:30 +0100164 super.setAnnotations(annotations);
Danny van Bruggen4296abb2016-12-05 19:47:51 +0100165 return this;
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100166 }
Danny van Bruggen5adafb02017-01-28 18:42:52 +0100167
168 @Override
Danny van Bruggen3d837802017-04-23 03:02:06 +0200169 @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
Danny van Bruggen01f005b2017-02-07 16:33:56 +0100170 public boolean remove(Node node) {
171 if (node == null)
172 return false;
173 for (int i = 0; i < typeBound.size(); i++) {
174 if (typeBound.get(i) == node) {
175 typeBound.remove(i);
176 return true;
177 }
178 }
179 return super.remove(node);
180 }
Danny van Bruggend92096b2017-02-08 15:44:39 +0100181
182 @Override
Danny van Bruggenf9609252017-04-16 14:43:06 +0200183 public String asString() {
184 StringBuilder str = new StringBuilder(getNameAsString());
185 getTypeBound().ifNonEmpty(l -> str.append(l.stream().map(ClassOrInterfaceType::asString).collect(joining("&", " extends ", ""))));
186 return str.toString();
187 }
188
189 @Override
Danny van Bruggen2769f242017-04-23 00:40:44 +0200190 @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
Danny van Bruggend92096b2017-02-08 15:44:39 +0100191 public TypeParameter clone() {
192 return (TypeParameter) accept(new CloneVisitor(), null);
193 }
Danny van Bruggen083a2e12017-02-10 14:43:02 +0100194
Danny van Bruggen84b7ec82017-02-10 15:47:34 +0100195 @Override
Danny van Bruggen826d9692017-04-23 00:42:40 +0200196 @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
Danny van Bruggen083a2e12017-02-10 14:43:02 +0100197 public TypeParameterMetaModel getMetaModel() {
198 return JavaParserMetaModel.typeParameterMetaModel;
199 }
Danny van Bruggen81280be2017-06-25 21:44:20 +0200200
201 @Override
202 @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
203 public boolean replace(Node node, Node replacementNode) {
204 if (node == null)
205 return false;
Danny van Bruggen141963f2017-07-25 22:07:31 +0200206 if (node == name) {
207 setName((SimpleName) replacementNode);
208 return true;
209 }
Danny van Bruggen81280be2017-06-25 21:44:20 +0200210 for (int i = 0; i < typeBound.size(); i++) {
211 if (typeBound.get(i) == node) {
212 typeBound.set(i, (ClassOrInterfaceType) replacementNode);
213 return true;
214 }
215 }
216 return super.replace(node, replacementNode);
217 }
Danny van Bruggenad9d33b2017-09-20 22:14:59 +0200218
219 @Override
220 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
221 public boolean isTypeParameter() {
222 return true;
223 }
Danny van Bruggend7c0e702017-09-21 20:44:40 +0200224
225 @Override
226 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
227 public TypeParameter asTypeParameter() {
228 return this;
229 }
Danny van Bruggen54abb202017-09-21 20:59:14 +0200230
231 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
232 public void ifTypeParameter(Consumer<TypeParameter> action) {
233 action.accept(this);
234 }
Federico Tomassettibe673bc2017-09-27 11:58:32 +0200235
236 @Override
Federico Tomassettifdfe1f62017-10-01 18:30:16 +0200237 public ResolvedTypeVariable resolve() {
Federico Tomassettica2adb52017-10-16 22:09:48 -0400238 return getSymbolResolver().toResolvedType(this, ResolvedTypeVariable.class);
Federico Tomassettibe673bc2017-09-27 11:58:32 +0200239 }
Danny van Bruggenec67c242017-12-08 22:33:51 +0100240
241 @Override
Danny van Bruggena3a93db2017-12-12 21:26:08 +0100242 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
Danny van Bruggenec67c242017-12-08 22:33:51 +0100243 public Optional<TypeParameter> toTypeParameter() {
244 return Optional.of(this);
245 }
Nicholas Smith0bf897c2014-10-01 10:31:08 +0100246}