Package org.eclipse.php.internal.core.builder

Source Code of org.eclipse.php.internal.core.builder.ParserBuildParticipantFactory

/*******************************************************************************
* Copyright (c) 2008, 2014 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)
*     Zend Technologies - [424340] Library Folders (Kaloyan Raev)
*******************************************************************************/
package org.eclipse.php.internal.core.builder;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.dltk.ast.declarations.ModuleDeclaration;
import org.eclipse.dltk.ast.parser.IModuleDeclaration;
import org.eclipse.dltk.ast.parser.ISourceParser;
import org.eclipse.dltk.compiler.env.IModuleSource;
import org.eclipse.dltk.compiler.problem.ProblemCollector;
import org.eclipse.dltk.core.*;
import org.eclipse.dltk.core.ISourceModuleInfoCache.ISourceModuleInfo;
import org.eclipse.dltk.core.builder.AbstractBuildParticipantType;
import org.eclipse.dltk.core.builder.IBuildContext;
import org.eclipse.dltk.core.builder.IBuildParticipant;
import org.eclipse.dltk.core.builder.IScriptBuilder;
import org.eclipse.dltk.internal.core.ModelManager;
import org.eclipse.php.core.libfolders.LibraryFolderManager;

public class ParserBuildParticipantFactory extends AbstractBuildParticipantType
    implements IExecutableExtension {

  @Override
  public IBuildParticipant createBuildParticipant(IScriptProject project)
      throws CoreException {
    if (natureId != null) {
      final ISourceParser parser = DLTKLanguageManager
          .getSourceParser(natureId);
      if (parser != null) {
        return new ParserBuildParticipant(parser);
      }
    }
    return null;
  }

  private String natureId = null;

  public void setInitializationData(IConfigurationElement config,
      String propertyName, Object data) throws CoreException {
    natureId = config.getAttribute("nature"); //$NON-NLS-1$
  }

  private static class ParserBuildParticipant implements IBuildParticipant {

    private final ISourceParser parser;

    public ParserBuildParticipant(ISourceParser parser) {
      this.parser = parser;
    }

    public void build(IBuildContext context) throws CoreException {
      IModelElement element = context.getModelElement();
      if (LibraryFolderManager.getInstance().isInLibraryFolder(
          element.getResource())) {
        // skip syntax check for code inside library folders
        return;
      }

      IModuleDeclaration moduleDeclaration = (ModuleDeclaration) context
          .get(IBuildContext.ATTR_MODULE_DECLARATION);
      if (moduleDeclaration != null) {
        // do nothing if already have AST - optimization for reconcile
        return;
      }
      // get cache entry
      final ISourceModuleInfo cacheEntry = ModelManager.getModelManager()
          .getSourceModuleInfoCache().get(context.getSourceModule());
      // if full build,do not use cache,or the error marker will not be
      // refreshed
      if (context.getBuildType() != IScriptBuilder.FULL_BUILD) {

        // check if there is cached AST
        moduleDeclaration = SourceParserUtil.getModuleFromCache(
            cacheEntry, context.getProblemReporter());
        if (moduleDeclaration != null) {
          // use AST from cache
          context.set(IBuildContext.ATTR_MODULE_DECLARATION,
              moduleDeclaration);
          return;
        }
      }

      // create problem collector
      final ProblemCollector problemCollector = new ProblemCollector();
      // parse
      moduleDeclaration = parser
          .parse((IModuleSource) context.getSourceModule(),
              problemCollector);
      // put result to the cache
      SourceParserUtil.putModuleToCache(cacheEntry, moduleDeclaration,
          problemCollector);
      // report errors to the build context
      problemCollector.copyTo(context.getProblemReporter());

      // push AST to build context
      context.set(IBuildContext.ATTR_MODULE_DECLARATION,
          moduleDeclaration);
    }
  }

}
TOP

Related Classes of org.eclipse.php.internal.core.builder.ParserBuildParticipantFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.