blob: 616263f2019fb9ea7205e6c54b9314e3b52802b3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ruta.ide.validator;
import java.util.List;
import org.apache.uima.ruta.ide.core.extensions.IRutaCheckerProblemFactory;
import org.apache.uima.ruta.ide.parser.ast.RutaAbstractDeclaration;
import org.apache.uima.ruta.ide.parser.ast.RutaAction;
import org.apache.uima.ruta.ide.parser.ast.RutaCondition;
import org.apache.uima.ruta.ide.parser.ast.RutaFeatureDeclaration;
import org.apache.uima.ruta.ide.parser.ast.RutaFunction;
import org.apache.uima.ruta.ide.parser.ast.RutaVariableReference;
import org.eclipse.dltk.ast.ASTListNode;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.expressions.Expression;
import org.eclipse.dltk.ast.expressions.StringLiteral;
import org.eclipse.dltk.compiler.problem.IProblem;
import org.eclipse.dltk.compiler.problem.ProblemSeverity;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.builder.ISourceLineTracker;
public class RutaCheckerProblemFactory implements IRutaCheckerProblemFactory{
private ISourceLineTracker linetracker;
private String fileName;
public RutaCheckerProblemFactory(String fileName, ISourceLineTracker linetracker) {
this.fileName = fileName;
this.linetracker = linetracker;
}
public IProblem createIdConflictsWithVariableProblem(RutaAbstractDeclaration varRef) {
String message = generateVarAlreadyDeclaredProblemMsg(varRef);
return new RutaCheckerDefaultProblem(this.fileName, message, varRef, getLine(varRef));
}
public IProblem createIdConflictsWithTypeProblem(RutaAbstractDeclaration varRef) {
String message = generateVarConflictsWithTypeProblem(varRef);
return new RutaCheckerDefaultProblem(this.fileName, message, varRef, getLine(varRef));
}
public IProblem createFileNotFoundProblem(ASTNode node, String localPath) {
return new RutaCheckerDefaultProblem(this.fileName, generateFileNotFoundProblemMsg(localPath),
node, getLine(node));
}
public IProblem createFileNotFoundProblem(ASTNode fileNode) {
return createFileNotFoundProblem(fileNode, fileNode.toString());
// generateFileNotFoundProblemMsg(fileNode));
}
public IProblem createDuplicateShortNameInImported(ASTNode node, String localPath,
List<String> checkDuplicateShortNames, ProblemSeverity severity) {
StringBuilder sb = new StringBuilder();
for (String string : checkDuplicateShortNames) {
sb.append(string);
sb.append(", ");
}
return new RutaCheckerDefaultProblem(this.fileName, "Types in " + localPath
+ " share same short name, but with different namespaces: " + sb.toString(), node,
getLine(node), severity);
}
public IProblem createDuplicateShortName(RutaAbstractDeclaration var, ProblemSeverity severity) {
return new RutaCheckerDefaultProblem(this.fileName, "The type " + var.getName()
+ " conflicts with other types with same short name, but different namespace.", var,
getLine(var), severity);
}
public IProblem createXMLProblem(ASTNode node, String localPath) {
return new RutaCheckerDefaultProblem(this.fileName, generateXMLProblemMsg(localPath), node,
getLine(node));
}
public IProblem createTypeProblem(RutaVariableReference ref, ISourceModule currentFile) {
String errMsgHead = "Type \"";
String errMsgTailDefault = " \" not defined in this script/block!";
String errMsg = errMsgHead + ref.getName() + errMsgTailDefault;
IProblem problem = new RutaCheckerDefaultProblem(currentFile.getElementName(), errMsg, ref,
linetracker.getLineNumberOfOffset(ref.sourceStart()));
return problem;
}
private String generateFileNotFoundProblemMsg(ASTNode node) {
return generateFileNotFoundProblemMsg(node.toString());
}
private String generateFileNotFoundProblemMsg(String fileName) {
return "error: \"" + fileName + "\" not found.";
}
private String generateXMLProblemMsg(String fileName) {
return "error: " + fileName + " causes xml problem.";
}
private int getLine(ASTNode varRef) {
return this.linetracker.getLineNumberOfOffset(varRef.sourceStart());
}
private String generateVarAlreadyDeclaredProblemMsg(RutaAbstractDeclaration var) {
return "error: Id \"" + var.getName() + "\" conflicts with already declared variable.";
}
private String generateVarConflictsWithTypeProblem(RutaAbstractDeclaration var) {
return "error: Identifier \"" + var.getName()
+ "\" conflicts with already declared annotation type.";
}
public IProblem createUnknownFeatureTypeProblem(RutaFeatureDeclaration var) {
String message = "error: Type \"" + var.getType() + "\" of Feature \"" + var.getName()
+ "\" is not defined.";
return new RutaCheckerDefaultProblem(this.fileName, message, var, getLine(var));
}
public IProblem createUnknownFeatureProblem(Expression var, String matchedType) {
// TODO refactor and find better solution
String feat = var.toString();
List childs = var.getChilds();
if (childs != null && !childs.isEmpty()) {
Object object = childs.get(0);
if (object instanceof ASTListNode) {
List childs2 = ((ASTListNode) object).getChilds();
if (childs2 != null && !childs2.isEmpty()) {
Object object2 = childs2.get(0);
if (object2 instanceof StringLiteral) {
StringLiteral sl = (StringLiteral) object2;
feat = sl.getValue().replaceAll("\"", "");
}
}
}
}
String message = "error: Feature \"" + feat + "\" is not defined.";
if (matchedType != null) {
message = "error: Feature \"" + feat + "\" is not defined for type \"" + matchedType + "\".";
}
return new RutaCheckerDefaultProblem(this.fileName, message, var, getLine(var));
}
public IProblem createWrongArgumentTypeProblem(Expression was, String expected) {
String message = "Wrong kind of argument: expected " + expected;
return new RutaCheckerDefaultProblem(this.fileName, message, was, getLine(was));
}
public IProblem createInheritenceFinalProblem(RutaVariableReference parent) {
String message = "Type \"" + parent.getName()
+ "\" is final and cannot be used as a parent type.";
return new RutaCheckerDefaultProblem(this.fileName, message, parent, getLine(parent));
}
public IProblem createUnknownConditionProblem(RutaCondition cond) {
String message = "error: Condition \"" + cond.getName() + "\" is not defined.";
return new RutaCheckerDefaultProblem(this.fileName, message, cond, getLine(cond));
}
public IProblem createUnknownActionProblem(RutaAction action) {
String message = "error: Action \"" + action.getName() + "\" is not defined.";
return new RutaCheckerDefaultProblem(this.fileName, message, action, getLine(action));
}
public IProblem createWrongNumberOfArgumentsProblem(String name, Expression element, int expected) {
String message = "error: The element " + name + " expects " + expected + " arguments.";
return new RutaCheckerDefaultProblem(this.fileName, message, element, getLine(element));
}
public IProblem createUnknownFunctionProblem(RutaFunction f) {
String message = "error: Function \"" + f.getName() + "\" is not defined.";
return new RutaCheckerDefaultProblem(this.fileName, message, f, getLine(f));
}
}