Author: pkluegl Date: Fri Apr 26 11:43:48 2013 New Revision: 1476150 URL: http://svn.apache.org/r1476150 Log: UIMA-2834 - fixed syntax checking of external language elements
Modified: uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/pom.xml uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/src/main/java/org/apache/uima/textmarker/example/extensions/ExampleActionIDEExtension.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/ITextMarkerExtension.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/TextMarkerExternalFactory.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/parser/TextMarkerSourceElementRequestVisitor.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerAbstractDeclaration.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerExpression.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerFeatureDeclaration.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerTypeDeclaration.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerVariableDeclaration.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerCheckerProblemFactory.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerTypeChecker.java uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerVarRefChecker.java Modified: uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/pom.xml URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/pom.xml?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/pom.xml (original) +++ uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/pom.xml Fri Apr 26 11:43:48 2013 @@ -109,7 +109,8 @@ <Require-Bundle> org.apache.uima.runtime, org.apache.uima.textmarker.engine, - org.apache.uima.textmarker.ide + org.apache.uima.textmarker.ide, + org.eclipse.dltk.core;bundle-version="[3.0.0,5.0.0)" </Require-Bundle> <Import-Package> </Import-Package> Modified: uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/src/main/java/org/apache/uima/textmarker/example/extensions/ExampleActionIDEExtension.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/src/main/java/org/apache/uima/textmarker/example/extensions/ExampleActionIDEExtension.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/src/main/java/org/apache/uima/textmarker/example/extensions/ExampleActionIDEExtension.java (original) +++ uima/sandbox/textmarker/trunk/example-projects/textmarker-ep-example-extensions/src/main/java/org/apache/uima/textmarker/example/extensions/ExampleActionIDEExtension.java Fri Apr 26 11:43:48 2013 @@ -3,19 +3,43 @@ package org.apache.uima.textmarker.examp import java.util.List; import org.antlr.runtime.RecognitionException; -import org.antlr.runtime.Token; import org.apache.uima.textmarker.ide.core.extensions.IIDEActionExtension; +import org.apache.uima.textmarker.ide.parser.ast.TMTypeConstants; +import org.apache.uima.textmarker.ide.parser.ast.TextMarkerAction; +import org.apache.uima.textmarker.ide.validator.TextMarkerCheckerProblemFactory; import org.eclipse.dltk.ast.expressions.Expression; +import org.eclipse.dltk.compiler.problem.IProblem; +import org.eclipse.dltk.compiler.problem.IProblemReporter; public class ExampleActionIDEExtension implements IIDEActionExtension { - private final String[] strings = new String[] {"ExampleAction"}; + private final String[] strings = new String[] { "ExampleAction" }; public String[] getKnownExtensions() { return strings; } - public void checkSyntax(Token name, List<Expression> arguments) throws RecognitionException { -// TODO + public boolean checkSyntax(Expression element, TextMarkerCheckerProblemFactory problemFactory, + IProblemReporter rep) throws RecognitionException { + if (element instanceof TextMarkerAction) { + TextMarkerAction a = (TextMarkerAction) element; + String name = a.getName(); + if (!name.equals(strings[0])) { + IProblem problem = problemFactory.createUnknownActionProblem(a); + rep.reportProblem(problem); + return false; + } + boolean ok = true; + List<Expression> childs = a.getChilds(); + for (Expression expression : childs) { + if (expression.getKind() != TMTypeConstants.TM_TYPE_N) { + IProblem problem = problemFactory.createWrongArgumentTypeProblem(expression, "NumberExpression"); + rep.reportProblem(problem); + ok = false; + } + } + return ok; + } + return false; } } Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/ITextMarkerExtension.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/ITextMarkerExtension.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/ITextMarkerExtension.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/ITextMarkerExtension.java Fri Apr 26 11:43:48 2013 @@ -19,16 +19,15 @@ package org.apache.uima.textmarker.ide.core.extensions; -import java.util.List; - import org.antlr.runtime.RecognitionException; -import org.antlr.runtime.Token; +import org.apache.uima.textmarker.ide.validator.TextMarkerCheckerProblemFactory; import org.eclipse.dltk.ast.expressions.Expression; +import org.eclipse.dltk.compiler.problem.IProblemReporter; public interface ITextMarkerExtension { String[] getKnownExtensions(); - void checkSyntax(Token name, List<Expression> arguments) throws RecognitionException; + boolean checkSyntax(Expression element, TextMarkerCheckerProblemFactory problemFactory, IProblemReporter rep) throws RecognitionException; } Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/TextMarkerExternalFactory.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/TextMarkerExternalFactory.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/TextMarkerExternalFactory.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/extensions/TextMarkerExternalFactory.java Fri Apr 26 11:43:48 2013 @@ -19,13 +19,10 @@ package org.apache.uima.textmarker.ide.core.extensions; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; -import org.apache.uima.textmarker.ide.core.TextMarkerExtensionManager; import org.apache.uima.textmarker.ide.parser.ast.ActionFactory; import org.apache.uima.textmarker.ide.parser.ast.ConditionFactory; import org.apache.uima.textmarker.ide.parser.ast.ExpressionFactory; @@ -35,141 +32,39 @@ import org.eclipse.dltk.ast.expressions. public class TextMarkerExternalFactory { - private Map<String, IIDEConditionExtension> conditionExtensions; - - private Map<String, IIDEActionExtension> actionExtensions; - - private Map<String, IIDENumberFunctionExtension> numberFunctionExtensions; - - private Map<String, IIDEBooleanFunctionExtension> booleanFunctionExtensions; - - private Map<String, IIDEStringFunctionExtension> stringFunctionExtensions; - - private Map<String, IIDETypeFunctionExtension> typeFunctionExtensions; - public TextMarkerExternalFactory() { super(); - conditionExtensions = new HashMap<String, IIDEConditionExtension>(); - actionExtensions = new HashMap<String, IIDEActionExtension>(); - numberFunctionExtensions = new HashMap<String, IIDENumberFunctionExtension>(); - booleanFunctionExtensions = new HashMap<String, IIDEBooleanFunctionExtension>(); - stringFunctionExtensions = new HashMap<String, IIDEStringFunctionExtension>(); - typeFunctionExtensions = new HashMap<String, IIDETypeFunctionExtension>(); - IIDEConditionExtension[] cextensions = TextMarkerExtensionManager.getDefault() - .getIDEConditionExtensions(); - for (IIDEConditionExtension each : cextensions) { - String[] knownExtensions = each.getKnownExtensions(); - for (String string : knownExtensions) { - conditionExtensions.put(string, each); - } - } - IIDEActionExtension[] aextensions = TextMarkerExtensionManager.getDefault() - .getIDEActionExtensions(); - for (IIDEActionExtension each : aextensions) { - String[] knownExtensions = each.getKnownExtensions(); - for (String string : knownExtensions) { - actionExtensions.put(string, each); - } - } - IIDENumberFunctionExtension[] nfextensions = TextMarkerExtensionManager.getDefault() - .getIDENumberFunctionExtensions(); - for (IIDENumberFunctionExtension each : nfextensions) { - String[] knownExtensions = each.getKnownExtensions(); - for (String string : knownExtensions) { - numberFunctionExtensions.put(string, each); - } - } - IIDEBooleanFunctionExtension[] bfextensions = TextMarkerExtensionManager.getDefault() - .getIDEBooleanFunctionExtensions(); - for (IIDEBooleanFunctionExtension each : bfextensions) { - String[] knownExtensions = each.getKnownExtensions(); - for (String string : knownExtensions) { - booleanFunctionExtensions.put(string, each); - } - } - IIDEStringFunctionExtension[] sfextensions = TextMarkerExtensionManager.getDefault() - .getIDEStringFunctionExtensions(); - for (IIDEStringFunctionExtension each : sfextensions) { - String[] knownExtensions = each.getKnownExtensions(); - for (String string : knownExtensions) { - stringFunctionExtensions.put(string, each); - } - } - IIDETypeFunctionExtension[] tfextensions = TextMarkerExtensionManager.getDefault() - .getIDETypeFunctionExtensions(); - for (IIDETypeFunctionExtension each : tfextensions) { - String[] knownExtensions = each.getKnownExtensions(); - for (String string : knownExtensions) { - typeFunctionExtensions.put(string, each); - } - } - } public TextMarkerCondition createExternalCondition(Token id, List<Expression> args) throws RecognitionException { - String name = id.getText(); - ITextMarkerExtension extension = conditionExtensions.get(name); - extension.checkSyntax(id, args); return ConditionFactory.createCondition(id, args); } public TextMarkerAction createExternalAction(Token id, List<Expression> args) throws RecognitionException { - String name = id.getText(); - ITextMarkerExtension extension = actionExtensions.get(name); - extension.checkSyntax(id, args); return ActionFactory.createAction(id, args); } public Expression createExternalNumberFunction(Token id, List<Expression> args) throws RecognitionException { - String name = id.getText(); - ITextMarkerExtension extension = numberFunctionExtensions.get(name); - extension.checkSyntax(id, args); return ExpressionFactory.createNumberFunction(id, args); } public Expression createExternalBooleanFunction(Token id, List<Expression> args) throws RecognitionException { - String name = id.getText(); - ITextMarkerExtension extension = booleanFunctionExtensions.get(name); - extension.checkSyntax(id, args); return ExpressionFactory.createBooleanFunction(id, args); } public Expression createExternalStringFunction(Token id, List<Expression> args) throws RecognitionException { - String name = id.getText(); - ITextMarkerExtension extension = stringFunctionExtensions.get(name); - extension.checkSyntax(id, args); return ExpressionFactory.createStringFunction(id, args); } public Expression createExternalTypeFunction(Token id, List<Expression> args) throws RecognitionException { - String name = id.getText(); - ITextMarkerExtension extension = typeFunctionExtensions.get(name); - extension.checkSyntax(id, args); return ExpressionFactory.createTypeFunction(id, args); } - - public void addExtension(String id, ITextMarkerExtension extension) { - if (extension instanceof IIDEActionExtension) { - addActionExtension(id, (IIDEActionExtension) extension); - } else if (extension instanceof IIDEConditionExtension) { - addConditionExtension(id, (IIDEConditionExtension) extension); - } - } - - public void addConditionExtension(String id, IIDEConditionExtension extension) { - conditionExtensions.put(id, extension); - } - - public void addActionExtension(String id, IIDEActionExtension extension) { - actionExtensions.put(id, extension); - } - } Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/parser/TextMarkerSourceElementRequestVisitor.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/parser/TextMarkerSourceElementRequestVisitor.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/parser/TextMarkerSourceElementRequestVisitor.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/core/parser/TextMarkerSourceElementRequestVisitor.java Fri Apr 26 11:43:48 2013 @@ -211,7 +211,7 @@ public class TextMarkerSourceElementRequ int modifier = Modifiers.AccDefault; if (fullDeclaration instanceof TextMarkerVariableDeclaration) { modifier = Modifiers.AccPrivate; - modifier |= ((TextMarkerVariableDeclaration) fullDeclaration).getType(); + modifier |= ((TextMarkerVariableDeclaration) fullDeclaration).getKind(); } else if (fullDeclaration instanceof TextMarkerBasicAnnotationType) { modifier = Modifiers.AccConstant; modifier |= TMTypeConstants.TM_TYPE_AT; Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerAbstractDeclaration.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerAbstractDeclaration.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerAbstractDeclaration.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerAbstractDeclaration.java Fri Apr 26 11:43:48 2013 @@ -42,7 +42,7 @@ public abstract class TextMarkerAbstract public int getKind() { return D_VAR_DECL; } - + @Override public void traverse(ASTVisitor visitor) throws Exception { if (visitor.visit(this)) { Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerExpression.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerExpression.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerExpression.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerExpression.java Fri Apr 26 11:43:48 2013 @@ -47,10 +47,6 @@ public class TextMarkerExpression extend } } - public int getType() { - return this.type; - } - @Override public void traverse(ASTVisitor visitor) throws Exception { if (visitor.visit(this)) { @@ -67,7 +63,7 @@ public class TextMarkerExpression extend @Override public int getKind() { - return expression.getKind(); + return type; } public boolean isInParantheses() { Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerFeatureDeclaration.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerFeatureDeclaration.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerFeatureDeclaration.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerFeatureDeclaration.java Fri Apr 26 11:43:48 2013 @@ -28,7 +28,7 @@ public class TextMarkerFeatureDeclaratio public TextMarkerFeatureDeclaration(String name, String type, int nameStart, int nameEnd, int declStart, int declEnd, SimpleReference ref) { super(name, nameStart, nameEnd, declStart, declEnd, ref); - this.setType(type); + this.type = type; } public void setType(String type) { Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerTypeDeclaration.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerTypeDeclaration.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerTypeDeclaration.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerTypeDeclaration.java Fri Apr 26 11:43:48 2013 @@ -50,6 +50,11 @@ public class TextMarkerTypeDeclaration e } } + @Override + public int getKind() { + return TMTypeConstants.TM_TYPE_AT; + } + public void setFeatures(List<TextMarkerFeatureDeclaration> features) { this.features = features; } Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerVariableDeclaration.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerVariableDeclaration.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerVariableDeclaration.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/parser/ast/TextMarkerVariableDeclaration.java Fri Apr 26 11:43:48 2013 @@ -63,11 +63,9 @@ public class TextMarkerVariableDeclarati return this.getName() + ":: TextMarkerIntVariable :: " + super.toString(); } - /** - * @return see {@link TMTypeConstants} - */ - public int getType() { - return this.type; + @Override + public int getKind() { + return type; } public boolean hasInitExpression() { Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerCheckerProblemFactory.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerCheckerProblemFactory.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerCheckerProblemFactory.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerCheckerProblemFactory.java Fri Apr 26 11:43:48 2013 @@ -160,6 +160,11 @@ public class TextMarkerCheckerProblemFac return new TextMarkerCheckerDefaultProblem(this.fileName, message, var, getLine(var)); } + public IProblem createWrongArgumentTypeProblem(Expression was,String expected) { + String message = "Wrong kind of argument: expected "+expected; + return new TextMarkerCheckerDefaultProblem(this.fileName, message, was, getLine(was)); + } + public IProblem createInheritenceFinalProblem(TextMarkerVariableReference parent) { String message = "Type \"" + parent.getName() + "\" is final and cannot be used as a parent type."; Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerTypeChecker.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerTypeChecker.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerTypeChecker.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerTypeChecker.java Fri Apr 26 11:43:48 2013 @@ -32,6 +32,7 @@ import java.util.TreeSet; import org.apache.uima.UIMAFramework; import org.apache.uima.resource.ResourceManager; +import org.apache.uima.resource.metadata.FeatureDescription; import org.apache.uima.resource.metadata.TypeDescription; import org.apache.uima.resource.metadata.TypeSystemDescription; import org.apache.uima.textmarker.ide.TextMarkerIdePlugin; @@ -154,6 +155,7 @@ public class TextMarkerTypeChecker imple } catch (Exception e) { TextMarkerIdePlugin.error(e); } + Preferences store = TextMarkerIdePlugin.getDefault().getPluginPreferences(); reportWarningOnShortNames = !store .getBoolean(TextMarkerCorePreferences.BUILDER_IGNORE_DUPLICATE_SHORTNAMES); @@ -208,7 +210,7 @@ public class TextMarkerTypeChecker imple rep.reportProblem(problem); return false; } - if ((newVar.getType() & TMTypeConstants.TM_TYPE_AT) != 0) { + if ((newVar.getKind() & TMTypeConstants.TM_TYPE_AT) != 0) { typeVariables.add(newVar.getName()); return false; } @@ -407,7 +409,11 @@ public class TextMarkerTypeChecker imple } if (typeVariables.contains(ref.getName()) || completeTypes.contains(ref.getName()) || shortTypes.contains(ref.getName()) || otherTypes.contains(ref.getName()) - || isLongLocalATRef(ref.getName()) || isLongExternalATRef(ref.getName())) { + || isLongLocalATRef(ref.getName()) || isLongExternalATRef(ref.getName()) + ) { + return false; + } + if(isFeatureMatch(ref)) { return false; } rep.reportProblem(problemFactory.createTypeProblem(ref, currentFile)); @@ -416,6 +422,75 @@ public class TextMarkerTypeChecker imple return true; } + private boolean isFeatureMatch(TextMarkerVariableReference ref) { + String name = ref.getName(); + for (String each : shortTypes) { + if(checkFeatureMatch(name, each)) return true; + } + for (String each : completeTypes) { + if(checkFeatureMatch(name, each)) return true; + } + return false; + } + + private boolean checkFeatureMatch(String name, String type) { + if(name.startsWith(type)) { + boolean foundAll = true; + String tail = name.substring(type.length() + 1); + String[] split = tail.split("[.]"); + String typeToCheck = type; + for (String feat : split) { + typeToCheck = checkFSFeatureOfType(feat, typeToCheck); + foundAll &= (typeToCheck != null); + if(!foundAll) { + return false; + } + } + return true; + } else { + return false; + } + } + + private String checkFSFeatureOfType(String feat, String type) { + if(type.indexOf(".") == -1) { + for (String each : completeTypes) { + String[] split = each.split("[.]"); + if(split[split.length-1].equals(type)) { + type = each; + break; + } + } + } + TypeDescription t = description.getType(type); + if(t == null) return null; + FeatureDescription[] features = t.getFeatures(); + for (FeatureDescription featureDescription : features) { + String name = featureDescription.getName(); + String rangeTypeName = featureDescription.getRangeTypeName(); + boolean isFS = isFeatureStructure(rangeTypeName); + if(name.equals(feat) && isFS) { + return rangeTypeName; + } + } + return null; + } + + private boolean isFeatureStructure(String rangeTypeName) { + if(rangeTypeName.equals("uima.tcas.Annotation") || rangeTypeName.equals("uima.cas.TOP")) { + return true; + } + TypeDescription type = description.getType(rangeTypeName); + if(type == null) { + return false; + } + String supertypeName = type.getSupertypeName(); + if(supertypeName != null) { + return isFeatureStructure(supertypeName); + } + return false; + } + private boolean isLongExternalATRef(String name) { int lastIndexOf = name.lastIndexOf("."); if (lastIndexOf == -1) { Modified: uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerVarRefChecker.java URL: http://svn.apache.org/viewvc/uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerVarRefChecker.java?rev=1476150&r1=1476149&r2=1476150&view=diff ============================================================================== --- uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerVarRefChecker.java (original) +++ uima/sandbox/textmarker/trunk/textmarker-ep-ide/src/main/java/org/apache/uima/textmarker/ide/validator/TextMarkerVarRefChecker.java Fri Apr 26 11:43:48 2013 @@ -36,14 +36,23 @@ import org.apache.uima.resource.metadata import org.apache.uima.resource.metadata.TypeDescription; import org.apache.uima.resource.metadata.TypeSystemDescription; import org.apache.uima.textmarker.ide.core.ITextMarkerKeywords; +import org.apache.uima.textmarker.ide.core.TextMarkerExtensionManager; import org.apache.uima.textmarker.ide.core.TextMarkerKeywordsManager; import org.apache.uima.textmarker.ide.core.builder.TextMarkerProjectUtils; +import org.apache.uima.textmarker.ide.core.extensions.IIDEActionExtension; +import org.apache.uima.textmarker.ide.core.extensions.IIDEBooleanFunctionExtension; +import org.apache.uima.textmarker.ide.core.extensions.IIDEConditionExtension; +import org.apache.uima.textmarker.ide.core.extensions.IIDENumberFunctionExtension; +import org.apache.uima.textmarker.ide.core.extensions.IIDEStringFunctionExtension; +import org.apache.uima.textmarker.ide.core.extensions.IIDETypeFunctionExtension; +import org.apache.uima.textmarker.ide.core.extensions.ITextMarkerExtension; import org.apache.uima.textmarker.ide.parser.ast.TMActionConstants; import org.apache.uima.textmarker.ide.parser.ast.TMTypeConstants; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerAction; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerBlock; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerCondition; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerExpression; +import org.apache.uima.textmarker.ide.parser.ast.TextMarkerFunction; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerRuleElement; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerStringExpression; import org.apache.uima.textmarker.ide.parser.ast.TextMarkerStructureAction; @@ -95,6 +104,18 @@ public class TextMarkerVarRefChecker imp private String matchedType; + private Map<String, IIDEActionExtension> actionExtensions; + + private Map<String, IIDEConditionExtension> conditionExtensions; + + private Map<String, IIDEBooleanFunctionExtension> booleanFunctionExtensions; + + private Map<String, IIDENumberFunctionExtension> numberFunctionExtensions; + + private Map<String, IIDEStringFunctionExtension> stringFunctionExtensions; + + private Map<String, IIDETypeFunctionExtension> typeFunctionExtensions; + public VarRefVisitor(IProblemReporter rep, ISourceLineTracker linetracker, ISourceModule curFile) { this.linetracker = linetracker; this.rep = rep; @@ -105,6 +126,61 @@ public class TextMarkerVarRefChecker imp this.knownLocalTypeNames = new HashSet<String>(); this.problemFactory = new TextMarkerCheckerProblemFactory(currentFile.getElementName(), linetracker); + conditionExtensions = new HashMap<String, IIDEConditionExtension>(); + actionExtensions = new HashMap<String, IIDEActionExtension>(); + numberFunctionExtensions = new HashMap<String, IIDENumberFunctionExtension>(); + booleanFunctionExtensions = new HashMap<String, IIDEBooleanFunctionExtension>(); + stringFunctionExtensions = new HashMap<String, IIDEStringFunctionExtension>(); + typeFunctionExtensions = new HashMap<String, IIDETypeFunctionExtension>(); + IIDEConditionExtension[] cextensions = TextMarkerExtensionManager.getDefault() + .getIDEConditionExtensions(); + for (IIDEConditionExtension each : cextensions) { + String[] knownExtensions = each.getKnownExtensions(); + for (String string : knownExtensions) { + conditionExtensions.put(string, each); + } + } + IIDEActionExtension[] aextensions = TextMarkerExtensionManager.getDefault() + .getIDEActionExtensions(); + for (IIDEActionExtension each : aextensions) { + String[] knownExtensions = each.getKnownExtensions(); + for (String string : knownExtensions) { + actionExtensions.put(string, each); + } + } + IIDENumberFunctionExtension[] nfextensions = TextMarkerExtensionManager.getDefault() + .getIDENumberFunctionExtensions(); + for (IIDENumberFunctionExtension each : nfextensions) { + String[] knownExtensions = each.getKnownExtensions(); + for (String string : knownExtensions) { + numberFunctionExtensions.put(string, each); + } + } + IIDEBooleanFunctionExtension[] bfextensions = TextMarkerExtensionManager.getDefault() + .getIDEBooleanFunctionExtensions(); + for (IIDEBooleanFunctionExtension each : bfextensions) { + String[] knownExtensions = each.getKnownExtensions(); + for (String string : knownExtensions) { + booleanFunctionExtensions.put(string, each); + } + } + IIDEStringFunctionExtension[] sfextensions = TextMarkerExtensionManager.getDefault() + .getIDEStringFunctionExtensions(); + for (IIDEStringFunctionExtension each : sfextensions) { + String[] knownExtensions = each.getKnownExtensions(); + for (String string : knownExtensions) { + stringFunctionExtensions.put(string, each); + } + } + IIDETypeFunctionExtension[] tfextensions = TextMarkerExtensionManager.getDefault() + .getIDETypeFunctionExtensions(); + for (IIDETypeFunctionExtension each : tfextensions) { + String[] knownExtensions = each.getKnownExtensions(); + for (String string : knownExtensions) { + typeFunctionExtensions.put(string, each); + } + } + try { description = getTypeSystemOfScript(); } catch (InvalidXMLException e) { @@ -153,7 +229,7 @@ public class TextMarkerVarRefChecker imp rep.reportProblem(problem); return false; } - knownLocalVariables.peek().put(newVar.getName(), newVar.getType()); + knownLocalVariables.peek().put(newVar.getName(), newVar.getKind()); return false; } return true; @@ -179,6 +255,7 @@ public class TextMarkerVarRefChecker imp @Override public boolean visit(Expression s) throws Exception { + if (s instanceof TextMarkerRuleElement) { TextMarkerRuleElement re = (TextMarkerRuleElement) s; Expression head = re.getHead(); @@ -206,11 +283,18 @@ public class TextMarkerVarRefChecker imp String actionName = currentFile.getSource().substring(tma.getNameStart(), tma.getNameEnd()); String[] keywords = TextMarkerKeywordsManager.getKeywords(ITextMarkerKeywords.ACTION); List<String> asList = Arrays.asList(keywords); - if (!StringUtils.isEmpty(actionName) && !"-".equals(actionName) && !asList.contains(actionName)) { + if (!StringUtils.isEmpty(actionName) && !"-".equals(actionName) + && !asList.contains(actionName)) { IProblem problem = problemFactory.createUnknownActionProblem(tma); rep.reportProblem(problem); } - + + ITextMarkerExtension extension = actionExtensions.get(actionName); + if (extension != null) { + // boolean checkSyntax = + extension.checkSyntax(tma, problemFactory, rep); + } + if (tma.getName().equals("GETFEATURE") || tma.getName().equals("SETFEATURE")) { List<?> childs = tma.getChilds(); TextMarkerStringExpression stringExpr = (TextMarkerStringExpression) childs.get(0); @@ -222,13 +306,13 @@ public class TextMarkerVarRefChecker imp rep.reportProblem(problem); } } - + if (tma.getKind() == TMActionConstants.A_ASSIGN) { List<?> childs = tma.getChilds(); try { TextMarkerVariableReference ref = (TextMarkerVariableReference) childs.get(0); TextMarkerExpression expr = (TextMarkerExpression) childs.get(1); - int type = expr.getType(); + int type = expr.getKind(); if (ref.getType() == TMTypeConstants.TM_TYPE_G) { ref.setType(type); } @@ -279,6 +363,13 @@ public class TextMarkerVarRefChecker imp rep.reportProblem(problem); } + ITextMarkerExtension extension = conditionExtensions.get(conditionName); + if (extension != null) { + // boolean checkSyntax = + extension.checkSyntax(cond, problemFactory, rep); + } + + if (conditionName.equals("FEATURE")) { if (matchedType != null) { List<?> args = cond.getChilds(); @@ -293,6 +384,31 @@ public class TextMarkerVarRefChecker imp } } } + if(s instanceof TextMarkerFunction) { + TextMarkerFunction f = (TextMarkerFunction) s; + String name = f.getName(); + if(s.getKind() == TMTypeConstants.TM_TYPE_AT) { + ITextMarkerExtension extension = typeFunctionExtensions.get(name); + if (extension != null) { + extension.checkSyntax(s, problemFactory, rep); + } + } else if(s.getKind() == TMTypeConstants.TM_TYPE_B) { + ITextMarkerExtension extension = booleanFunctionExtensions.get(name); + if (extension != null) { + extension.checkSyntax(s, problemFactory, rep); + } + } else if(s.getKind() == TMTypeConstants.TM_TYPE_N) { + ITextMarkerExtension extension = numberFunctionExtensions.get(name); + if (extension != null) { + extension.checkSyntax(s, problemFactory, rep); + } + } else if(s.getKind() == TMTypeConstants.TM_TYPE_S) { + ITextMarkerExtension extension = stringFunctionExtensions.get(name); + if (extension != null) { + extension.checkSyntax(s, problemFactory, rep); + } + } + } return true; } @@ -318,17 +434,18 @@ public class TextMarkerVarRefChecker imp if (description == null) { return true; } - if(structure == null) { + if (structure == null) { return false; } - + // TODO HOTFIX - if(structure.equals("Document") || structure.equals("DocumentAnnotation") || structure.equals("uima.tcas.DocumentAnnotation")) { - if(feat.equals("language")) { + if (structure.equals("Document") || structure.equals("DocumentAnnotation") + || structure.equals("uima.tcas.DocumentAnnotation")) { + if (feat.equals("language")) { return true; } } - + boolean featureFound = false; TypeDescription[] descriptions = description.getTypes(); Map<String, TypeDescription> typeMap = new HashMap<String, TypeDescription>(); @@ -336,11 +453,11 @@ public class TextMarkerVarRefChecker imp String typeName = typeDescription.getName(); typeMap.put(typeName, typeDescription); } - + for (TypeDescription typeDescription : descriptions) { String typeName = typeDescription.getName(); String shortName = getShortName(typeName); - if(typeName.equals(structure) || shortName.equals(structure)) { + if (typeName.equals(structure) || shortName.equals(structure)) { Collection<FeatureDescription> allFeatures = getAllDeclaredFeatures(typeDescription, typeMap); for (FeatureDescription featureDescription : allFeatures) { @@ -351,7 +468,7 @@ public class TextMarkerVarRefChecker imp } } } - + if (featureFound) { break; }