/******************************************************************************* * Copyright (c) 2011 Gerd Wuetherich (gerd@gerd-wuetherich.de). * 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: * Gerd Wuetherich (gerd@gerd-wuetherich.de) - initial API and implementation ******************************************************************************/ package org.bundlemaker.core.jdt.internal.parser; import org.bundlemaker.core.jdt.content.JdtProjectContentProvider; import org.bundlemaker.core.jdt.parser.CoreParserJdt; import org.bundlemaker.core.jtype.IParsableTypeResource; import org.bundlemaker.core.jtype.IType; import org.bundlemaker.core.jtype.JavaTypeUtils; import org.bundlemaker.core.parser.IParserAwareBundleMakerProject; import org.bundlemaker.core.parser.IProblem; import org.bundlemaker.core.project.IProjectContentEntry; import org.bundlemaker.core.spi.parser.AbstractParser; import org.bundlemaker.core.spi.parser.IParsableResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; /** * <p> * </p> * * @author Gerd Wütherich (gerd@gerd-wuetherich.de) */ public class JdtParser extends AbstractParser { /** the AST parser */ private ASTParser _parser; /** * <p> * </p> * * @throws CoreException */ public JdtParser() throws CoreException { // create the AST parser _parser = ASTParser.newParser(AST.JLS4); } @Override public void batchParseStart(IParserAwareBundleMakerProject bundleMakerProject) throws CoreException { // create or get the java project if (!JdtProjectHelper.hasAssociatedJavaProject(bundleMakerProject)) { JdtProjectHelper.newAssociatedJavaProject(bundleMakerProject); } JdtProjectHelper.setupAssociatedJavaProject(bundleMakerProject); } @Override public void batchParseStop(IParserAwareBundleMakerProject bundleMakerProject) { JdtProjectHelper.deleteAssociatedProjectIfNecessary(bundleMakerProject.getProject()); } /** * {@inheritDoc} */ @Override public ParserType getParserType() { return ParserType.SOURCE; } @Override public boolean canParse(IParsableResource resource) { return resource.getPath().endsWith(".java"); } /** * {@inheritDoc} */ @Override protected synchronized void doParseResource(IProjectContentEntry projectContent, IParsableResource resource, boolean parseReferences, boolean isBatchParse) { // if (!canParse(resource)) { return; } try { _parser.setSource(new String(resource.getContent()).toCharArray()); _parser.setResolveBindings(true); if (isBatchParse) { // the associated java project IJavaProject javaProject = JdtProjectHelper.getAssociatedJavaProject(projectContent.getProvider() .getBundleMakerProject()); _parser.setProject(javaProject); // Override (default) Compiler Options from Java Project with 'our' options _parser.setCompilerOptions(CoreParserJdt.getCompilerOptionsWithComplianceLevel(javaProject.getOptions(true))); _parser.setUnitName("/" + javaProject.getProject().getName() + "/" + resource.getPath()); } else { if (projectContent.getProvider() instanceof JdtProjectContentProvider) { // reset model extension resource.addResourceModelExtension(null); String root = resource.getRoot(); IJavaProject javaProject = ((JdtProjectContentProvider) projectContent.getProvider()).getSourceJavaProject( projectContent, root); _parser.setProject(javaProject); _parser.setUnitName("/" + javaProject.getProject().getName() + "/" + resource.getPath()); } } // // step 1: set the directly referenced types JdtAstVisitor visitor = new JdtAstVisitor(resource); ((CompilationUnit) _parser.createAST(null)).accept(visitor); // step 4: add the errors to the error list for (IProblem problem : visitor.getProblems()) { // add errors if (problem.isError()) { getProblems().add(problem); } } // set the primary type String primaryTypeName = JavaTypeUtils.convertToFullyQualifiedName(resource.getPath(), ".java"); IType primaryType = resource.adaptAs(IParsableTypeResource.class).getType(primaryTypeName); resource.adaptAs(IParsableTypeResource.class).setPrimaryType(primaryType); } catch (Exception e) { getProblems().add(new IProblem.DefaultProblem(resource, "Error while parsing: " + e)); e.printStackTrace(); } } }