package com.redhat.ceylon.eclipse.core.model; import java.lang.ref.WeakReference; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IClassFile; import com.redhat.ceylon.compiler.typechecker.TypeChecker; import com.redhat.ceylon.eclipse.core.builder.CeylonBuilder; import com.redhat.ceylon.ide.common.typechecker.CrossProjectPhasedUnit; import com.redhat.ceylon.ide.common.typechecker.ProjectPhasedUnit; import com.redhat.ceylon.model.typechecker.model.Package; public class CrossProjectBinaryUnit extends CeylonBinaryUnit implements ICrossProjectReference { private WeakReference<ProjectPhasedUnit> originalProjectPhasedUnitRef = new WeakReference<ProjectPhasedUnit>(null); public CrossProjectBinaryUnit(IClassFile typeRoot, String fileName, String relativePath, String fullPath, Package pkg) { super(typeRoot, fileName, relativePath, fullPath, pkg); } @Override public IProject getResourceProject() { CrossProjectPhasedUnit<IProject,IResource,IFolder,IFile> pu = getPhasedUnit(); ProjectPhasedUnit<IProject,IResource,IFolder,IFile> ppu = pu!=null ? pu.getOriginalProjectPhasedUnit() : null; return ppu != null ? ppu.getResourceProject() : null; } @Override public IFolder getResourceRootFolder() { CrossProjectPhasedUnit<IProject,IResource,IFolder,IFile> pu = getPhasedUnit(); ProjectPhasedUnit<IProject,IResource,IFolder,IFile> ppu = pu!=null ? pu.getOriginalProjectPhasedUnit() : null; return ppu != null ? ppu.getResourceRootFolder() : null; } @Override public IFile getResourceFile() { ProjectPhasedUnit<IProject,IResource,IFolder,IFile> ppu = getPhasedUnit() .getOriginalProjectPhasedUnit(); return ppu != null ? ppu.getResourceFile() : null; } @Override public CrossProjectPhasedUnit<IProject,IResource,IFolder,IFile> getPhasedUnit() { return (CrossProjectPhasedUnit<IProject,IResource,IFolder,IFile>) super.getPhasedUnit(); } public ProjectSourceFile getOriginalSourceFile() { ProjectPhasedUnit<IProject,IResource,IFolder,IFile> ppu = getOriginalPhasedUnit(); return ppu != null ? (ProjectSourceFile) ppu.getUnit() : null; } @Override public ProjectPhasedUnit getOriginalPhasedUnit() { ProjectPhasedUnit originalPhasedUnit = originalProjectPhasedUnitRef.get(); if (originalPhasedUnit == null) { JDTModule module = getModule(); IProject originalProject = module.getOriginalProject(); if (originalProject != null) { TypeChecker originalTypeChecker = CeylonBuilder.getProjectTypeChecker(originalProject); if (originalTypeChecker != null) { String sourceRelativePath = module.toSourceUnitRelativePath(getRelativePath()); originalPhasedUnit = (ProjectPhasedUnit) originalTypeChecker.getPhasedUnitFromRelativePath(sourceRelativePath); if (originalPhasedUnit != null) { originalProjectPhasedUnitRef = new WeakReference<ProjectPhasedUnit>(originalPhasedUnit); } } } } return originalPhasedUnit; } }