package com.anjlab.eclipse.tapestry5.internal; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.ui.services.IDisposable; import com.anjlab.eclipse.tapestry5.EclipseUtils; public class CompilationUnitContext implements IDisposable { public static abstract class CompilationUnitLifecycle { public abstract ICompilationUnit createCompilationUnit(); public void dispose(ICompilationUnit compilationUnit) { // Default implementation does nothing } } public static interface ContextRunnable { void run (CompilationUnitContext context) throws JavaModelException; } private final CompilationUnitLifecycle lifecycle; private ICompilationUnit compilationUnit; private boolean cuCreated; private CompilationUnit parsedUnit; private boolean cuParsed; public CompilationUnitContext(CompilationUnitLifecycle lifecycle) { this.lifecycle = lifecycle; } public ICompilationUnit getCompilationUnit() { if (!cuCreated) { cuCreated = true; compilationUnit = lifecycle.createCompilationUnit(); if (compilationUnit != null && !compilationUnit.exists()) { compilationUnit = null; } } return compilationUnit; } private CompilationUnit getParsedUnit() { if (!cuParsed) { cuParsed = true; try { parsedUnit = (CompilationUnit) EclipseUtils.parse(compilationUnit, ASTParser.K_COMPILATION_UNIT); } catch (Exception e) { // Ignore } } return parsedUnit; } public void accept(ASTVisitor visitor) { CompilationUnit unit = getParsedUnit(); if (unit != null) { unit.accept(visitor); } } public AST getAST() { CompilationUnit unit = getParsedUnit(); return unit == null ? null : unit.getAST(); } @Override public final void dispose() { if (compilationUnit != null) { lifecycle.dispose(compilationUnit); } } }