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.observer.ObservableProperty; 25 import com.github.javaparser.ast.visitor.GenericVisitor; 26 import com.github.javaparser.ast.visitor.VoidVisitor; 27 import java.util.Optional; 28 import com.github.javaparser.ast.Node; 29 import com.github.javaparser.ast.visitor.CloneVisitor; 30 import com.github.javaparser.metamodel.OptionalProperty; 31 import com.github.javaparser.metamodel.SuperExprMetaModel; 32 import com.github.javaparser.metamodel.JavaParserMetaModel; 33 import javax.annotation.Generated; 34 import com.github.javaparser.TokenRange; 35 import java.util.function.Consumer; 36 37 /** 38 * An occurrence of the "super" keyword. <br/><code>World.super.greet()</code> is a MethodCallExpr of method name greet, 39 * and scope "World.super" which is a SuperExpr with classExpr "World". <br/><code>super.name</code> is a 40 * FieldAccessExpr of field greet, and a SuperExpr as its scope. The SuperExpr has no classExpr. 41 * 42 * @author Julio Vilmar Gesser 43 * @see com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt 44 * @see ThisExpr 45 */ 46 public final class SuperExpr extends Expression { 47 48 @OptionalProperty 49 private Expression classExpr; 50 51 public SuperExpr() { 52 this(null, null); 53 } 54 55 @AllFieldsConstructor 56 public SuperExpr(final Expression classExpr) { 57 this(null, classExpr); 58 } 59 60 /** 61 * This constructor is used by the parser and is considered private. 62 */ 63 @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") 64 public SuperExpr(TokenRange tokenRange, Expression classExpr) { 65 super(tokenRange); 66 setClassExpr(classExpr); 67 customInitialization(); 68 } 69 70 @Override 71 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 72 public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 73 return v.visit(this, arg); 74 } 75 76 @Override 77 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 78 public <A> void accept(final VoidVisitor<A> v, final A arg) { 79 v.visit(this, arg); 80 } 81 82 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 83 public Optional<Expression> getClassExpr() { 84 return Optional.ofNullable(classExpr); 85 } 86 87 /** 88 * Sets the classExpr 89 * 90 * @param classExpr the classExpr, can be null 91 * @return this, the SuperExpr 92 */ 93 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 94 public SuperExpr setClassExpr(final Expression classExpr) { 95 if (classExpr == this.classExpr) { 96 return (SuperExpr) this; 97 } 98 notifyPropertyChange(ObservableProperty.CLASS_EXPR, this.classExpr, classExpr); 99 if (this.classExpr != null) 100 this.classExpr.setParentNode(null); 101 this.classExpr = classExpr; 102 setAsParentNodeOf(classExpr); 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 if (classExpr != null) { 112 if (node == classExpr) { 113 removeClassExpr(); 114 return true; 115 } 116 } 117 return super.remove(node); 118 } 119 120 @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") 121 public SuperExpr removeClassExpr() { 122 return setClassExpr((Expression) null); 123 } 124 125 @Override 126 @Generated("com.github.javaparser.generator.core.node.CloneGenerator") 127 public SuperExpr clone() { 128 return (SuperExpr) accept(new CloneVisitor(), null); 129 } 130 131 @Override 132 @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") 133 public SuperExprMetaModel getMetaModel() { 134 return JavaParserMetaModel.superExprMetaModel; 135 } 136 137 @Override 138 @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") 139 public boolean replace(Node node, Node replacementNode) { 140 if (node == null) 141 return false; 142 if (classExpr != null) { 143 if (node == classExpr) { 144 setClassExpr((Expression) replacementNode); 145 return true; 146 } 147 } 148 return super.replace(node, replacementNode); 149 } 150 151 @Override 152 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 153 public boolean isSuperExpr() { 154 return true; 155 } 156 157 @Override 158 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 159 public SuperExpr asSuperExpr() { 160 return this; 161 } 162 163 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 164 public void ifSuperExpr(Consumer<SuperExpr> action) { 165 action.accept(this); 166 } 167 168 @Override 169 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 170 public Optional<SuperExpr> toSuperExpr() { 171 return Optional.of(this); 172 } 173 } 174