Home | History | Annotate | Download | only in expr
      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