/******************************************************************************* * Copyright (c) 2013 The PDT Extension Group (https://github.com/pdt-eg) * 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 ******************************************************************************/ package org.pdtextensions.internal.semanticanalysis.validation; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IResource; import org.eclipse.dltk.ast.declarations.ModuleDeclaration; import org.eclipse.dltk.compiler.problem.ProblemSeverity; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.builder.IBuildContext; import org.eclipse.php.core.PHPVersion; import org.eclipse.php.core.project.ProjectOptions; import org.pdtextensions.semanticanalysis.model.validators.Validator; import org.pdtextensions.semanticanalysis.validation.IValidatorContext; import org.pdtextensions.semanticanalysis.validation.IValidatorIdentifier; import org.pdtextensions.semanticanalysis.validation.IValidatorManager; import org.pdtextensions.semanticanalysis.validation.Problem; /** * @author Dawid zulus Pakula <zulus@w3des.net> */ final public class ValidatorContext implements IValidatorContext { private static final String[] emptyArguments = new String[0]; private final ModuleDeclaration moduleDeclaration; private final IBuildContext buildContext; private final boolean derived; private final Map<IValidatorIdentifier, ProblemSeverity> severities; private final IValidatorManager manager; private ISourceModule workingCopy; private PHPVersion phpVersion; public ValidatorContext(Validator validator, ISourceModule workingCopy, IBuildContext buildContext, IValidatorManager manager) { this.buildContext = buildContext; this.derived = buildContext.getSourceModule().getResource().isDerived(IResource.CHECK_ANCESTORS); this.severities = new HashMap<IValidatorIdentifier, ProblemSeverity>(); this.manager = manager; this.workingCopy = workingCopy; if (buildContext.get(IBuildContext.ATTR_MODULE_DECLARATION) != null) { this.moduleDeclaration = (ModuleDeclaration) buildContext.get(IBuildContext.ATTR_MODULE_DECLARATION); } else { this.moduleDeclaration = null; } } @Override public ModuleDeclaration getModuleDeclaration() { return moduleDeclaration; } @Override public ISourceModule getSourceModule() { return workingCopy; } @Override public int getBuildType() { return buildContext.getBuildType(); } @Override public IBuildContext getRawContext() { return buildContext; } @Override public IScriptProject getProject() { return buildContext.getSourceModule().getScriptProject(); } @Override public PHPVersion getPHPVersion() { if (phpVersion == null) { phpVersion = ProjectOptions.getPHPVersion(getProject().getProject()); } return phpVersion; } @Override public boolean isDerived() { return derived; } @Override public void registerProblem(IValidatorIdentifier identifier, String message, int start, int stop) { registerProblem(identifier, message, start, stop, buildContext.getLineTracker().getLineNumberOfOffset(start), emptyArguments); } @Override public void registerProblem(IValidatorIdentifier identifier, String message, int start, int stop, int lineNumber) { registerProblem(identifier, message, start, stop, buildContext.getLineTracker().getLineNumberOfOffset(start), emptyArguments); } @Override public void registerProblem(IValidatorIdentifier identifier, String message, int start, int stop, String[] arguments) { registerProblem(identifier, message, start, stop, buildContext.getLineTracker().getLineNumberOfOffset(start), arguments); } @Override public void registerProblem(IValidatorIdentifier identifier, String message, int start, int stop, int lineNumber, String[] arguments) { buildContext.getProblemReporter().reportProblem(new Problem(identifier, getSeverity(identifier), identifier.getCategory(), arguments, message, buildContext.getFileName(), start, stop, lineNumber)); } private ProblemSeverity getSeverity(IValidatorIdentifier identifier) { if (!severities.containsKey(identifier)) { severities.put(identifier, manager.getSeverity(getProject(), manager.getType(identifier))); } return severities.get(identifier); } }