1 /* 2 * Copyright (C) 2007-2010 Jlio 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.expr; 22 23 import com.github.javaparser.ast.AllFieldsConstructor; 24 import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; 25 import com.github.javaparser.ast.observer.ObservableProperty; 26 import com.github.javaparser.ast.visitor.GenericVisitor; 27 import com.github.javaparser.ast.visitor.VoidVisitor; 28 import static com.github.javaparser.utils.Utils.assertNotNull; 29 import com.github.javaparser.ast.Node; 30 import com.github.javaparser.ast.visitor.CloneVisitor; 31 import com.github.javaparser.metamodel.NameExprMetaModel; 32 import com.github.javaparser.metamodel.JavaParserMetaModel; 33 import javax.annotation.Generated; 34 import com.github.javaparser.TokenRange; 35 import com.github.javaparser.resolution.Resolvable; 36 import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration; 37 import com.github.javaparser.resolution.types.ResolvedUnionType; 38 import java.util.function.Consumer; 39 import java.util.Optional; 40 41 /** 42 * Whenever a SimpleName is used in an expression, it is wrapped in NameExpr. 43 * <br/>In <code>int x = a + 3;</code> a is a SimpleName inside a NameExpr. 44 * 45 * @author Julio Vilmar Gesser 46 */ 47 public final class NameExpr extends Expression implements NodeWithSimpleName<NameExpr>, Resolvable<ResolvedValueDeclaration> { 48 49 private SimpleName name; 50 51 public NameExpr() { 52 this(null, new SimpleName()); 53 } 54 55 public NameExpr(final String name) { 56 this(null, new SimpleName(name)); 57 } 58 59 @AllFieldsConstructor 60 public NameExpr(final SimpleName name) { 61 this(name.getTokenRange().orElse(null), name); 62 setRange(name.getRange().orElse(null)); 63 } 64 65 /** 66 * This constructor is used by the parser and is considered private. 67 */ 68 @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") 69 public NameExpr(TokenRange tokenRange, SimpleName name) { 70 super(tokenRange); 71 setName(name); 72 customInitialization(); 73 } 74 75 @Override 76 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 77 public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 78 return v.visit(this, arg); 79 } 80 81 @Override 82 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 83 public <A> void accept(final VoidVisitor<A> v, final A arg) { 84 v.visit(this, arg); 85 } 86 87 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 88 public SimpleName getName() { 89 return name; 90 } 91 92 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 93 public NameExpr setName(final SimpleName name) { 94 assertNotNull(name); 95 if (name == this.name) { 96 return (NameExpr) this; 97 } 98 notifyPropertyChange(ObservableProperty.NAME, this.name, name); 99 if (this.name != null) 100 this.name.setParentNode(null); 101 this.name = name; 102 setAsParentNodeOf(name); 103 return this; 104 } 105 106 @Override 107 @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") 108 public boolean remove(Node node) { 109 if (node == null) 110 return false; 111 return super.remove(node); 112 } 113 114 @Override 115 @Generated("com.github.javaparser.generator.core.node.CloneGenerator") 116 public NameExpr clone() { 117 return (NameExpr) accept(new CloneVisitor(), null); 118 } 119 120 @Override 121 @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") 122 public NameExprMetaModel getMetaModel() { 123 return JavaParserMetaModel.nameExprMetaModel; 124 } 125 126 @Override 127 @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") 128 public boolean replace(Node node, Node replacementNode) { 129 if (node == null) 130 return false; 131 if (node == name) { 132 setName((SimpleName) replacementNode); 133 return true; 134 } 135 return super.replace(node, replacementNode); 136 } 137 138 @Override 139 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 140 public boolean isNameExpr() { 141 return true; 142 } 143 144 @Override 145 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 146 public NameExpr asNameExpr() { 147 return this; 148 } 149 150 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 151 public void ifNameExpr(Consumer<NameExpr> action) { 152 action.accept(this); 153 } 154 155 @Override 156 public ResolvedValueDeclaration resolve() { 157 return getSymbolResolver().resolveDeclaration(this, ResolvedValueDeclaration.class); 158 } 159 160 @Override 161 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 162 public Optional<NameExpr> toNameExpr() { 163 return Optional.of(this); 164 } 165 } 166