/******************************************************************************* * Copyright (c) 2005, 2016 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.dltk.core; import org.eclipse.dltk.ast.declarations.ModuleDeclaration; import org.eclipse.dltk.compiler.ISourceElementRequestor; import org.eclipse.dltk.compiler.SourceElementRequestVisitor; import org.eclipse.dltk.compiler.env.IModuleSource; import org.eclipse.dltk.compiler.problem.IProblemReporter; public abstract class AbstractSourceElementParser implements ISourceElementParser { private ISourceElementRequestor sourceElementRequestor = null; private IProblemReporter problemReporter; @Override public void parseSourceModule(IModuleSource module) { final ModuleDeclaration moduleDeclaration = parse(module); if (moduleDeclaration != null) { final SourceElementRequestVisitor requestor = createVisitor(); try { moduleDeclaration.traverse(requestor); } catch (Exception e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } } } protected ModuleDeclaration parse(IModuleSource module) { if (module instanceof ISourceModule) { // use source module cache return SourceParserUtil.getModuleDeclaration( (ISourceModule) module, problemReporter); } else { // parse directly without cache return SourceParserUtil.getModuleDeclaration(module, getNatureId(), problemReporter); } } @Override public void setReporter(IProblemReporter reporter) { this.problemReporter = reporter; } @Override public void setRequestor(ISourceElementRequestor requestor) { this.sourceElementRequestor = requestor; } protected ISourceElementRequestor getRequestor() { return sourceElementRequestor; } protected IProblemReporter getProblemReporter() { return problemReporter; } /** * Returns the language's nature id */ protected abstract String getNatureId(); /** * Creates a new source element visitor * * <p> * Sub-classes should use <code>getRequstor</code> and * <code>getProblemReporter</code> if they need access to a source element * requestor and/or a problem reporter. * </p> */ protected SourceElementRequestVisitor createVisitor() { return new SourceElementRequestVisitor(getRequestor()); } }