JavaParser Source Viewer

Home|JavaParser/com/github/javaparser/ast/type/ArrayType.java
1/*
2 * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
3 * Copyright (C) 2011, 2013-2020 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 */
21package com.github.javaparser.ast.type;
22
23import com.github.javaparser.TokenRange;
24import com.github.javaparser.ast.AllFieldsConstructor;
25import com.github.javaparser.ast.Node;
26import com.github.javaparser.ast.NodeList;
27import com.github.javaparser.ast.expr.AnnotationExpr;
28import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
29import com.github.javaparser.ast.observer.ObservableProperty;
30import com.github.javaparser.ast.visitor.CloneVisitor;
31import com.github.javaparser.ast.visitor.GenericVisitor;
32import com.github.javaparser.ast.visitor.VoidVisitor;
33import com.github.javaparser.metamodel.ArrayTypeMetaModel;
34import com.github.javaparser.metamodel.JavaParserMetaModel;
35import com.github.javaparser.resolution.types.ResolvedArrayType;
36import com.github.javaparser.utils.Pair;
37import java.util.ArrayList;
38import java.util.List;
39import java.util.Optional;
40import static com.github.javaparser.ast.NodeList.nodeList;
41import static com.github.javaparser.utils.Utils.assertNotNull;
42import java.util.function.Consumer;
43import com.github.javaparser.ast.Generated;
44
45/**
46 * To indicate that a type is an array, it gets wrapped in an ArrayType for every array level it has.
47 * So, int[][] becomes ArrayType(ArrayType(int)).
48 */
49public class ArrayType extends ReferenceType implements NodeWithAnnotations<ArrayType> {
50
51    @Override
52    public ResolvedArrayType resolve() {
53        return getSymbolResolver().toResolvedType(this, ResolvedArrayType.class);
54    }
55
56    /**
57     * The origin of a pair of array brackets [].
58     */
59    public enum Origin {
60
61        /**
62         * The [] were found on the name, like "int a[]" or "String abc()[][]"
63         */
64        NAME,
65        /**
66         * The [] were found on the type, like "int[] a" or "String[][] abc()"
67         */
68        TYPE
69    }
70
71    private Type componentType;
72
73    private Origin origin;
74
75    @AllFieldsConstructor
76    public ArrayType(Type componentTypeOrigin originNodeList<AnnotationExprannotations) {
77        this(nullcomponentTypeoriginannotations);
78    }
79
80    public ArrayType(Type typeAnnotationExpr... annotations) {
81        this(typeOrigin.TYPEnodeList(annotations));
82    }
83
84    /**
85     * This constructor is used by the parser and is considered private.
86     */
87    @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
88    public ArrayType(TokenRange tokenRangeType componentTypeOrigin originNodeList<AnnotationExprannotations) {
89        super(tokenRangeannotations);
90        setComponentType(componentType);
91        setOrigin(origin);
92        customInitialization();
93    }
94
95    @Override
96    @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
97    public <RAR accept(final GenericVisitor<RAvfinal A arg) {
98        return v.visit(this, arg);
99    }
100
101    @Override
102    @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
103    public <Avoid accept(final VoidVisitor<Avfinal A arg) {
104        v.visit(this, arg);
105    }
106
107    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
108    public Type getComponentType() {
109        return componentType;
110    }
111
112    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
113    public ArrayType setComponentType(final Type componentType) {
114        assertNotNull(componentType);
115        if (componentType == this.componentType) {
116            return (ArrayType) this;
117        }
118        notifyPropertyChange(ObservableProperty.COMPONENT_TYPE, this.componentTypecomponentType);
119        if (this.componentType != null)
120            this.componentType.setParentNode(null);
121        this.componentType = componentType;
122        setAsParentNodeOf(componentType);
123        return this;
124    }
125
126    /**
127     * Takes lists of arrayBracketPairs, assumes the lists are ordered outer to inner and the pairs are ordered left to
128     * right. The type gets wrapped in ArrayTypes so that the outermost ArrayType corresponds to the leftmost
129     * ArrayBracketPair in the first list.
130     */
131    @SafeVarargs
132    public static Type wrapInArrayTypes(Type typeList<ArrayBracketPair>... arrayBracketPairLists) {
133        for (int i = arrayBracketPairLists.length - 1i >= 0i--) {
134            final List<ArrayBracketPairarrayBracketPairList = arrayBracketPairLists[i];
135            if (arrayBracketPairList != null) {
136                for (int j = arrayBracketPairList.size() - 1j >= 0j--) {
137                    ArrayBracketPair pair = arrayBracketPairList.get(j);
138                    TokenRange tokenRange = null;
139                    if (type.getTokenRange().isPresent() && pair.getTokenRange().isPresent()) {
140                        tokenRange = new TokenRange(type.getTokenRange().get().getBegin(), pair.getTokenRange().get().getEnd());
141                    }
142                    type = new ArrayType(tokenRangetypepair.getOrigin(), pair.getAnnotations());
143                    if (tokenRange != null) {
144                        type.setRange(tokenRange.toRange().get());
145                    }
146                }
147            }
148        }
149        return type;
150    }
151
152    /**
153     * Takes a type that may be an ArrayType. Unwraps ArrayTypes until the element type is found.
154     *
155     * @return a pair of the element type, and the unwrapped ArrayTypes, if any.
156     */
157    public static Pair<TypeList<ArrayBracketPair>> unwrapArrayTypes(Type type) {
158        final List<ArrayBracketPairarrayBracketPairs = new ArrayList<>(0);
159        while (type instanceof ArrayType) {
160            ArrayType arrayType = (ArrayTypetype;
161            arrayBracketPairs.add(new ArrayBracketPair(type.getTokenRange().orElse(null), arrayType.getOrigin(), arrayType.getAnnotations()));
162            type = arrayType.getComponentType();
163        }
164        return new Pair<>(typearrayBracketPairs);
165    }
166
167    /**
168     * Helper class that stores information about a pair of brackets in a non-recursive way
169     * (unlike ArrayType.)
170     */
171    public static class ArrayBracketPair {
172
173        private TokenRange tokenRange;
174
175        private NodeList<AnnotationExprannotations = new NodeList<>();
176
177        private Origin origin;
178
179        public ArrayBracketPair(TokenRange tokenRangeOrigin originNodeList<AnnotationExprannotations) {
180            setTokenRange(tokenRange);
181            setAnnotations(annotations);
182            setOrigin(origin);
183        }
184
185        public NodeList<AnnotationExprgetAnnotations() {
186            return annotations;
187        }
188
189        public ArrayBracketPair setAnnotations(NodeList<AnnotationExprannotations) {
190            this.annotations = assertNotNull(annotations);
191            return this;
192        }
193
194        public ArrayBracketPair setTokenRange(TokenRange range) {
195            this.tokenRange = range;
196            return this;
197        }
198
199        public Optional<TokenRangegetTokenRange() {
200            return Optional.ofNullable(tokenRange);
201        }
202
203        public Origin getOrigin() {
204            return origin;
205        }
206
207        public ArrayBracketPair setOrigin(Origin origin) {
208            this.origin = assertNotNull(origin);
209            return this;
210        }
211    }
212
213    @Override
214    public ArrayType setAnnotations(NodeList<AnnotationExprannotations) {
215        return (ArrayType) super.setAnnotations(annotations);
216    }
217
218    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
219    public Origin getOrigin() {
220        return origin;
221    }
222
223    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
224    public ArrayType setOrigin(final Origin origin) {
225        assertNotNull(origin);
226        if (origin == this.origin) {
227            return (ArrayType) this;
228        }
229        notifyPropertyChange(ObservableProperty.ORIGIN, this.originorigin);
230        this.origin = origin;
231        return this;
232    }
233
234    @Override
235    @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
236    public boolean remove(Node node) {
237        if (node == null)
238            return false;
239        return super.remove(node);
240    }
241
242    @Override
243    public String asString() {
244        return componentType.asString() + "[]";
245    }
246
247    @Override
248    @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
249    public ArrayType clone() {
250        return (ArrayTypeaccept(new CloneVisitor(), null);
251    }
252
253    @Override
254    @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
255    public ArrayTypeMetaModel getMetaModel() {
256        return JavaParserMetaModel.arrayTypeMetaModel;
257    }
258
259    @Override
260    @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
261    public boolean replace(Node nodeNode replacementNode) {
262        if (node == null)
263            return false;
264        if (node == componentType) {
265            setComponentType((TypereplacementNode);
266            return true;
267        }
268        return super.replace(nodereplacementNode);
269    }
270
271    @Override
272    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
273    public boolean isArrayType() {
274        return true;
275    }
276
277    @Override
278    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
279    public ArrayType asArrayType() {
280        return this;
281    }
282
283    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
284    public void ifArrayType(Consumer<ArrayTypeaction) {
285        action.accept(this);
286    }
287
288    @Override
289    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
290    public Optional<ArrayTypetoArrayType() {
291        return Optional.of(this);
292    }
293}
294
MembersX
ArrayType:asArrayType
ArrayType:ArrayBracketPair:getTokenRange
ArrayType:unwrapArrayTypes
ArrayType:clone
ArrayType:ArrayBracketPair:annotations
ArrayType:ArrayBracketPair:origin
ArrayType:toArrayType
ArrayType:unwrapArrayTypes:Block:arrayBracketPairs
ArrayType:ArrayBracketPair:tokenRange
ArrayType:ArrayBracketPair:getAnnotations
ArrayType:ifArrayType
ArrayType:ArrayBracketPair:getOrigin
ArrayType:wrapInArrayTypes:Block:Block:Block:Block:pair
ArrayType:accept
ArrayType:ArrayBracketPair:ArrayBracketPair
ArrayType:ArrayType
ArrayType:getOrigin
ArrayType:replace
ArrayType:asString
ArrayType:getMetaModel
ArrayType:setAnnotations
ArrayType:wrapInArrayTypes
ArrayType:setOrigin
ArrayType:remove
ArrayType:isArrayType
ArrayType:getComponentType
ArrayType:componentType
ArrayType:unwrapArrayTypes:Block:Block:arrayType
ArrayType:ArrayBracketPair:setTokenRange
ArrayType:wrapInArrayTypes:Block:Block:Block:Block:tokenRange
ArrayType:Origin:NAME
ArrayType:ArrayBracketPair:setOrigin
ArrayType:origin
ArrayType:wrapInArrayTypes:Block:Block:arrayBracketPairList
ArrayType:ArrayBracketPair:setAnnotations
ArrayType:resolve
ArrayType:setComponentType
ArrayType:Origin:TYPE
Members
X