/******************************************************************************* * Copyright (c) 2008 xored software, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.tcl.internal.validators; import org.eclipse.dltk.ast.parser.IModuleDeclaration; import org.eclipse.dltk.compiler.problem.ProblemCollector; import org.eclipse.dltk.core.ISourceModuleInfoCache; import org.eclipse.dltk.core.SourceParserUtil; import org.eclipse.dltk.core.ISourceModuleInfoCache.ISourceModuleInfo; import org.eclipse.dltk.core.builder.IBuildContext; import org.eclipse.dltk.core.builder.IBuildContextExtension; import org.eclipse.dltk.core.caching.IContentCache; import org.eclipse.dltk.core.environment.EnvironmentPathUtils; import org.eclipse.dltk.core.environment.IFileHandle; import org.eclipse.dltk.internal.core.ModelManager; import org.eclipse.dltk.tcl.ast.TclModule; import org.eclipse.dltk.tcl.ast.TclModuleDeclaration; import org.eclipse.dltk.tcl.internal.core.TclASTCache; import org.eclipse.dltk.tcl.internal.parser.NewTclSourceParser; import org.eclipse.dltk.tcl.parser.TclErrorCollector; import org.eclipse.dltk.tcl.parser.TclParser; import org.eclipse.dltk.tcl.parser.definitions.DefinitionManager; public class TclBuildContext { private static final String NEW_AST = "new_ast"; //$NON-NLS-1$ private static final String NEW_PROBLEMS = "new_ast_problems"; //$NON-NLS-1$ private static final String PROBLEMS_REPORTED = "problemsReported"; //$NON-NLS-1$ private static boolean isReported(IBuildContext context) { return context.get(PROBLEMS_REPORTED) != null; } private static void setReported(IBuildContext context) { context.set(PROBLEMS_REPORTED, Boolean.TRUE); } public static TclModule getStatements(IBuildContext context) { Object object = context.get(NEW_AST); if (object != null && object instanceof TclModule) { if (!isReported(context)) { Object object2 = context.get(NEW_PROBLEMS); if (object2 instanceof ProblemCollector) { ProblemCollector collector = (ProblemCollector) object2; collector.copyTo(context.getProblemReporter()); } setReported(context); } TclModule module = (TclModule) object; restoreLineTracker(context, module); return module; } // Parse and store statements here. ISourceModuleInfoCache infoCache = SourceParserUtil.getCache(); ISourceModuleInfo info = infoCache.get(context.getSourceModule()); ProblemCollector collector = new ProblemCollector(); IModuleDeclaration cache = SourceParserUtil.getModuleFromCache(info, collector); if (cache instanceof TclModuleDeclaration) { TclModuleDeclaration decl = (TclModuleDeclaration) cache; TclModule tclModule = decl.getTclModule(); if (tclModule != null) { if (!isReported(context)) { collector.copyTo(context.getProblemReporter()); setReported(context); } restoreLineTracker(context, tclModule); return tclModule; } } // Try to load module info from disk cache directly. IFileHandle handle = EnvironmentPathUtils.getFile(context .getSourceModule()); if (handle != null) { IContentCache coreCache = ModelManager.getModelManager() .getCoreCache(); TclModule module = TclASTCache.restoreTclModuleFromCache(handle, coreCache, collector); if (!isReported(context)) { collector.copyTo(context.getProblemReporter()); setReported(context); } if (module != null) { context.set(NEW_AST, module); context.set(NEW_PROBLEMS, collector); restoreLineTracker(context, module); // Save also to memory cache. return module; } } TclParser parser = new TclParser(); TclErrorCollector tclCollector = new TclErrorCollector(); TclModule module = parser.parseModule( new String(context.getContents()), tclCollector, DefinitionManager.getInstance().createProcessor()); if (!isReported(context)) { tclCollector.reportAll(context.getProblemReporter(), context .getLineTracker()); setReported(context); } context.set(NEW_AST, module); context.set(NEW_PROBLEMS, collector); restoreLineTracker(context, module); return module; } /** * Restores lineTracker to the context if it was not already created. * * @param context * @param module */ private static void restoreLineTracker(IBuildContext context, TclModule module) { IBuildContextExtension eContext = (IBuildContextExtension) context; if (!eContext.isLineTrackerCreated()) { eContext.setLineTracker(NewTclSourceParser .createLineTracker(module)); } } }