JavaParser Source Viewer

Home|JavaParser/com/github/javaparser/ast/expr/FieldAccessExpr.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.expr;
22
23import com.github.javaparser.ast.AllFieldsConstructor;
24import com.github.javaparser.ast.NodeList;
25import com.github.javaparser.ast.nodeTypes.NodeWithScope;
26import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName;
27import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments;
28import com.github.javaparser.ast.observer.ObservableProperty;
29import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
30import com.github.javaparser.ast.type.Type;
31import com.github.javaparser.ast.visitor.GenericVisitor;
32import com.github.javaparser.ast.visitor.VoidVisitor;
33import java.util.Optional;
34import static com.github.javaparser.utils.Utils.assertNotNull;
35import com.github.javaparser.ast.Node;
36import com.github.javaparser.ast.visitor.CloneVisitor;
37import com.github.javaparser.metamodel.FieldAccessExprMetaModel;
38import com.github.javaparser.metamodel.JavaParserMetaModel;
39import com.github.javaparser.TokenRange;
40import com.github.javaparser.metamodel.OptionalProperty;
41import com.github.javaparser.resolution.Resolvable;
42import com.github.javaparser.resolution.UnsolvedSymbolException;
43import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
44import java.util.function.Consumer;
45import com.github.javaparser.ast.Generated;
46
47/**
48 * Access of a field of an object or a class.
49 * <br>In {@code person.name} "name" is the name and "person" is the scope.
50 *
51 * @author Julio Vilmar Gesser
52 */
53public class FieldAccessExpr extends Expression implements NodeWithSimpleName<FieldAccessExpr>, NodeWithTypeArguments<FieldAccessExpr>, NodeWithScope<FieldAccessExpr>, Resolvable<ResolvedValueDeclaration> {
54
55    private Expression scope;
56
57    @OptionalProperty
58    private NodeList<TypetypeArguments;
59
60    private SimpleName name;
61
62    public FieldAccessExpr() {
63        this(null, new ThisExpr(), null, new SimpleName());
64    }
65
66    public FieldAccessExpr(final Expression scopefinal String name) {
67        this(nullscopenull, new SimpleName(name));
68    }
69
70    @AllFieldsConstructor
71    public FieldAccessExpr(final Expression scopefinal NodeList<TypetypeArgumentsfinal SimpleName name) {
72        this(nullscopetypeArgumentsname);
73    }
74
75    /**
76     * This constructor is used by the parser and is considered private.
77     */
78    @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
79    public FieldAccessExpr(TokenRange tokenRangeExpression scopeNodeList<TypetypeArgumentsSimpleName name) {
80        super(tokenRange);
81        setScope(scope);
82        setTypeArguments(typeArguments);
83        setName(name);
84        customInitialization();
85    }
86
87    @Override
88    @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
89    public <RAR accept(final GenericVisitor<RAvfinal A arg) {
90        return v.visit(this, arg);
91    }
92
93    @Override
94    @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
95    public <Avoid accept(final VoidVisitor<Avfinal A arg) {
96        v.visit(this, arg);
97    }
98
99    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
100    public SimpleName getName() {
101        return name;
102    }
103
104    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
105    public FieldAccessExpr setName(final SimpleName name) {
106        assertNotNull(name);
107        if (name == this.name) {
108            return (FieldAccessExpr) this;
109        }
110        notifyPropertyChange(ObservableProperty.NAME, this.namename);
111        if (this.name != null)
112            this.name.setParentNode(null);
113        this.name = name;
114        setAsParentNodeOf(name);
115        return this;
116    }
117
118    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
119    public Expression getScope() {
120        return scope;
121    }
122
123    /**
124     * Sets the scope
125     *
126     * @param scope the scope, can not be null
127     * @return this, the FieldAccessExpr
128     */
129    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
130    public FieldAccessExpr setScope(final Expression scope) {
131        assertNotNull(scope);
132        if (scope == this.scope) {
133            return (FieldAccessExpr) this;
134        }
135        notifyPropertyChange(ObservableProperty.SCOPE, this.scopescope);
136        if (this.scope != null)
137            this.scope.setParentNode(null);
138        this.scope = scope;
139        setAsParentNodeOf(scope);
140        return this;
141    }
142
143    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
144    public Optional<NodeList<Type>> getTypeArguments() {
145        return Optional.ofNullable(typeArguments);
146    }
147
148    /**
149     * Sets the type arguments
150     *
151     * @param typeArguments the type arguments, can be null
152     * @return this, the FieldAccessExpr
153     */
154    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
155    public FieldAccessExpr setTypeArguments(final NodeList<TypetypeArguments) {
156        if (typeArguments == this.typeArguments) {
157            return (FieldAccessExpr) this;
158        }
159        notifyPropertyChange(ObservableProperty.TYPE_ARGUMENTS, this.typeArgumentstypeArguments);
160        if (this.typeArguments != null)
161            this.typeArguments.setParentNode(null);
162        this.typeArguments = typeArguments;
163        setAsParentNodeOf(typeArguments);
164        return this;
165    }
166
167    @Override
168    @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
169    public FieldAccessExpr clone() {
170        return (FieldAccessExpraccept(new CloneVisitor(), null);
171    }
172
173    @Override
174    @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
175    public FieldAccessExprMetaModel getMetaModel() {
176        return JavaParserMetaModel.fieldAccessExprMetaModel;
177    }
178
179    @Override
180    @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
181    public boolean remove(Node node) {
182        if (node == null)
183            return false;
184        if (typeArguments != null) {
185            for (int i = 0i < typeArguments.size(); i++) {
186                if (typeArguments.get(i) == node) {
187                    typeArguments.remove(i);
188                    return true;
189                }
190            }
191        }
192        return super.remove(node);
193    }
194
195    @Override
196    @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
197    public boolean replace(Node nodeNode replacementNode) {
198        if (node == null)
199            return false;
200        if (node == name) {
201            setName((SimpleNamereplacementNode);
202            return true;
203        }
204        if (node == scope) {
205            setScope((ExpressionreplacementNode);
206            return true;
207        }
208        if (typeArguments != null) {
209            for (int i = 0i < typeArguments.size(); i++) {
210                if (typeArguments.get(i) == node) {
211                    typeArguments.set(i, (TypereplacementNode);
212                    return true;
213                }
214            }
215        }
216        return super.replace(nodereplacementNode);
217    }
218
219    @Override
220    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
221    public boolean isFieldAccessExpr() {
222        return true;
223    }
224
225    @Override
226    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
227    public FieldAccessExpr asFieldAccessExpr() {
228        return this;
229    }
230
231    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
232    public void ifFieldAccessExpr(Consumer<FieldAccessExpraction) {
233        action.accept(this);
234    }
235
236    /**
237     * Attempts to resolve the declaration corresponding to the accessed field. If successful, a
238     * {@link ResolvedValueDeclaration} representing the declaration of the value accessed by this
239     * {@code FieldAccessExpr} is returned. Otherwise, an {@link UnsolvedSymbolException} is thrown.
240     *
241     * @return a {@link ResolvedValueDeclaration} representing the declaration of the accessed value.
242     * @throws UnsolvedSymbolException if the declaration corresponding to the field access expression could not be
243     *                                 resolved.
244     * @see NameExpr#resolve()
245     * @see MethodCallExpr#resolve()
246     * @see ObjectCreationExpr#resolve()
247     * @see ExplicitConstructorInvocationStmt#resolve()
248     */
249    @Override
250    public ResolvedValueDeclaration resolve() {
251        return getSymbolResolver().resolveDeclaration(this, ResolvedValueDeclaration.class);
252    }
253
254    @Override
255    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
256    public Optional<FieldAccessExprtoFieldAccessExpr() {
257        return Optional.of(this);
258    }
259
260    /**
261     * Indicate if this FieldAccessExpr is an element directly contained in a larger FieldAccessExpr.
262     */
263    public boolean isInternal() {
264        return this.getParentNode().isPresent() && this.getParentNode().get() instanceof FieldAccessExpr;
265    }
266
267    /**
268     * Indicate if this FieldAccessExpr is top level, i.e., it is not directly contained in a larger FieldAccessExpr.
269     */
270    public boolean isTopLevel() {
271        return !isInternal();
272    }
273}
274
MembersX
FieldAccessExpr:isFieldAccessExpr
FieldAccessExpr:getScope
FieldAccessExpr:getMetaModel
FieldAccessExpr:typeArguments
FieldAccessExpr:name
FieldAccessExpr:getTypeArguments
FieldAccessExpr:isInternal
FieldAccessExpr:scope
FieldAccessExpr:getName
FieldAccessExpr:setName
FieldAccessExpr:ifFieldAccessExpr
FieldAccessExpr:clone
FieldAccessExpr:toFieldAccessExpr
FieldAccessExpr:remove
FieldAccessExpr:resolve
FieldAccessExpr:setTypeArguments
FieldAccessExpr:asFieldAccessExpr
FieldAccessExpr:setScope
FieldAccessExpr:isTopLevel
FieldAccessExpr:replace
FieldAccessExpr:FieldAccessExpr
FieldAccessExpr:accept
Members
X