/* Copyright (c) 2009-2011 Olivier Chafik, All Rights Reserved This file is part of JNAerator (http://jnaerator.googlecode.com/). JNAerator is free software: you can redistribute it and/or modify it under the terms of 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. JNAerator 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. You should have received a copy of the GNU Lesser General Public License along with JNAerator. If not, see <http://www.gnu.org/licenses/>. */ package com.ochafik.lang.jnaerator.parser; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.ochafik.lang.jnaerator.parser.ElementsHelper.*; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; public class Annotation extends Element { TypeRef annotationClass; final Map<String, Expression> namedArguments = new LinkedHashMap<String, Expression>(); Expression defaultArgument; public Annotation() { } public Annotation(TypeRef annotationClass) { this(annotationClass, null); } public Annotation(TypeRef annotationClass, Expression defaultArgument) { this(annotationClass, defaultArgument, Collections.<String, Expression>emptyMap()); } public Annotation(TypeRef annotationClass, Expression defaultArgument, Map<String, Expression> namedArguments) { setAnnotationClass(annotationClass); setDefaultArgument(defaultArgument); setNamedArguments(namedArguments); } public void setDefaultArgument(Expression defaultArgument) { this.defaultArgument = changeValue(this, this.defaultArgument, defaultArgument); } public Expression getDefaultArgument() { return defaultArgument; } public void setNamedArguments(Map<String, Expression> namedArguments) { changeValue(this, this.namedArguments, namedArguments); } public Map<String, Expression> getNamedArguments() { return Collections.unmodifiableMap(namedArguments); } public TypeRef getAnnotationClass() { return annotationClass; } public void setAnnotationClass(TypeRef annotationClass) { this.annotationClass = changeValue(this, this.annotationClass, annotationClass); } @Override public void accept(Visitor visitor) { visitor.visitAnnotation(this); } @Override public Element getNextChild(Element child) { return getNextSibling(namedArguments.values(), child); } @Override public Element getPreviousChild(Element child) { return getPreviousSibling(namedArguments.values(), child); } @Override public boolean replaceChild(Element child, Element by) { if (child == getAnnotationClass()) { setAnnotationClass((TypeRef)by); return true; } if (child == getDefaultArgument()) { setDefaultArgument((Expression) by); return true; } return replaceChild(namedArguments, Expression.class, this, child, by) || super.replaceChild(child, by); } }