/* * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. * Copyright (C) 2011, 2013-2016 The JavaParser Team. * * This file is part of JavaParser. * * JavaParser can be used either under the terms of * a) the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * b) the terms of the Apache License * * You should have received a copy of both licenses in LICENCE.LGPL and * LICENCE.APACHE. Please refer to those files for details. * * JavaParser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. */ package com.github.javaparser.ast.body; import com.github.javaparser.Range; import com.github.javaparser.ast.ArrayBracketPair; import com.github.javaparser.ast.Modifier; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.expr.AnnotationExpr; import com.github.javaparser.ast.nodeTypes.*; import com.github.javaparser.ast.type.ArrayType; import com.github.javaparser.ast.type.Type; import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.utils.Pair; import static com.github.javaparser.ast.type.ArrayType.wrapInArrayTypes; import java.util.EnumSet; import java.util.List; import static com.github.javaparser.utils.Utils.ensureNotNull; /** * @author Julio Vilmar Gesser */ public final class Parameter extends Node implements NodeWithType, NodeWithElementType, NodeWithAnnotations, NodeWithName, NodeWithModifiers { private Type elementType; private boolean isVarArgs; private EnumSet modifiers = EnumSet.noneOf(Modifier.class); private List annotations; private VariableDeclaratorId id; private List arrayBracketPairsAfterType; public Parameter() { } public Parameter(Type elementType, VariableDeclaratorId id) { setId(id); setElementType(elementType); } /** * Creates a new {@link Parameter}. * * @param elementType * type of the parameter * @param name * name of the parameter * @return instance of {@link Parameter} */ public static Parameter create(Type elementType, String name) { return new Parameter(elementType, new VariableDeclaratorId(name)); } public Parameter(EnumSet modifiers, Type elementType, VariableDeclaratorId id) { setModifiers(modifiers); setId(id); setElementType(elementType); } public Parameter(final Range range, EnumSet modifiers, List annotations, Type elementType, List arrayBracketPairsAfterElementType, boolean isVarArgs, VariableDeclaratorId id) { super(range); setModifiers(modifiers); setAnnotations(annotations); setId(id); setElementType(elementType); setVarArgs(isVarArgs); setArrayBracketPairsAfterElementType(arrayBracketPairsAfterElementType); } @Override public R accept(GenericVisitor v, A arg) { return v.visit(this, arg); } @Override public void accept(VoidVisitor v, A arg) { v.visit(this, arg); } @Override public Type getType() { return wrapInArrayTypes(elementType, getArrayBracketPairsAfterElementType(), getId().getArrayBracketPairsAfterId()); } public boolean isVarArgs() { return isVarArgs; } @Override public Parameter setType(Type type) { Pair> unwrapped = ArrayType.unwrapArrayTypes(type); setElementType(unwrapped.a); setArrayBracketPairsAfterElementType(unwrapped.b); getId().setArrayBracketPairsAfterId(null); return this; } public Parameter setVarArgs(boolean isVarArgs) { this.isVarArgs = isVarArgs; return this; } /** * @return the list returned could be immutable (in that case it will be empty) */ @Override public List getAnnotations() { annotations = ensureNotNull(annotations); return annotations; } public VariableDeclaratorId getId() { return id; } @Override public String getName() { return getId().getName(); } @SuppressWarnings("unchecked") @Override public Parameter setName(String name) { if (id != null) id.setName(name); else id = new VariableDeclaratorId(name); return this; } /** * Return the modifiers of this parameter declaration. * * @see Modifier * @return modifiers */ @Override public EnumSet getModifiers() { return modifiers; } /** * @param annotations a null value is currently treated as an empty list. This behavior could change * in the future, so please avoid passing null */ @Override @SuppressWarnings("unchecked") public Parameter setAnnotations(List annotations) { this.annotations = annotations; setAsParentNodeOf(this.annotations); return this; } public void setId(VariableDeclaratorId id) { this.id = id; setAsParentNodeOf(this.id); } @Override @SuppressWarnings("unchecked") public Parameter setModifiers(EnumSet modifiers) { this.modifiers = modifiers; return this; } @Override public Type getElementType() { return elementType; } @Override public Parameter setElementType(final Type elementType) { this.elementType = elementType; setAsParentNodeOf(this.elementType); return this; } public List getArrayBracketPairsAfterElementType() { arrayBracketPairsAfterType = ensureNotNull(arrayBracketPairsAfterType); return arrayBracketPairsAfterType; } @Override public Parameter setArrayBracketPairsAfterElementType(List arrayBracketPairsAfterType) { this.arrayBracketPairsAfterType = arrayBracketPairsAfterType; setAsParentNodeOf(arrayBracketPairsAfterType); return this; } }