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.NodeWithType; 25 import com.github.javaparser.ast.observer.ObservableProperty; 26 import com.github.javaparser.ast.type.ClassOrInterfaceType; 27 import com.github.javaparser.ast.type.Type; 28 import com.github.javaparser.ast.visitor.GenericVisitor; 29 import com.github.javaparser.ast.visitor.VoidVisitor; 30 import static com.github.javaparser.utils.Utils.assertNotNull; 31 import com.github.javaparser.ast.Node; 32 import com.github.javaparser.ast.visitor.CloneVisitor; 33 import com.github.javaparser.metamodel.TypeExprMetaModel; 34 import com.github.javaparser.metamodel.JavaParserMetaModel; 35 import javax.annotation.Generated; 36 import com.github.javaparser.TokenRange; 37 import java.util.function.Consumer; 38 import java.util.Optional; 39 40 /** 41 * This class is just instantiated as scopes for MethodReferenceExpr nodes to encapsulate Types. 42 * <br/>In <code>World::greet</code> the ClassOrInterfaceType "World" is wrapped in a TypeExpr 43 * before it is set as the scope of the MethodReferenceExpr. 44 * 45 * @author Raquel Pau 46 */ 47 public final class TypeExpr extends Expression implements NodeWithType<TypeExpr, Type> { 48 49 private Type type; 50 51 public TypeExpr() { 52 this(null, new ClassOrInterfaceType()); 53 } 54 55 @AllFieldsConstructor 56 public TypeExpr(Type type) { 57 this(null, type); 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 TypeExpr(TokenRange tokenRange, Type type) { 65 super(tokenRange); 66 setType(type); 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 Type getType() { 84 return type; 85 } 86 87 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 88 public TypeExpr setType(final Type type) { 89 assertNotNull(type); 90 if (type == this.type) { 91 return (TypeExpr) this; 92 } 93 notifyPropertyChange(ObservableProperty.TYPE, this.type, type); 94 if (this.type != null) 95 this.type.setParentNode(null); 96 this.type = type; 97 setAsParentNodeOf(type); 98 return this; 99 } 100 101 @Override 102 @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") 103 public boolean remove(Node node) { 104 if (node == null) 105 return false; 106 return super.remove(node); 107 } 108 109 @Override 110 @Generated("com.github.javaparser.generator.core.node.CloneGenerator") 111 public TypeExpr clone() { 112 return (TypeExpr) accept(new CloneVisitor(), null); 113 } 114 115 @Override 116 @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") 117 public TypeExprMetaModel getMetaModel() { 118 return JavaParserMetaModel.typeExprMetaModel; 119 } 120 121 @Override 122 @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") 123 public boolean replace(Node node, Node replacementNode) { 124 if (node == null) 125 return false; 126 if (node == type) { 127 setType((Type) replacementNode); 128 return true; 129 } 130 return super.replace(node, replacementNode); 131 } 132 133 @Override 134 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 135 public boolean isTypeExpr() { 136 return true; 137 } 138 139 @Override 140 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 141 public TypeExpr asTypeExpr() { 142 return this; 143 } 144 145 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 146 public void ifTypeExpr(Consumer<TypeExpr> action) { 147 action.accept(this); 148 } 149 150 @Override 151 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 152 public Optional<TypeExpr> toTypeExpr() { 153 return Optional.of(this); 154 } 155 } 156