package com.redhat.ceylon.eclipse.core.model;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IJavaElement;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Package;
import com.redhat.ceylon.eclipse.core.typechecker.ExternalPhasedUnit;
import com.redhat.ceylon.ide.common.model.CeylonUnit;
/*
* Created inside the JDTModelLoader.getCompiledUnit() function if the unit is a ceylon one
*/
public class CeylonBinaryUnit extends CeylonUnit implements IJavaModelAware {
IClassFile classFileElement;
CeylonToJavaMatcher ceylonToJavaMatcher;
public CeylonBinaryUnit(IClassFile typeRoot, String fileName, String relativePath, String fullPath, Package pkg) {
super();
this.classFileElement = typeRoot;
ceylonToJavaMatcher = new CeylonToJavaMatcher(typeRoot);
setFilename(fileName);
setRelativePath(relativePath);
setFullPath(fullPath);
setPackage(pkg);
}
/*
* Might be null if no source is linked to this ModelLoader-originating unit
*
* (non-Javadoc)
* @see com.redhat.ceylon.eclipse.core.model.CeylonUnit#getPhasedUnit()
*/
@Override
public ExternalPhasedUnit getPhasedUnit() {
return (ExternalPhasedUnit) super.getPhasedUnit();
}
public IClassFile getTypeRoot() {
return classFileElement;
}
public IProject getProject() {
if (getTypeRoot() != null) {
return (IProject) getTypeRoot().getJavaProject().getProject();
}
return null;
}
@Override
protected ExternalPhasedUnit setPhasedUnitIfNecessary() {
ExternalPhasedUnit phasedUnit = null;
if (phasedUnitRef != null) {
phasedUnit = (ExternalPhasedUnit) phasedUnitRef.get();
}
if (phasedUnit == null) {
try {
JDTModule module = getModule();
if (module.getArtifact() != null) {
String binaryUnitRelativePath = getFullPath().replace(module.getArtifact().getPath() + "!/", "");
String sourceUnitRelativePath = module.toSourceUnitRelativePath(binaryUnitRelativePath);
if (sourceUnitRelativePath != null) {
phasedUnit = (ExternalPhasedUnit) module.getPhasedUnitFromRelativePath(sourceUnitRelativePath);
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
return phasedUnit != null ? createPhasedUnitRef(phasedUnit) : null;
}
@Override
public String getSourceFileName() {
String sourceRelativePath = getSourceRelativePath();
if (sourceRelativePath == null) {
return null;
}
String[] pathElements = sourceRelativePath.split("/");
return pathElements[pathElements.length-1];
}
@Override
public String getSourceRelativePath() {
return getModule().toSourceUnitRelativePath(getRelativePath());
}
@Override
public String getSourceFullPath() {
String sourceArchivePath = getModule().getSourceArchivePath();
if (sourceArchivePath == null) {
return null;
}
return sourceArchivePath + "!/" + getSourceRelativePath();
}
@Override
public String getCeylonSourceRelativePath() {
return getModule().getCeylonDeclarationFile(getSourceRelativePath());
}
@Override
public String getCeylonSourceFullPath() {
String sourceArchivePath = getModule().getSourceArchivePath();
if (sourceArchivePath == null) {
return null;
}
return sourceArchivePath + "!/" + getCeylonSourceRelativePath();
}
@Override
public IJavaElement toJavaElement(Declaration ceylonDeclaration, IProgressMonitor monitor) {
return ceylonToJavaMatcher.searchInClass(ceylonDeclaration, monitor);
}
@Override
public IJavaElement toJavaElement(Declaration ceylonDeclaration) {
return ceylonToJavaMatcher.searchInClass(ceylonDeclaration, null);
}
@Override
public String getCeylonFileName() {
String ceylonSourceRelativePath = getCeylonSourceRelativePath();
if (ceylonSourceRelativePath == null || ceylonSourceRelativePath.isEmpty()) {
return null;
}
String[] splitedPath = ceylonSourceRelativePath.split("/");
return splitedPath[splitedPath.length-1];
}
}