
org.walkmod.javalang.ast.CompilationUnit Maven / Gradle / Ivy
/*
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