package com.redhat.ceylon.eclipse.util; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.redhat.ceylon.eclipse.core.model.CeylonUnit; import com.redhat.ceylon.model.typechecker.model.Annotation; import com.redhat.ceylon.model.typechecker.model.Declaration; import com.redhat.ceylon.model.typechecker.model.DeclarationWithProximity; import com.redhat.ceylon.model.typechecker.model.Import; import com.redhat.ceylon.model.typechecker.model.Module; import com.redhat.ceylon.model.typechecker.model.Type; import com.redhat.ceylon.model.typechecker.model.Scope; import com.redhat.ceylon.model.typechecker.model.TypeDeclaration; import com.redhat.ceylon.model.typechecker.model.Unit; public class SingleSourceUnitPackage extends com.redhat.ceylon.model.typechecker.model.Package { private com.redhat.ceylon.model.typechecker.model.Package modelPackage; private String fullPathOfSourceUnitToTypecheck; public SingleSourceUnitPackage(com.redhat.ceylon.model.typechecker.model.Package delegate, String fullPathOfSourceUnitToTypecheck) { this.modelPackage = delegate; this.fullPathOfSourceUnitToTypecheck = fullPathOfSourceUnitToTypecheck; setModule(delegate.getModule()); setName(delegate.getName()); setShared(delegate.isShared()); } public String getFullPathOfSourceUnitToTypecheck() { return fullPathOfSourceUnitToTypecheck; } private boolean mustSearchInSourceFile(Declaration modelDeclaration) { if (modelDeclaration == null) { return true; } Unit unit = modelDeclaration.getUnit(); return mustSearchInSourceFile(unit); } private boolean mustSearchInSourceFile(Unit modelUnit) { if (modelUnit instanceof CeylonUnit) { CeylonUnit ceylonUnit = (CeylonUnit) modelUnit; String fullPathOfModelSourceUnit = ceylonUnit.getCeylonSourceFullPath(); if (fullPathOfModelSourceUnit != null && fullPathOfModelSourceUnit.equals(fullPathOfSourceUnitToTypecheck)) { return true; } } return false; } @Override public Declaration getDirectMember(String name, List<Type> signature, boolean ellipsis) { Declaration modelMember = modelPackage.getDirectMember(name, signature, ellipsis); return mustSearchInSourceFile(modelMember) ? super.getDirectMember(name, signature, ellipsis) : modelMember; } @Override public Declaration getMember(String name, List<Type> signature, boolean ellipsis) { Declaration modelMember = modelPackage.getMember(name, signature, ellipsis); return mustSearchInSourceFile(modelMember) ? super.getMember(name, signature, ellipsis) : modelMember; } @Override public List<Declaration> getMembers() { LinkedList<Declaration> ret = new LinkedList<Declaration>(); for (Declaration modelDeclaration : modelPackage.getMembers()) { if (! mustSearchInSourceFile(modelDeclaration)) { ret.add(modelDeclaration); } } ret.addAll(super.getMembers()); return ret; } @Override public Iterable<Unit> getUnits() { LinkedList<Unit> units = new LinkedList<Unit>(); for (Unit modelUnit : modelPackage.getUnits()) { if (! mustSearchInSourceFile(modelUnit)) { units.add(modelUnit); } } for (Unit u : super.getUnits()) { units.add(u); } return units; } @Override public List<Annotation> getAnnotations() { return modelPackage.getAnnotations(); } @Override public Scope getContainer() { return modelPackage.getContainer(); } @Override public Type getDeclaringType(Declaration modelDeclaration) { return mustSearchInSourceFile(modelDeclaration) ? super.getDeclaringType(modelDeclaration) : modelPackage.getDeclaringType(modelDeclaration); } @Override public Map<String, DeclarationWithProximity> getImportableDeclarations(Unit modelUnit, String startingWith, List<Import> imports, int proximity) { return modelPackage.getImportableDeclarations(modelUnit, startingWith, imports, proximity); } @Override public TypeDeclaration getInheritingDeclaration(Declaration d) { return modelPackage.getInheritingDeclaration(d); } @Override public Map<String, DeclarationWithProximity> getMatchingDeclarations( Unit unit, String startingWith, int proximity) { return super.getMatchingDeclarations(unit, startingWith, proximity); } @Override public Declaration getMemberOrParameter(Unit modelUnit, String name, List<Type> signature, boolean ellipsis) { Declaration modelMember = modelPackage.getMemberOrParameter(modelUnit, name, signature, ellipsis); return mustSearchInSourceFile(modelMember) ? super.getMemberOrParameter(modelUnit, name, signature, ellipsis) : modelMember; } @Override public Module getModule() { return modelPackage.getModule(); } @Override public List<String> getName() { return modelPackage.getName(); } @Override public String getNameAsString() { return modelPackage.getNameAsString(); } @Override public String getQualifiedNameString() { return modelPackage.getQualifiedNameString(); } @Override public Scope getScope() { return modelPackage.getScope(); } @Override public Unit getUnit() { Unit modelUnit = modelPackage.getUnit(); return mustSearchInSourceFile(modelUnit) ? super.getUnit() : modelUnit; } @Override public boolean isInherited(Declaration d) { return modelPackage.isInherited(d); } @Override public boolean isShared() { return modelPackage.isShared(); } public com.redhat.ceylon.model.typechecker.model.Package getModelPackage() { return modelPackage; } }