package com.redhat.ceylon.eclipse.core.model; import org.antlr.runtime.CommonTokenStream; 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 com.redhat.ceylon.compiler.java.loader.UnknownTypeCollector; import com.redhat.ceylon.compiler.java.runtime.metamodel.ModelError; import com.redhat.ceylon.compiler.typechecker.TypeChecker; import com.redhat.ceylon.model.typechecker.util.ModuleManager; import com.redhat.ceylon.compiler.typechecker.analyzer.ModuleSourceMapper; import com.redhat.ceylon.compiler.typechecker.context.PhasedUnit; import com.redhat.ceylon.compiler.typechecker.context.PhasedUnits; import com.redhat.ceylon.model.typechecker.model.Declaration; import com.redhat.ceylon.model.typechecker.model.Package; import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit; import com.redhat.ceylon.eclipse.core.typechecker.IdePhasedUnitUtils; import com.redhat.ceylon.eclipse.core.typechecker.ProjectPhasedUnit; import com.redhat.ceylon.eclipse.core.vfs.vfsJ2C; import com.redhat.ceylon.ide.common.model.ModifiableSourceFile; import com.redhat.ceylon.ide.common.model.delta.CompilationUnitDelta; import com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory; import com.redhat.ceylon.ide.common.vfs.FileVirtualFile; import com.redhat.ceylon.ide.common.vfs.FolderVirtualFile; import com.redhat.ceylon.eclipse.util.CeylonSourceParser; import com.redhat.ceylon.eclipse.util.SingleSourceUnitPackage; public class ProjectSourceFile extends ModifiableSourceFile { static private DeltaBuilderFactory deltaBuilderFactory = new DeltaBuilderFactory(); public ProjectSourceFile(ProjectPhasedUnit phasedUnit) { super(phasedUnit); } @Override public ProjectPhasedUnit getPhasedUnit() { return (ProjectPhasedUnit) super.getPhasedUnit(); } @Override public IProject getResourceProject() { ProjectPhasedUnit phasedUnit = getPhasedUnit(); return phasedUnit==null ? null : phasedUnit.getResourceProject(); } @Override public IFile getResourceFile() { ProjectPhasedUnit phasedUnit = getPhasedUnit(); return phasedUnit==null ? null : phasedUnit.getResourceFile(); } @Override public IFolder getResourceRootFolder() { ProjectPhasedUnit phasedUnit = getPhasedUnit(); return phasedUnit==null ? null : phasedUnit.getResourceRootFolder(); } public CompilationUnitDelta buildDeltaAgainstModel() { try { final ProjectPhasedUnit modelPhaseUnit = getPhasedUnit(); if (modelPhaseUnit != null) { final FileVirtualFile<IResource, IFolder, IFile> virtualSrcFile = vfsJ2C.createVirtualFile( modelPhaseUnit.getResourceFile()); final FolderVirtualFile<IResource, IFolder, IFile> virtualSrcDir = vfsJ2C.createVirtualFolder( modelPhaseUnit.getResourceRootFolder()); final TypeChecker currentTypechecker = modelPhaseUnit.getTypeChecker(); PhasedUnits phasedUnits = currentTypechecker.getPhasedUnits(); final ModuleManager currentModuleManager = phasedUnits.getModuleManager(); final ModuleSourceMapper currentModuleSourceMapper = phasedUnits.getModuleSourceMapper(); Package singleSourceUnitPackage = new SingleSourceUnitPackage(getPackage(), virtualSrcFile.getPath()); PhasedUnit lastPhasedUnit = new CeylonSourceParser<PhasedUnit>() { @Override protected String getCharset() { try { return modelPhaseUnit.getResourceProject() .getDefaultCharset(); } catch (Exception e) { throw new RuntimeException(e); } } @SuppressWarnings("unchecked") @Override protected PhasedUnit createPhasedUnit( CompilationUnit cu, Package pkg, CommonTokenStream tokenStream) { return new PhasedUnit(virtualSrcFile, virtualSrcDir, cu, pkg, currentModuleManager, currentModuleSourceMapper, currentTypechecker.getContext(), tokenStream.getTokens()) { @Override protected boolean isAllowedToChangeModel(Declaration declaration) { return ! IdePhasedUnitUtils.isCentralModelDeclaration(declaration); } }; } }.parseFileToPhasedUnit( currentModuleManager, currentTypechecker, virtualSrcFile, virtualSrcDir, singleSourceUnitPackage); if (lastPhasedUnit != null) { lastPhasedUnit.validateTree(); lastPhasedUnit.visitSrcModulePhase(); lastPhasedUnit.visitRemainingModulePhase(); lastPhasedUnit.scanDeclarations(); lastPhasedUnit.scanTypeDeclarations(); lastPhasedUnit.validateRefinement(); lastPhasedUnit.analyseTypes(); lastPhasedUnit.analyseFlow(); UnknownTypeCollector utc = new UnknownTypeCollector(); lastPhasedUnit.getCompilationUnit().visit(utc); if (lastPhasedUnit.getCompilationUnit() .getErrors().isEmpty()) { return deltaBuilderFactory.buildDeltas( modelPhaseUnit, lastPhasedUnit); } } } } catch(Exception e) { } catch(ceylon.language.AssertionError | ModelError e) { e.printStackTrace(); } return null; } }