All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.walkmod.javalang.ast.body.BodyDeclaration Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2013 Raquel Pau and Albert Coroleu.
 * 
 * Walkmod 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.
 * 
 * Walkmod 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 Walkmod. If
 * not, see .
 */
package org.walkmod.javalang.ast.body;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.walkmod.javalang.ast.Node;
import org.walkmod.javalang.ast.ScopeAware;
import org.walkmod.javalang.ast.ScopeAwareUtil;
import org.walkmod.javalang.ast.SymbolDefinition;
import org.walkmod.javalang.ast.expr.AnnotationExpr;
import org.walkmod.merger.MergeEngine;

/**
 * @author Julio Vilmar Gesser
 */
public abstract class BodyDeclaration extends Node implements ScopeAware {

    private JavadocComment javaDoc;

    private List annotations;

    public BodyDeclaration() {}

    public BodyDeclaration(List annotations, JavadocComment javaDoc) {
        setJavaDoc(javaDoc);
        setAnnotations(annotations);
    }

    public BodyDeclaration(int beginLine, int beginColumn, int endLine, int endColumn, List annotations,
            JavadocComment javaDoc) {
        super(beginLine, beginColumn, endLine, endColumn);
        setJavaDoc(javaDoc);
        setAnnotations(annotations);
    }

    @Override
    public List getChildren() {
        List children = new LinkedList();
        if (javaDoc != null) {
            children.add(javaDoc);
        }
        if (annotations != null) {
            children.addAll(annotations);
        }
        return children;
    }

    @Override
    public boolean removeChild(Node child) {
        boolean result = false;
        if (child != null) {
            if (child instanceof AnnotationExpr) {
                if (annotations != null) {
                    List aux = new LinkedList(annotations);
                    result = aux.remove(child);
                    this.annotations = aux;
                }
            } else if (child instanceof JavadocComment) {
                if (javaDoc != null && javaDoc.equals(child)) {
                    javaDoc = null;
                    result = true;
                }
            }
        }
        if (result) {
            updateReferences(child);
        }
        return result;
    }

    public final JavadocComment getJavaDoc() {
        return javaDoc;
    }

    public final List getAnnotations() {
        return annotations;
    }

    public final void setJavaDoc(JavadocComment javaDoc) {
        this.javaDoc = javaDoc;
        setAsParentNodeOf(javaDoc);
    }

    public final void setAnnotations(List annotations) {
        this.annotations = annotations;
        setAsParentNodeOf(annotations);
    }

    public void merge(BodyDeclaration remoteBodyDeclaration, MergeEngine configuration) {
        List resultAnnotations = new LinkedList();
        configuration.apply(getAnnotations(), remoteBodyDeclaration.getAnnotations(), resultAnnotations,
                AnnotationExpr.class);
        setAnnotations(resultAnnotations);

        setJavaDoc((JavadocComment) (configuration.apply(getJavaDoc(), remoteBodyDeclaration.getJavaDoc(),
                JavadocComment.class)));
    }

    @Override
    public boolean replaceChildNode(Node oldChild, Node newChild) {
        if (newChild instanceof JavadocComment) {
            setJavaDoc((JavadocComment) newChild);
            return true;
        }
        boolean update = false;
        if (annotations != null) {
            List auxAnn = new LinkedList(annotations);
            update = replaceChildNodeInList(oldChild, newChild, auxAnn);
            if (update) {
                annotations = auxAnn;
            }
        }

        return update;
    }

    @Override
    public Map getVariableDefinitions() {
        return ScopeAwareUtil.getVariableDefinitions(this);
    }

    @Override
    public Map> getMethodDefinitions() {
        return ScopeAwareUtil.getMethodDefinitions(BodyDeclaration.this);
    }

    @Override
    public Map getTypeDefinitions() {
        return ScopeAwareUtil.getTypeDefinitions(BodyDeclaration.this);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy