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

org.walkmod.javalang.ast.CompilationUnit Maven / Gradle / Ivy

There is a newer version: 4.8.8
Show 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;

import java.net.URI;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

import org.walkmod.javalang.ast.body.AnnotationDeclaration;
import org.walkmod.javalang.ast.body.ClassOrInterfaceDeclaration;
import org.walkmod.javalang.ast.body.EmptyTypeDeclaration;
import org.walkmod.javalang.ast.body.EnumDeclaration;
import org.walkmod.javalang.ast.body.JavadocComment;
import org.walkmod.javalang.ast.body.TypeDeclaration;
import org.walkmod.javalang.comparators.CompilationUnitComparator;
import org.walkmod.javalang.visitors.GenericVisitor;
import org.walkmod.javalang.visitors.VoidVisitor;
import org.walkmod.merger.MergeEngine;
import org.walkmod.merger.Mergeable;

/**
 * 

* This class represents the entire compilation unit. Each java file denotes a compilation unit. *

* The CompilationUnit is constructed following the syntax:
* * * * * * * *
CompilationUnit::= * ( {@link PackageDeclaration} )?
* ( {@link ImportDeclaration} )*
* ( {@link TypeDeclaration} )*
*
*
* * @author Julio Vilmar Gesser */ public final class CompilationUnit extends Node implements Mergeable { private PackageDeclaration pakage; private List imports; private List types; private List comments; private URI uri; public CompilationUnit() { } public CompilationUnit(PackageDeclaration pakage, List imports, List types, List comments) { setPackage(pakage); setImports(imports); setTypes(types); setComments(comments); } public CompilationUnit(int beginLine, int beginColumn, int endLine, int endColumn, PackageDeclaration pakage, List imports, List types, List comments) { super(beginLine, beginColumn, endLine, endColumn); setPackage(pakage); setImports(imports); setTypes(types); setComments(comments); } public void setURI(URI uri) { this.uri = uri; } public URI getURI() { return uri; } @Override public List getChildren() { List aux = new LinkedList(); if (pakage != null) { aux.add(pakage); } if (imports != null) { aux.addAll(imports); } if (types != null) { aux.addAll(types); } if (comments != null) { aux.addAll(comments); } return aux; } @Override public boolean removeChild(Node child) { boolean result = false; if (child != null) { if (child instanceof ImportDeclaration) { if (imports != null) { List auxImports = new LinkedList(imports); result = auxImports.remove(child); this.imports = auxImports; } } else if (child instanceof TypeDeclaration) { if (types != null) { List typesAux = new LinkedList(types); result = typesAux.remove(child); types = typesAux; } } else if (child instanceof Comment) { if (comments != null) { List commentAux = new LinkedList(comments); result = commentAux.remove(child); comments = commentAux; } } else if (child == pakage) { pakage = null; result = true; } } if(result){ updateReferences(result); } return result; } @Override public R accept(GenericVisitor v, A arg) { if (!check()) { return null; } return v.visit(this, arg); } @Override public void accept(VoidVisitor v, A arg) { if (check()) { v.visit(this, arg); } } /** * Return a list containing all comments declared in this compilation unit. Including javadocs, * line comments and block comments of all types, inner-classes and other members.
* If there is no comment, null is returned. * * @return list with all comments of this compilation unit or null * @see JavadocComment * @see LineComment * @see BlockComment */ public List getComments() { return comments; } /** * Retrieves the list of imports declared in this compilation unit or null if there * is no import. * * @return the list of imports or null if there is no import */ public List getImports() { return imports; } /** * Retrieves the package declaration of this compilation unit.
* If this compilation unit has no package declaration (default package), null is * returned. * * @return the package declaration or null */ public PackageDeclaration getPackage() { return pakage; } /** * Return the list of types declared in this compilation unit.
* If there is no types declared, null is returned. * * @return the list of types or null null if there is no type * @see AnnotationDeclaration * @see ClassOrInterfaceDeclaration * @see EmptyTypeDeclaration * @see EnumDeclaration */ public List getTypes() { return types; } /** * Sets the list of comments of this compilation unit. * * @param comments * the list of comments */ public void setComments(List comments) { this.comments = comments; } /** * Sets the list of imports of this compilation unit. The list is initially null. * * @param imports * the list of imports */ public void setImports(List imports) { this.imports = imports; setAsParentNodeOf(imports); } /** * Sets or clear the package declarations of this compilation unit. * * @param pakage * the pakage declaration to set or null to default package */ public void setPackage(PackageDeclaration pakage) { if (this.pakage != null) { updateReferences(this.pakage); } this.pakage = pakage; setAsParentNodeOf(pakage); } /** * Sets the list of types declared in this compilation unit. * * @param types * the lis of types */ public void setTypes(List types) { this.types = types; setAsParentNodeOf(types); } @Override public Comparator getIdentityComparator() { return new CompilationUnitComparator(); } @Override public void merge(CompilationUnit remoteCU, MergeEngine configuration) { List resultImports = new LinkedList(); configuration.apply(getImports(), remoteCU.getImports(), resultImports, ImportDeclaration.class); setImports(resultImports); List resultTypes = new LinkedList(); configuration.apply(getTypes(), remoteCU.getTypes(), resultTypes, TypeDeclaration.class); setTypes(resultTypes); List resultComments = new LinkedList(); configuration.apply(getComments(), remoteCU.getComments(), resultComments, Comment.class); setComments(resultComments); } public boolean replaceChildNode(Node oldChild, Node newChild) { boolean updated = false; if (pakage == oldChild) { setPackage((PackageDeclaration) newChild); updated = true; } updated = replaceChildNodeInList(oldChild, newChild, imports); if (!updated) { updated = replaceChildNodeInList(oldChild, newChild, types); if (!updated) { updated = replaceChildNodeInList(oldChild, newChild, comments); } } return updated; } @Override public CompilationUnit clone() throws CloneNotSupportedException { return new CompilationUnit(clone(pakage), clone(imports), clone(types), clone(comments)); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy