1/*
2 * Copyright (C) 2007-2010 Júlio 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 */
21package com.github.javaparser.ast.expr;
22
23import com.github.javaparser.ast.AllFieldsConstructor;
24import com.github.javaparser.ast.nodeTypes.NodeWithName;
25import com.github.javaparser.ast.observer.ObservableProperty;
26import static com.github.javaparser.utils.Utils.assertNotNull;
27import com.github.javaparser.ast.Node;
28import com.github.javaparser.ast.visitor.CloneVisitor;
29import com.github.javaparser.metamodel.AnnotationExprMetaModel;
30import com.github.javaparser.metamodel.JavaParserMetaModel;
31import javax.annotation.Generated;
32import com.github.javaparser.TokenRange;
33import java.util.function.Consumer;
34import java.util.Optional;
35
36/**
37 * A base class for the different types of annotations.
38 *
39 * @author Julio Vilmar Gesser
40 */
41public abstract class AnnotationExpr extends Expression implements NodeWithName<AnnotationExpr> {
42
43    protected Name name;
44
45    public AnnotationExpr() {
46        this(null, new Name());
47    }
48
49    @AllFieldsConstructor
50    public AnnotationExpr(Name name) {
51        this(null, name);
52    }
53
54    /**
55     * This constructor is used by the parser and is considered private.
56     */
57    @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
58    public AnnotationExpr(TokenRange tokenRange, Name name) {
59        super(tokenRange);
60        setName(name);
61        customInitialization();
62    }
63
64    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
65    public Name getName() {
66        return name;
67    }
68
69    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
70    public AnnotationExpr setName(final Name name) {
71        assertNotNull(name);
72        if (name == this.name) {
73            return (AnnotationExpr) this;
74        }
75        notifyPropertyChange(ObservableProperty.NAME, this.name, name);
76        if (this.name != null)
77            this.name.setParentNode(null);
78        this.name = name;
79        setAsParentNodeOf(name);
80        return this;
81    }
82
83    @Override
84    @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
85    public boolean remove(Node node) {
86        if (node == null)
87            return false;
88        return super.remove(node);
89    }
90
91    @Override
92    @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
93    public AnnotationExpr clone() {
94        return (AnnotationExpr) accept(new CloneVisitor(), null);
95    }
96
97    @Override
98    @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
99    public AnnotationExprMetaModel getMetaModel() {
100        return JavaParserMetaModel.annotationExprMetaModel;
101    }
102
103    @Override
104    @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
105    public boolean replace(Node node, Node replacementNode) {
106        if (node == null)
107            return false;
108        if (node == name) {
109            setName((Name) replacementNode);
110            return true;
111        }
112        return super.replace(node, replacementNode);
113    }
114
115    @Override
116    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
117    public boolean isAnnotationExpr() {
118        return true;
119    }
120
121    @Override
122    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
123    public AnnotationExpr asAnnotationExpr() {
124        return this;
125    }
126
127    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
128    public void ifAnnotationExpr(Consumer<AnnotationExpr> action) {
129        action.accept(this);
130    }
131
132    @Override
133    @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator")
134    public Optional<AnnotationExpr> toAnnotationExpr() {
135        return Optional.of(this);
136    }
137}
138