package com.redhat.ceylon.eclipse.core.typechecker;
import java.lang.ref.WeakReference;
import java.util.List;
import org.antlr.runtime.CommonToken;
import org.eclipse.core.resources.IProject;
import com.redhat.ceylon.compiler.typechecker.TypeChecker;
import com.redhat.ceylon.compiler.typechecker.analyzer.ModuleSourceMapper;
import com.redhat.ceylon.compiler.typechecker.context.TypecheckerUnit;
import com.redhat.ceylon.compiler.typechecker.io.VirtualFile;
import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit;
import com.redhat.ceylon.eclipse.core.builder.CeylonBuilder;
import com.redhat.ceylon.eclipse.core.model.CrossProjectSourceFile;
import com.redhat.ceylon.model.typechecker.model.Package;
import com.redhat.ceylon.model.typechecker.util.ModuleManager;
public class CrossProjectPhasedUnit extends ExternalPhasedUnit {
private WeakReference<IProject> originalProjectRef = new WeakReference<IProject>(null);
private WeakReference<ProjectPhasedUnit> originalProjectPhasedUnitRef = new WeakReference<ProjectPhasedUnit>(null);
public CrossProjectPhasedUnit(CrossProjectPhasedUnit other) {
super(other);
originalProjectRef = new WeakReference<IProject>(other.originalProjectRef.get());
originalProjectPhasedUnitRef = new WeakReference<ProjectPhasedUnit>(other.getOriginalProjectPhasedUnit());
}
public CrossProjectPhasedUnit(VirtualFile unitFile, VirtualFile srcDir,
CompilationUnit cu, Package p, ModuleManager moduleManager,
ModuleSourceMapper moduleSourceMapper, TypeChecker typeChecker, List<CommonToken> tokenStream, IProject originalProject) {
super(unitFile, srcDir, cu, p, moduleManager, moduleSourceMapper, typeChecker, tokenStream);
originalProjectRef = new WeakReference<IProject>(originalProject);
}
public ProjectPhasedUnit getOriginalProjectPhasedUnit() {
ProjectPhasedUnit originalPhasedUnit = originalProjectPhasedUnitRef.get();
if (originalPhasedUnit == null) {
IProject originalProject = originalProjectRef.get();
if (originalProject != null) {
TypeChecker originalTypeChecker = CeylonBuilder.getProjectTypeChecker(originalProject);
if (originalTypeChecker != null) {
originalPhasedUnit = (ProjectPhasedUnit) originalTypeChecker.getPhasedUnitFromRelativePath(getPathRelativeToSrcDir());
originalProjectPhasedUnitRef = new WeakReference<ProjectPhasedUnit>(originalPhasedUnit);
}
}
}
return originalPhasedUnit;
}
@Override
protected TypecheckerUnit newUnit() {
return new CrossProjectSourceFile(this);
}
@Override
public CrossProjectSourceFile getUnit() {
return (CrossProjectSourceFile) super.getUnit();
}
}