package net.jangaroo.jooc.model;
import net.jangaroo.utils.CompilerUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A model of an ActionScript compilation unit.
*/
public class CompilationUnitModel implements ActionScriptModel {
private String packageName = "";
private List<String> imports = new ArrayList<String>();
private NamedModel primaryDeclaration;
public CompilationUnitModel() {
}
public CompilationUnitModel(String packageName) {
this.packageName = packageName;
}
public CompilationUnitModel(String packageName, NamedModel primaryDeclaration) {
this(packageName);
this.primaryDeclaration = primaryDeclaration;
}
public String getPackage() {
return packageName;
}
public void setPackage(String packageName) {
this.packageName = packageName;
}
public String getQName() {
return CompilerUtils.qName(packageName, primaryDeclaration.getName());
}
public void setQName(String qName) {
packageName = CompilerUtils.packageName(qName);
primaryDeclaration.setName(CompilerUtils.className(qName));
}
public NamedModel getPrimaryDeclaration() {
return primaryDeclaration;
}
public void setPrimaryDeclaration(NamedModel primaryDeclaration) {
this.primaryDeclaration = primaryDeclaration;
}
public void addImport(String qName) {
if (qName != null && qName.contains(".") && !qName.contains("<") && !imports.contains(qName) && !getPackage().equals(CompilerUtils.packageName(qName))) {
imports.add(qName);
}
}
public List<String> getImports() {
return Collections.unmodifiableList(imports);
}
public void addImplicitImports() {
visit(new ModelVisitor() {
@Override
public void visitCompilationUnit(CompilationUnitModel compilationUnitModel) {
compilationUnitModel.getPrimaryDeclaration().visit(this);
}
@Override
public void visitClass(ClassModel classModel) {
addImport(classModel.getNamespace());
addImport(classModel.getSuperclass());
for (String anInterface : classModel.getInterfaces()) {
addImport(anInterface);
}
for (MemberModel memberModel : classModel.getMembers()) {
memberModel.visit(this);
}
}
@Override
public void visitField(FieldModel fieldModel) {
addImport(fieldModel.getNamespace());
addImport(fieldModel.getType());
}
@Override
public void visitProperty(PropertyModel propertyModel) {
addImport(propertyModel.getNamespace());
addImport(propertyModel.getType());
}
@Override
public void visitMethod(MethodModel methodModel) {
addImport(methodModel.getNamespace());
for (ParamModel paramModel : methodModel.getParams()) {
paramModel.visit(this);
}
methodModel.getReturnModel().visit(this);
}
@Override
public void visitParam(ParamModel paramModel) {
addImport(paramModel.getType());
}
@Override
public void visitReturn(ReturnModel returnModel) {
addImport(returnModel.getType());
}
@Override
public void visitNamespace(NamespaceModel namespaceModel) {
}
@Override
public void visitAnnotation(AnnotationModel annotationModel) {
}
@Override
public void visitAnnotationProperty(AnnotationPropertyModel annotationPropertyModel) {
}
});
}
@Override
public void visit(ModelVisitor visitor) {
visitor.visitCompilationUnit(this);
}
public ClassModel getClassModel() {
return primaryDeclaration instanceof ClassModel ? (ClassModel)primaryDeclaration : null;
}
}