You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2016/01/13 18:30:09 UTC

svn commit: r1724465 - in /uima/ruta/trunk: ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/ ruta-core/src/main/java/org/apache/uima/ruta/ ruta-core/src/main/java/org/apache/uima/ruta/action/ ruta-core/src/main/java/org/apache/uima/ruta/condition...

Author: pkluegl
Date: Wed Jan 13 17:30:09 2016
New Revision: 1724465

URL: http://svn.apache.org/viewvc?rev=1724465&view=rev
Log:
UIMA-4735
- macros for actions and conditions

Added:
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java   (with props)
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java   (with props)
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java   (with props)
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java   (with props)
Modified:
    uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml
    uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java
    uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java

Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Wed Jan 13 17:30:09 2016
@@ -385,11 +385,22 @@ public void setExternalFactory(RutaExter
       	}
       	
       	
-      	
-	private void addActionMacro(RutaBlock env, String text, Map<String,String> def, List<AbstractRutaAction> as) {
-     		int i = 0;	
+
+	private void addMacroAction(RutaBlock env, String name, Map<String,String> def, List<AbstractRutaAction> as) {
+     		env.getEnvironment().addMacroAction(name, def, as);
  	}
- 	 
+ 	
+ 	private boolean isMacroAction(String name, RutaBlock env) {
+		return env.getEnvironment().isMacroAction(name);
+	}
+ 	
+ 	private void addMacroCondition(RutaBlock env, String name, Map<String,String> def, List<AbstractRutaCondition> cs) {
+     		env.getEnvironment().addMacroCondition(name, def, cs);
+ 	}
+ 	
+ 	private boolean isMacroCondition(String name, RutaBlock env) {
+		return env.getEnvironment().isMacroCondition(name);
+	}
  	 
  	private Map<String,String> temporaryVariables = new HashMap<>(); 
  	
@@ -415,6 +426,8 @@ public void setExternalFactory(RutaExter
      		}
 	}
 
+	
+
 }
 
 @rulecatch {
@@ -479,8 +492,8 @@ statement returns [RutaStatement stmt =
 	:	
 	( stmtDecl = declaration {stmt = stmtDecl;}
 	| stmtVariable = variableDeclaration {stmt = stmtVariable;}
-	| stmtCM = conditionMacroDeclaration {stmt = stmtCM;}
-	| stmtAM = actionMacroDeclaration {stmt = stmtAM;}
+	| stmtCM = macroConditionDeclaration {stmt = stmtCM;}
+	| stmtAM = macroActionDeclaration {stmt = stmtAM;}
 	| stmtRule = simpleStatement {stmt = stmtRule;}
 	| stmtBlock = blockDeclaration {stmt = stmtBlock;}
 	| stmtExternal = externalBlock {stmt = stmtExternal;}
@@ -571,16 +584,23 @@ List<String> vars = new ArrayList<String
 	;
 
 
-conditionMacroDeclaration returns [RutaStatement stmt = null]
-  :
-    type = CONDITION id = Identifier ASSIGN_EQUAL LPAREN cons = conditions RPAREN SEMI
-    {addVariable($blockDeclaration::env, id.getText(), type.getText());
-    AbstractRutaCondition condition = ConditionFactory.createConditionAnd(cons,$blockDeclaration::env);
-    setValue($blockDeclaration::env, id.getText(), condition);}
+macroConditionDeclaration returns [RutaStatement stmt = null]
+@init {
+Map<String,String> def = new LinkedHashMap<>();
+}
+    :
+    CONDITION name = Identifier 
+    LPAREN  
+    (argType = varTypeToken argName = Identifier  {def.put(argName.getText(),argType.getText());}
+    (COMMA argType = varTypeToken argName = Identifier {def.put(argName.getText(),argType.getText());})*)? 
+    {addTemporaryVariables(def);}
+    RPAREN ASSIGN_EQUAL cs = conditions SEMI
+    {removeTemporaryVariables(def);}
+    {addMacroCondition($blockDeclaration::env, name.getText(), def, cs);}
     ;
 
 
-actionMacroDeclaration returns [RutaStatement stmt = null]
+macroActionDeclaration returns [RutaStatement stmt = null]
 @init {
 Map<String,String> def = new LinkedHashMap<>();
 }
@@ -592,8 +612,7 @@ Map<String,String> def = new LinkedHashM
     {addTemporaryVariables(def);}
     RPAREN ASSIGN_EQUAL as = actions SEMI
     {removeTemporaryVariables(def);}
-    {addActionMacro($blockDeclaration::env, name.getText(), def, as);}
-       
+    {addMacroAction($blockDeclaration::env, name.getText(), def, as);}
     ;
 
 varTypeToken returns [Token token = null ]
@@ -1385,21 +1404,11 @@ condition  returns [AbstractRutaConditio
 	| (featureMatchExpression2)=> f = featureMatchExpression2 {c = ConditionFactory.createImplicitCondition(f);}
 	| (booleanExpression)=> b = booleanExpression {c = ConditionFactory.createImplicitCondition(b);}
 	| (c = externalCondition)=> c = externalCondition
-	
-//	| c = variableCondition
+	| (c = macroCondition)=> c = macroCondition
 	) {result = c;}
 	;
 
 
-//variableCondition returns [AbstractRutaCondition condition = null]
-//	:		
-//	
-//	id = Identifier
-//	{
-//		condition = ConditionFactory.createConditionVariable(id);
-//	}
-//	;
-
 externalCondition returns [AbstractRutaCondition condition = null]
 	:		
 	{isConditionExtension(input.LT(1).getText())}? 
@@ -1409,6 +1418,14 @@ externalCondition returns [AbstractRutaC
 	}
 	;
 	
+macroCondition returns [AbstractRutaCondition condition = null]
+	:		
+	{isMacroCondition(input.LT(1).getText(), $blockDeclaration::env)}? 
+	id = Identifier LPAREN args = varArgumentList?	RPAREN
+	{
+		condition = ConditionFactory.createMacroCondition(id, args, $blockDeclaration::env);
+	}
+	;
 conditionAnd returns [AbstractRutaCondition cond = null]
     :   
     AND LPAREN conds = conditions RPAREN 
@@ -1654,6 +1671,7 @@ action  returns [AbstractRutaAction resu
 	| a = actionRemoveFilterType
 	| (variableAssignmentAction)=> vae = variableAssignmentAction {a = vae;}
 	| (externalAction)=> a = externalAction
+	| (macroAction)=> a = macroAction
 	| (featureAssignmentExpression)=> fae = featureAssignmentExpression {a = ActionFactory.createAction(fae);}
 	| (typeExpression)=> te = typeExpression {a = ActionFactory.createAction(te);}
 	
@@ -1708,19 +1726,11 @@ rawAction  returns [AbstractRutaAction r
 	| a = actionAddFilterType
 	| a = actionRemoveFilterType
 	| (externalAction)=> a = externalAction
-	
-//	| a = variableAction
+	| (macroAction)=> a = macroAction
 	) {result = a;}
 	;	
 
-//variableAction returns [AbstractRutaAction action = null]
-//	:		
-//	
-//	id = Identifier
-//	{
-//		action = ActionFactory.createActionVariable(id);
-//	}
-//	;
+
 
 
 externalAction returns [AbstractRutaAction action = null]
@@ -1732,7 +1742,14 @@ externalAction returns [AbstractRutaActi
 	}
 	;
 
-
+macroAction returns [AbstractRutaAction action = null]
+	:		
+	{isMacroAction(input.LT(1).getText(), $blockDeclaration::env)}? 
+	id = Identifier LPAREN args = varArgumentList?	RPAREN
+	{
+		action = ActionFactory.createMacroAction(id, args, $blockDeclaration::env);
+	}
+	;
 
 actionCreate returns [AbstractRutaAction action = null]
 @init {
@@ -2600,8 +2617,8 @@ composedBooleanExpression returns [IBool
 
 	:
 	(e2 = booleanCompare)=> e2 = booleanCompare {expr = e2;}
-	| (bte = booleanTypeExpression)=> bte = booleanTypeExpression{expr = bte;}
 	| (bne = booleanNumberExpression)=> bne = booleanNumberExpression{expr = bne;}
+	| (bte = booleanTypeExpression)=> bte = booleanTypeExpression{expr = bte;}
 	| e1 = booleanFunction {expr = e1;}
 	| LPAREN ep = booleanExpression RPAREN {expr = ep;}
 	;

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java Wed Jan 13 17:30:09 2016
@@ -35,6 +35,8 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.antlr.runtime.CommonToken;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.UimaContext;
 import org.apache.uima.cas.CAS;
@@ -145,6 +147,10 @@ public class RutaEnvironment {
 
   private Map<String, Class<?>> availableListTypes;
 
+  private Map<String, Pair<Map<String, String>, List<AbstractRutaCondition>>> macroConditions;
+
+  private Map<String, Pair<Map<String, String>, List<AbstractRutaAction>>> macroActions;
+
   private String[] resourcePaths = null;
 
   private CAS cas;
@@ -169,6 +175,8 @@ public class RutaEnvironment {
     variableValues = new HashMap<String, Object>();
     variableTypes = new HashMap<String, Class<?>>();
     variableGenericTypes = new HashMap<String, Class<?>>();
+    macroConditions = new HashMap<>();
+    macroActions = new HashMap<>();
     availableTypes = new HashMap<String, Class<?>>();
     availableTypes.put("ANNOTATION", AnnotationFS.class);
     availableTypes.put("INT", Integer.class);
@@ -644,7 +652,7 @@ public class RutaEnvironment {
     return tables.get(table);
   }
 
-  public void addVariable(String name, Class<?> type, Class<?> generic) {
+  private void addVariable(String name, Class<?> type, Class<?> generic) {
     variableTypes.put(name, type);
     if (generic != null) {
       variableGenericTypes.put(name, generic);
@@ -688,6 +696,12 @@ public class RutaEnvironment {
   public void addVariable(String name, String type) {
     addVariable(name, availableTypes.get(type), availableListTypes.get(type));
   }
+  
+  public void removeVariable(String name) {
+    variableTypes.remove(name);
+    variableGenericTypes.remove(name);
+    variableValues.remove(name);
+  }
 
   public boolean ownsVariable(String name) {
     return variableTypes.containsKey(name);
@@ -906,4 +920,30 @@ public class RutaEnvironment {
     this.resourceManager = resourceManager;
   }
 
+  public void addMacroAction(String name, Map<String, String> def, List<AbstractRutaAction> actions) {
+    macroActions.put(name, new ImmutablePair<Map<String, String>, List<AbstractRutaAction>>(def,
+            actions));
+  }
+
+  public void addMacroCondition(String name, Map<String, String> def,
+          List<AbstractRutaCondition> conditions) {
+    macroConditions.put(name, new ImmutablePair<Map<String, String>, List<AbstractRutaCondition>>(
+            def, conditions));
+  }
+
+  public boolean isMacroAction(String name) {
+    return macroActions.keySet().contains(name);
+  }
+
+  public boolean isMacroCondition(String name) {
+    return macroConditions.keySet().contains(name);
+  }
+
+  public Pair<Map<String, String>, List<AbstractRutaAction>> getMacroAction(String name) {
+    return macroActions.get(name);
+  }
+
+  public Pair<Map<String, String>, List<AbstractRutaCondition>> getMacroCondition(String name) {
+    return macroConditions.get(name);
+  }
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Wed Jan 13 17:30:09 2016
@@ -954,8 +954,7 @@ public class RutaStream extends FSIterat
       } else if (value instanceof IStringExpression) {
         IStringExpression stringExpr = (IStringExpression) value;
         String string = stringExpr.getStringValue(context, this);
-        StringArrayFS array = FSCollectionFactory.createStringArray(cas,
-                new String[] { string });
+        StringArrayFS array = FSCollectionFactory.createStringArray(cas, new String[] { string });
         annotation.setFeatureValue(feature, array);
       }
     } else if (range.equals(UIMAConstants.TYPE_INTEGER) || range.equals(UIMAConstants.TYPE_LONG)
@@ -969,13 +968,12 @@ public class RutaStream extends FSIterat
       if (value instanceof INumberExpression) {
         INumberExpression numberExpr = (INumberExpression) value;
         int v = numberExpr.getIntegerValue(context, this);
-        IntArrayFS array = FSCollectionFactory.createIntArray(cas,
-                new int[] { v });
+        IntArrayFS array = FSCollectionFactory.createIntArray(cas, new int[] { v });
         annotation.setFeatureValue(feature, array);
-      } else if(value instanceof INumberListExpression) {
+      } else if (value instanceof INumberListExpression) {
         INumberListExpression expr = (INumberListExpression) value;
         List<Number> list = expr.getNumberList(context, this);
-        IntArrayFS array = FSCollectionFactory.createIntArray(cas,RutaListUtils.toIntArray(list));
+        IntArrayFS array = FSCollectionFactory.createIntArray(cas, RutaListUtils.toIntArray(list));
         annotation.setFeatureValue(feature, array);
       }
     } else if (range.equals(UIMAConstants.TYPE_DOUBLE)) {
@@ -988,13 +986,13 @@ public class RutaStream extends FSIterat
       if (value instanceof INumberExpression) {
         INumberExpression numberExpr = (INumberExpression) value;
         double v = numberExpr.getDoubleValue(context, this);
-        DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas,
-                new double[] { v });
+        DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas, new double[] { v });
         annotation.setFeatureValue(feature, array);
-      } else if(value instanceof INumberListExpression) {
+      } else if (value instanceof INumberListExpression) {
         INumberListExpression expr = (INumberListExpression) value;
         List<Number> list = expr.getNumberList(context, this);
-        DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas,RutaListUtils.toDoubleArray(list));
+        DoubleArrayFS array = FSCollectionFactory.createDoubleArray(cas,
+                RutaListUtils.toDoubleArray(list));
         annotation.setFeatureValue(feature, array);
       }
     } else if (range.equals(UIMAConstants.TYPE_FLOAT)) {
@@ -1007,13 +1005,13 @@ public class RutaStream extends FSIterat
       if (value instanceof INumberExpression) {
         INumberExpression numberExpr = (INumberExpression) value;
         float v = numberExpr.getFloatValue(context, this);
-        FloatArrayFS array = FSCollectionFactory.createFloatArray(cas,
-                new float[] { v });
+        FloatArrayFS array = FSCollectionFactory.createFloatArray(cas, new float[] { v });
         annotation.setFeatureValue(feature, array);
-      } else if(value instanceof INumberListExpression) {
+      } else if (value instanceof INumberListExpression) {
         INumberListExpression expr = (INumberListExpression) value;
         List<Number> list = expr.getNumberList(context, this);
-        FloatArrayFS array = FSCollectionFactory.createFloatArray(cas,RutaListUtils.toFloatArray(list));
+        FloatArrayFS array = FSCollectionFactory.createFloatArray(cas,
+                RutaListUtils.toFloatArray(list));
         annotation.setFeatureValue(feature, array);
       }
     } else if (range.equals(UIMAConstants.TYPE_BOOLEAN)) {
@@ -1031,8 +1029,7 @@ public class RutaStream extends FSIterat
       } else if (value instanceof IBooleanExpression) {
         IBooleanExpression expr = (IBooleanExpression) value;
         Boolean v = expr.getBooleanValue(context, this);
-        BooleanArrayFS array = FSCollectionFactory.createBooleanArray(cas,
-                new boolean[] { v });
+        BooleanArrayFS array = FSCollectionFactory.createBooleanArray(cas, new boolean[] { v });
         annotation.setFeatureValue(feature, array);
       }
     } else if (value instanceof AnnotationTypeExpression && !feature.getRange().isPrimitive()) {
@@ -1123,38 +1120,38 @@ public class RutaStream extends FSIterat
     }
   }
 
-  public void assignVariable(String var, IRutaExpression expression, MatchContext context,
-          RutaStream stream) {
+  public void assignVariable(String var, IRutaExpression expression, MatchContext context) {
     RuleElement element = context.getElement();
     RutaBlock parent = element.getParent();
     RutaEnvironment environment = parent.getEnvironment();
     Class<?> clazz = environment.getVariableType(var);
     if (clazz.equals(Double.class) && expression instanceof INumberExpression) {
-      double v = ((INumberExpression) expression).getDoubleValue(context, stream);
+      double v = ((INumberExpression) expression).getDoubleValue(context, this);
       environment.setVariableValue(var, v);
     } else if (clazz.equals(Integer.class) && expression instanceof INumberExpression) {
-      int v = ((INumberExpression) expression).getIntegerValue(context, stream);
+      int v = ((INumberExpression) expression).getIntegerValue(context, this);
       environment.setVariableValue(var, v);
     } else if (clazz.equals(Type.class) && expression instanceof ITypeExpression) {
-      Type v = ((ITypeExpression) expression).getType(context, stream);
+      Type v = ((ITypeExpression) expression).getType(context, this);
       environment.setVariableValue(var, v);
     } else if (clazz.equals(Boolean.class) && expression instanceof IBooleanExpression) {
-      boolean v = ((IBooleanExpression) expression).getBooleanValue(context, stream);
+      boolean v = ((IBooleanExpression) expression).getBooleanValue(context, this);
       environment.setVariableValue(var, v);
     } else if (clazz.equals(String.class) && expression instanceof IStringExpression) {
-      String v = ((IStringExpression) expression).getStringValue(context, stream);
+      String v = ((IStringExpression) expression).getStringValue(context, this);
       environment.setVariableValue(var, v);
     } else if (clazz.equals(AnnotationFS.class) && expression instanceof IAnnotationExpression) {
-      AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, stream);
+      AnnotationFS v = ((IAnnotationExpression) expression).getAnnotation(context, this);
       environment.setVariableValue(var, v);
     } else if (clazz.equals(List.class)) {
       Class<?> variableGenericType = environment.getVariableGenericType(var);
       if (variableGenericType.equals(AnnotationFS.class)
               && expression instanceof IAnnotationListExpression) {
         List<AnnotationFS> v = ((IAnnotationListExpression) expression).getAnnotationList(context,
-                stream);
+                this);
         environment.setVariableValue(var, v);
       }
+      // TODO assign also other lists
     }
   }
 

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java Wed Jan 13 17:30:09 2016
@@ -24,6 +24,7 @@ import java.util.Map;
 import java.util.logging.Level;
 
 import org.antlr.runtime.Token;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
@@ -36,6 +37,7 @@ import org.apache.uima.ruta.expression.s
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.type.AbstractTypeListExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
+import org.apache.uima.ruta.extensions.RutaParseRuntimeException;
 
 public class ActionFactory {
 
@@ -59,8 +61,8 @@ public class ActionFactory {
   }
 
   public static AbstractRutaAction createMarkFastAction(ITypeExpression type,
-          AbstractStringListExpression list, IBooleanExpression ignore, INumberExpression ignoreLength,
-          IBooleanExpression ignoreWS, RutaBlock env) {
+          AbstractStringListExpression list, IBooleanExpression ignore,
+          INumberExpression ignoreLength, IBooleanExpression ignoreWS, RutaBlock env) {
     return new MarkFastAction(type, list, ignore, ignoreLength, ignoreWS);
   }
 
@@ -159,8 +161,8 @@ public class ActionFactory {
     return new UnmarkAction(f, list, b);
   }
 
-  public static AbstractRutaAction createUnmarkAllAction(ITypeExpression f, AbstractTypeListExpression list,
-          RutaBlock env) {
+  public static AbstractRutaAction createUnmarkAllAction(ITypeExpression f,
+          AbstractTypeListExpression list, RutaBlock env) {
     return new UnmarkAllAction(f, list);
   }
 
@@ -267,11 +269,11 @@ public class ActionFactory {
 
   public static AbstractRutaAction createImplicitVariableAssignmentAction(Token var, Token op,
           IRutaExpression arg, RutaBlock env) {
-    String varString = var != null ?  var.getText() : null;
-    String opString = op != null ?  op.getText() : "=";
+    String varString = var != null ? var.getText() : null;
+    String opString = op != null ? op.getText() : "=";
     return new ImplicitVariableAssignmentAction(varString, opString, arg);
   }
-  
+
   public static AbstractRutaAction createMarkFirstAction(ITypeExpression type, RutaBlock env) {
     return new MarkFirstAction(type);
   }
@@ -287,6 +289,22 @@ public class ActionFactory {
     return new SplitAction(type, complete, appendToBegin, appendToEnd);
   }
 
-  
+  public static AbstractRutaAction createMacroAction(Token id, List<IRutaExpression> args,
+          RutaBlock env) {
+    String name = id.getText();
+    Pair<Map<String, String>, List<AbstractRutaAction>> macroActionDefinition = env
+            .getEnvironment().getMacroAction(name);
+    if (macroActionDefinition == null) {
+      return null;
+    }
+    Map<String, String> definition = macroActionDefinition.getKey();
+    List<AbstractRutaAction> actions = macroActionDefinition.getValue();
+    if (definition.size() != args.size()) {
+      throw new RutaParseRuntimeException("Arguments of macro action '" + name
+              + "' do not match its definition: " + definition.values());
+    }
+
+    return new MacroAction(name, definition, actions, args);
+  }
 
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/AssignAction.java Wed Jan 13 17:30:09 2016
@@ -38,7 +38,7 @@ public class AssignAction extends Abstra
 
   @Override
   public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
-    stream.assignVariable(var, expression, context, stream);
+    stream.assignVariable(var, expression, context);
   }
 
   public String getVar() {

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitVariableAssignmentAction.java Wed Jan 13 17:30:09 2016
@@ -44,7 +44,7 @@ public class ImplicitVariableAssignmentA
   public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
     // only normal assignment is supported right now
     if(StringUtils.equals(op, "=")) {
-      stream.assignVariable(var, arg, context, stream);
+      stream.assignVariable(var, arg, context);
     }
   }
 

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java?rev=1724465&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java Wed Jan 13 17:30:09 2016
@@ -0,0 +1,105 @@
+/*
+ * 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.action;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.RutaEnvironment;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.IRutaExpression;
+import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+public class MacroAction extends AbstractRutaAction {
+
+  private final String name;
+
+  private final Map<String, String> definition;
+
+  private final List<AbstractRutaAction> actions;
+
+  private final List<IRutaExpression> arguments;
+
+  public MacroAction(String name, Map<String, String> definition, List<AbstractRutaAction> actions,
+          List<IRutaExpression> arguments) {
+    super();
+    this.name = name;
+    this.definition = definition;
+    this.actions = actions;
+    this.arguments = arguments;
+  }
+
+  @Override
+  public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
+    prepareEnvironment(context, stream);
+    for (AbstractRutaAction eachAction : actions) {
+      crowd.beginVisit(eachAction, null);
+      eachAction.execute(context, stream, crowd);
+      crowd.endVisit(eachAction, null);
+    }
+    cleanupEnvironment(context, stream);
+  }
+
+  private void prepareEnvironment(MatchContext context, RutaStream stream) {
+    RutaBlock parent = context.getParent();
+    RutaEnvironment environment = parent.getEnvironment();
+    Set<Entry<String, String>> entrySet = definition.entrySet();
+    int index = 0;
+    for (Entry<String, String> entry : entrySet) {
+      String name = entry.getKey();
+      String type = entry.getValue();
+      IRutaExpression expression = arguments.get(index);
+      environment.addVariable(name, type);
+      stream.assignVariable(name, expression, context);
+      index++;
+    }
+  }
+
+  private void cleanupEnvironment(MatchContext context, RutaStream stream) {
+    RutaBlock parent = context.getParent();
+    RutaEnvironment environment = parent.getEnvironment();
+    Set<Entry<String, String>> entrySet = definition.entrySet();
+    for (Entry<String, String> entry : entrySet) {
+      String name = entry.getKey();
+      environment.removeVariable(name);
+    }
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public Map<String, String> getDefinition() {
+    return definition;
+  }
+
+  public List<AbstractRutaAction> getActions() {
+    return actions;
+  }
+
+  public List<IRutaExpression> getArguments() {
+    return arguments;
+  }
+
+}

Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/MacroAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java Wed Jan 13 17:30:09 2016
@@ -20,8 +20,10 @@
 package org.apache.uima.ruta.condition;
 
 import java.util.List;
+import java.util.Map;
 
 import org.antlr.runtime.Token;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
@@ -32,6 +34,7 @@ import org.apache.uima.ruta.expression.s
 import org.apache.uima.ruta.expression.string.IStringExpression;
 import org.apache.uima.ruta.expression.type.AbstractTypeListExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
+import org.apache.uima.ruta.extensions.RutaParseRuntimeException;
 
 public class ConditionFactory {
 
@@ -307,4 +310,21 @@ public class ConditionFactory {
     return new ImplicitCondition(expr);
   }
 
+  public static AbstractRutaCondition createMacroCondition(Token id, List<IRutaExpression> args, RutaBlock env) {
+    String name = id.getText();
+    Pair<Map<String, String>, List<AbstractRutaCondition>> macroConditionDefinition = env
+            .getEnvironment().getMacroCondition(name);
+    if (macroConditionDefinition == null) {
+      return null;
+    }
+    Map<String, String> definition = macroConditionDefinition.getKey();
+    List<AbstractRutaCondition> conditions = macroConditionDefinition.getValue();
+    if (definition.size() != args.size()) {
+      throw new RutaParseRuntimeException("Arguments of macro action '" + name
+              + "' do not match its definition: " + definition.values());
+    }
+
+    return new MacroCondition(name, definition, conditions, args);
+  }
+
 }

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java?rev=1724465&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java Wed Jan 13 17:30:09 2016
@@ -0,0 +1,114 @@
+/*
+ * 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.condition;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.uima.ruta.RutaBlock;
+import org.apache.uima.ruta.RutaEnvironment;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.IRutaExpression;
+import org.apache.uima.ruta.rule.EvaluatedCondition;
+import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.visitor.InferenceCrowd;
+
+public class MacroCondition extends AbstractRutaCondition {
+
+  private final String name;
+
+  private final Map<String, String> definition;
+
+  private final List<AbstractRutaCondition> conditions;
+
+  private final List<IRutaExpression> arguments;
+
+  public MacroCondition(String name, Map<String, String> definition, List<AbstractRutaCondition> conditions,
+          List<IRutaExpression> arguments) {
+    super();
+    this.name = name;
+    this.definition = definition;
+    this.conditions = conditions;
+    this.arguments = arguments;
+  }
+
+  
+  @Override
+  public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
+    boolean result = true;
+    prepareEnvironment(context, stream);
+    List<EvaluatedCondition> evals = new ArrayList<EvaluatedCondition>();
+    for (AbstractRutaCondition each : conditions) {
+      crowd.beginVisit(each, null);
+      EvaluatedCondition eval = each.eval(context, stream, crowd);
+      crowd.endVisit(each, null);
+      result &= eval.isValue();
+      evals.add(eval);
+    }
+    cleanupEnvironment(context, stream);
+    return new EvaluatedCondition(this, result, evals);
+  }
+
+  private void prepareEnvironment(MatchContext context, RutaStream stream) {
+    RutaBlock parent = context.getParent();
+    RutaEnvironment environment = parent.getEnvironment();
+    Set<Entry<String, String>> entrySet = definition.entrySet();
+    int index = 0;
+    for (Entry<String, String> entry : entrySet) {
+      String name = entry.getKey();
+      String type = entry.getValue();
+      IRutaExpression expression = arguments.get(index);
+      environment.addVariable(name, type);
+      stream.assignVariable(name, expression, context);
+      index++;
+    }
+  }
+
+  private void cleanupEnvironment(MatchContext context, RutaStream stream) {
+    RutaBlock parent = context.getParent();
+    RutaEnvironment environment = parent.getEnvironment();
+    Set<Entry<String, String>> entrySet = definition.entrySet();
+    for (Entry<String, String> entry : entrySet) {
+      String name = entry.getKey();
+      environment.removeVariable(name);
+    }
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public Map<String, String> getDefinition() {
+    return definition;
+  }
+
+  public List<AbstractRutaCondition> getActions() {
+    return conditions;
+  }
+
+  public List<IRutaExpression> getArguments() {
+    return arguments;
+  }
+
+
+}

Propchange: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/MacroCondition.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/MacroActionTest.java Wed Jan 13 17:30:09 2016
@@ -28,11 +28,11 @@ public class MacroActionTest {
 
 
   @Test
-  public void testFeature() {
+  public void test() {
     String document = "Test";
     String script = "INT j;\n";
-    script += "ACTION macro(TYPE t, INT i) = MARK(t),ASSIGN(i,1);\n";
-    script += "Document{-> macro(T1,j)};\n";
+    script += "ACTION macro(TYPE t, INT inc) = MARK(t),ASSIGN(j,j+inc);\n";
+    script += "Document{-> macro(T1,1)};\n";
     script += "Document{(j>0)->T2};\n";
 
 
@@ -44,8 +44,8 @@ public class MacroActionTest {
       e.printStackTrace();
     }
 
-//    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Test");
-//    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Test");
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Test");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Test");
 
     cas.release();
   }

Added: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java?rev=1724465&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java (added)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java Wed Jan 13 17:30:09 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.condition;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.junit.Test;
+
+public class MacroConditionTest {
+
+
+  @Test
+  public void test() {
+    String document = "Test";
+    String script = "INT j;\n";
+    script += "CONDITION macro(TYPE t, INT i) = IS(t),(j==i);\n";
+    script += "Document{-> T1, j=1};\n";
+    script += "Document{macro(T1,0)-> T2};\n";
+    script += "Document{macro(T1,1)-> T3};\n";
+
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Test");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 0);
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Test");
+
+    cas.release();
+  }
+}

Propchange: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/condition/MacroConditionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml (original)
+++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.syntax.xml Wed Jan 13 17:30:09 2016
@@ -103,7 +103,10 @@ BasicAnnotationType ->  ('COLON'| 'SW' |
                       | 'SPACE' | 'BREAK')
 BlockDeclaration    -> "BLOCK" "(" Identifier ")" RuleElementWithCA
                                                        "{" Statements "}"]]></programlisting>
-
+actionDeclaration   -> "ACTION" Identifier "(" VarType Identifier ("," VarType Identifier)*")"  
+                      "=" Action ( "," Action)* ";"
+conditionDeclaration-> "CONDITION" Identifier "(" VarType Identifier ("," VarType Identifier)*")"  
+                      "=" Condition ( "," Condition)* ";"  
     Syntax of statements and rule elements:
     <programlisting><![CDATA[SimpleStatement        -> SimpleRule | RegExpRule | ConjunctRules 
                           | DocumentActionRule

Modified: uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java (original)
+++ uima/ruta/trunk/ruta-ep-ide-ui/src/main/java/org/apache/uima/ruta/ide/validator/LanguageCheckerVisitor.java Wed Jan 13 17:30:09 2016
@@ -71,6 +71,7 @@ import org.apache.uima.ruta.ide.parser.a
 import org.apache.uima.ruta.ide.parser.ast.RutaImportStatement;
 import org.apache.uima.ruta.ide.parser.ast.RutaImportTypesStatement;
 import org.apache.uima.ruta.ide.parser.ast.RutaListExpression;
+import org.apache.uima.ruta.ide.parser.ast.RutaMacroDeclaration;
 import org.apache.uima.ruta.ide.parser.ast.RutaPackageDeclaration;
 import org.apache.uima.ruta.ide.parser.ast.RutaRegExpRule;
 import org.apache.uima.ruta.ide.parser.ast.RutaRule;
@@ -196,7 +197,7 @@ public class LanguageCheckerVisitor exte
   private boolean packageChecked = false;
 
   private Collection<String> currentLabels = new HashSet<>();
-  
+
   public LanguageCheckerVisitor(IProblemReporter problemReporter, ISourceLineTracker linetracker,
           ISourceModule sourceModule, ClassLoader classLoader) {
     super();
@@ -221,7 +222,7 @@ public class LanguageCheckerVisitor exte
     IPath location = sourceModule.getResource().getLocation();
     try {
       IPath packagePath = RutaProjectUtils.getPackagePath(location, project);
-      if(packagePath != null) {
+      if (packagePath != null) {
         packagePathString = packagePath.toPortableString().replaceAll("/", ".");
       }
     } catch (CoreException e) {
@@ -241,6 +242,26 @@ public class LanguageCheckerVisitor exte
       checkPackage(s);
       return false;
     }
+    if (s instanceof RutaMacroDeclaration) {
+      RutaMacroDeclaration decl = (RutaMacroDeclaration) s;
+      Map<Token, Token> definition = decl.getDefinition();
+      String name = decl.getName();
+      int kind = decl.getKind();
+      if(kind == RutaTypeConstants.RUTA_TYPE_A) {
+        actionExtensions.put(name, null);
+      } else if(kind == RutaTypeConstants.RUTA_TYPE_C) {
+        conditionExtensions.put(name, null);
+      }
+      Set<Entry<Token,Token>> entrySet = definition.entrySet();
+      Map<String, Integer> map = new HashMap<>();
+      for (Entry<Token, Token> entry : entrySet) {
+        String varName = entry.getKey().getText();
+        String varType = entry.getValue().getText();
+        int vt = getType(varType);
+        map.put(varName, vt);
+      }
+      knownLocalVariables.push(map);
+    }
     if (s instanceof RutaImportTypesStatement) {
       RutaImportTypesStatement stmt = (RutaImportTypesStatement) s;
       SimpleReference tsExpr = (SimpleReference) stmt.getExpression();
@@ -288,7 +309,7 @@ public class LanguageCheckerVisitor exte
               IPath typeSystemDescriptorPath = RutaProjectUtils.getTypeSystemDescriptorPath(
                       file.getLocation(), referredProject);
               TypeSystemDescription tsDesc = importCompleteTypeSystem(typeSystemDescriptorPath, url);
-              
+
               List<String> checkDuplicateShortNames = checkOnAmbiguousShortNames(tsDesc);
               if (!checkDuplicateShortNames.isEmpty()) {
                 pr.reportProblem(problemFactory.createDuplicateShortNameInImported(sRef, localPath,
@@ -414,8 +435,8 @@ public class LanguageCheckerVisitor exte
         }
       }
     }
-    if(s instanceof RutaRule) {
-      collectAllLabels((RutaRule)s);
+    if (s instanceof RutaRule) {
+      collectAllLabels((RutaRule) s);
     }
     return true;
   }
@@ -431,7 +452,7 @@ public class LanguageCheckerVisitor exte
   }
 
   private void checkPackage(ASTNode node) {
-    if(!StringUtils.equals(packageName, packagePathString) && !packageChecked) {
+    if (!StringUtils.equals(packageName, packagePathString) && !packageChecked) {
       pr.reportProblem(problemFactory.createWrongPackageProblem(node));
     }
     packageChecked = true;
@@ -608,7 +629,7 @@ public class LanguageCheckerVisitor exte
         if (isFeatureMatch(name) != null) {
           return false;
         }
-        if(isLabel(name)) {
+        if (isLabel(name)) {
           return false;
         }
         if (name.indexOf(".") != -1) {
@@ -618,8 +639,7 @@ public class LanguageCheckerVisitor exte
             return false;
           }
         }
-        
-        
+
         pr.reportProblem(problemFactory.createTypeProblem(ref, sourceModule));
         return false;
       }
@@ -637,7 +657,8 @@ public class LanguageCheckerVisitor exte
       String[] keywords = RutaKeywordsManager.getKeywords(IRutaKeywords.ACTION);
       List<String> asList = Arrays.asList(keywords);
       if (!StringUtils.isEmpty(actionName) && !"-".equals(actionName)
-              && !asList.contains(actionName) && !implicitString.equals(tma.getName())) {
+              && !asList.contains(actionName) && !implicitString.equals(tma.getName())
+              && !actionExtensions.keySet().contains(actionName)) {
         IProblem problem = problemFactory.createUnknownActionProblem(tma);
         pr.reportProblem(problem);
       }
@@ -720,7 +741,8 @@ public class LanguageCheckerVisitor exte
       String[] keywords = RutaKeywordsManager.getKeywords(IRutaKeywords.CONDITION);
       List<String> asList = Arrays.asList(keywords);
       if (!StringUtils.isEmpty(conditionName) && !"-".equals(conditionName)
-              && !asList.contains(conditionName) && !implicitString.equals(cond.getName())) {
+              && !asList.contains(conditionName) && !implicitString.equals(cond.getName())
+              && !conditionExtensions.keySet().contains(cond)) {
         IProblem problem = problemFactory.createUnknownConditionProblem(cond);
         pr.reportProblem(problem);
       }
@@ -750,11 +772,11 @@ public class LanguageCheckerVisitor exte
           }
         }
       }
-      if(conditionName.equals("CONTAINS")) {
+      if (conditionName.equals("CONTAINS")) {
         List<?> args = cond.getChilds();
         boolean valid = checkContainsArguments(args);
       }
-      
+
     }
     if (s instanceof RutaFunction) {
       RutaFunction f = (RutaFunction) s;
@@ -787,48 +809,48 @@ public class LanguageCheckerVisitor exte
   private boolean checkContainsArguments(List<?> args) {
     if (args.size() == 1) {
       Object arg = args.get(0);
-//      if (arg instanceof ITypeExpression) {
-        return true;
-//      }
+      // if (arg instanceof ITypeExpression) {
+      return true;
+      // }
     } else if (args.size() == 2) {
       Object arg1 = args.get(0);
       Object arg2 = args.get(1);
-//      if (arg1 instanceof ListExpression) {
-        return true;
-//      }
+      // if (arg1 instanceof ListExpression) {
+      return true;
+      // }
     } else if (args.size() == 3) {
       Object arg1 = args.get(0);
       Object arg2 = args.get(1);
       Object arg3 = args.get(2);
-//      if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression
-//              && arg3 instanceof INumberExpression) {
-        return true;
-//      }
+      // if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression
+      // && arg3 instanceof INumberExpression) {
+      return true;
+      // }
     } else if (args.size() == 4) {
       Object arg1 = args.get(0);
       Object arg2 = args.get(1);
       Object arg3 = args.get(2);
       Object arg4 = args.get(3);
-//      if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression
-//              && arg3 instanceof INumberExpression && arg4 instanceof IBooleanExpression) {
-        return true;
-//      }
+      // if (arg1 instanceof ITypeExpression && arg2 instanceof INumberExpression
+      // && arg3 instanceof INumberExpression && arg4 instanceof IBooleanExpression) {
+      return true;
+      // }
     } else if (args.size() == 5) {
       Object arg1 = args.get(0);
       Object arg2 = args.get(1);
       Object arg3 = args.get(2);
       Object arg4 = args.get(3);
       Object arg5 = args.get(3);
-//      if (arg1 instanceof ListExpression && arg3 instanceof INumberExpression
-//              && arg4 instanceof INumberExpression && arg5 instanceof IBooleanExpression) {
-        return true;
-//      }
+      // if (arg1 instanceof ListExpression && arg3 instanceof INumberExpression
+      // && arg4 instanceof INumberExpression && arg5 instanceof IBooleanExpression) {
+      return true;
+      // }
     }
     return false;
   }
 
   private boolean isLabel(String name) {
-    return  currentLabels.contains(name);
+    return currentLabels.contains(name);
   }
 
   private String expand(String shortName) {
@@ -894,13 +916,17 @@ public class LanguageCheckerVisitor exte
     if (s instanceof RutaDeclareDeclarationsStatement) {
       parentTypeInDeclaration = null;
     }
-    if(!packageChecked) {
+    if (s instanceof RutaMacroDeclaration) {
+      RutaMacroDeclaration decl = (RutaMacroDeclaration) s;
+      knownLocalVariables.pop();
+     }
+    if (!packageChecked) {
       checkPackage(null);
     }
-    if(s instanceof RutaRule) {
+    if (s instanceof RutaRule) {
       currentLabels.clear();
     }
-    
+
     return super.endvisit(s);
   }
 
@@ -1363,10 +1389,10 @@ public class LanguageCheckerVisitor exte
           CoreException {
     IPath descriptorPath = RutaProjectUtils.getTypeSystemDescriptorPath(sourceModule.getResource()
             .getLocation(), sourceModule.getScriptProject().getProject());
-    if(descriptorPath == null) {
+    if (descriptorPath == null) {
       return null;
     }
-    
+
     TypeSystemDescription typeSysDescr = null;
     if (descriptorPath.toFile().exists()) {
       typeSysDescr = UIMAFramework.getXMLParser().parseTypeSystemDescription(
@@ -1412,4 +1438,42 @@ public class LanguageCheckerVisitor exte
     }
     return name;
   }
+  
+  private int getType(String name) {
+    if (name == null) {
+      return 0;
+    }
+    // TODO reuse field in constants
+    if (name.equals("STRING")) {
+      return RutaTypeConstants.RUTA_TYPE_S;
+    } else if (name.equals("STRINGLIST")) {
+      return RutaTypeConstants.RUTA_TYPE_SL;
+    } else if (name.equals("INT")) {
+      return RutaTypeConstants.RUTA_TYPE_I;
+    } else if (name.equals("INTLIST")) {
+      return RutaTypeConstants.RUTA_TYPE_NL;
+    } else if (name.equals("DOUBLE")) {
+      return RutaTypeConstants.RUTA_TYPE_D;
+    } else if (name.equals("DOUBLELIST")) {
+      return RutaTypeConstants.RUTA_TYPE_NL;
+    } else if (name.equals("FLOAT")) {
+      return RutaTypeConstants.RUTA_TYPE_F;
+    } else if (name.equals("FLOATLIST")) {
+      return RutaTypeConstants.RUTA_TYPE_NL;
+    } else if (name.equals("BOOLEAN")) {
+      return RutaTypeConstants.RUTA_TYPE_B;
+    } else if (name.equals("BOOLEANLIST")) {
+      return RutaTypeConstants.RUTA_TYPE_BL;
+    } else if (name.equals("TYPE")) {
+      return RutaTypeConstants.RUTA_TYPE_AT;
+    } else if (name.equals("TYPELIST")) {
+      return RutaTypeConstants.RUTA_TYPE_TL;
+    } else if (name.equals("ANNOTATION")) {
+      return RutaTypeConstants.RUTA_TYPE_UA;
+    } else if (name.equals("ANNOTATIONLIST")) {
+      return RutaTypeConstants.RUTA_TYPE_UAL;
+    }
+    return 0;
+  }
+  
 }

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Wed Jan 13 17:30:09 2016
@@ -30,6 +30,7 @@ package org.apache.uima.ruta.ide.core.pa
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
@@ -335,6 +336,8 @@ statement returns [List<Statement> stmts
 	:	
 	( stmts1 = declaration {stmts.addAll(stmts1);}
 	| stmtVariable = variableDeclaration {stmts.addAll(stmtVariable);}
+	| stmtCM = macroConditionDeclaration {stmts.add(stmtCM);}
+	| stmtAM = macroActionDeclaration {stmts.add(stmtAM);}
 	| stmt3 = blockDeclaration {stmts.add(stmt3);}
 	| (externalBlock)=> stmt4 = externalBlock {stmts.add(stmt4);}
 	| stmt2 = simpleStatement {stmts.add(stmt2);}
@@ -342,7 +345,42 @@ statement returns [List<Statement> stmts
 
 	)
 	;
-	
+
+macroConditionDeclaration returns [Statement stmt = null]
+@init {
+Map<Token,Token> def = new LinkedHashMap<>();
+}
+    :
+    kind = CONDITION name = Identifier 
+    LPAREN  
+    (argType = varTypeToken argName = Identifier  {def.put(argName,argType);}
+    (COMMA argType = varTypeToken argName = Identifier {def.put(argName,argType);})*)? 
+    RPAREN ASSIGN_EQUAL cs = conditions SEMI
+    {stmt = StatementFactory.createMacroStatement(kind, name, def, cs);}
+    ;
+
+
+macroActionDeclaration returns [Statement stmt = null]
+@init {
+Map<Token,Token> def = new LinkedHashMap<>();
+}
+    :
+    kind = ACTION name = Identifier 
+    LPAREN  
+    (argType = varTypeToken argName = Identifier  {def.put(argName,argType);}
+    (COMMA argType = varTypeToken argName = Identifier {def.put(argName,argType);})*)? 
+    RPAREN ASSIGN_EQUAL as = actions SEMI
+    {stmt = StatementFactory.createMacroStatement(kind, name, def, as);}
+    ;
+
+varTypeToken returns [Token token = null ]
+	:
+	t = (ANNOTATION | ANNOTATIONLIST | StringString | STRINGLIST 
+		| BooleanString | BOOLEANLIST | IntString | INTLIST 
+		| DoubleString | DOUBLELIST | FloatString | FLOATLIST
+		| TypeString | TYPELIST) {token = t;}
+	;
+
 importStatement returns [Statement stmt = null]
 	:
 	im = TypeSystemString 

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaExtensionManager.java Wed Jan 13 17:30:09 2016
@@ -70,7 +70,7 @@ public class RutaExtensionManager {
     if (infos == null) {
       return new IRutaLanguageExtension[0];
     }
-    List extensions = new ArrayList();
+    List<Object> extensions = new ArrayList<>();
     for (int i = 0; i < infos.length; i++) {
       Object object = manager.getInitObject(infos[i]);
       if (object instanceof IRutaLanguageExtension) {
@@ -83,7 +83,7 @@ public class RutaExtensionManager {
 
   public ISourceElementRequestVisitorExtension[] getSourceElementRequestoVisitorExtensions() {
     IRutaLanguageExtension[] extensions = getExtensions();
-    List result = new ArrayList();
+    List<ISourceElementRequestVisitorExtension> result = new ArrayList<>();
     for (int i = 0; i < extensions.length; i++) {
       ISourceElementRequestVisitorExtension visitorExtension = extensions[i]
               .createSourceElementRequestVisitorExtension();
@@ -97,7 +97,7 @@ public class RutaExtensionManager {
 
   public IMixinBuildVisitorExtension[] getMixinVisitorExtensions() {
     IRutaLanguageExtension[] extensions = getExtensions();
-    List result = new ArrayList();
+    List<IMixinBuildVisitorExtension> result = new ArrayList<>();
     for (int i = 0; i < extensions.length; i++) {
       IMixinBuildVisitorExtension visitorExtension = extensions[i]
               .createMixinBuildVisitorExtension();
@@ -111,7 +111,7 @@ public class RutaExtensionManager {
 
   public IMatchLocatorExtension[] getMatchLocatorExtensions() {
     IRutaLanguageExtension[] extensions = getExtensions();
-    List result = new ArrayList();
+    List<IMatchLocatorExtension> result = new ArrayList<>();
     for (int i = 0; i < extensions.length; i++) {
       IMatchLocatorExtension visitorExtension = extensions[i].createMatchLocatorExtension();
       if (visitorExtension != null) {
@@ -123,7 +123,7 @@ public class RutaExtensionManager {
 
   public ICompletionExtension[] getCompletionExtensions() {
     IRutaLanguageExtension[] extensions = getExtensions();
-    List result = new ArrayList();
+    List<ICompletionExtension> result = new ArrayList<>();
     for (int i = 0; i < extensions.length; i++) {
       ICompletionExtension visitorExtension = extensions[i].createCompletionExtension();
       if (visitorExtension != null) {
@@ -135,7 +135,7 @@ public class RutaExtensionManager {
 
   public ISelectionExtension[] getSelectionExtensions() {
     IRutaLanguageExtension[] extensions = getExtensions();
-    List result = new ArrayList();
+    List<ISelectionExtension> result = new ArrayList<>();
     for (int i = 0; i < extensions.length; i++) {
       ISelectionExtension visitorExtension = extensions[i].createSelectionExtension();
       if (visitorExtension != null) {

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/RutaKeywords.java Wed Jan 13 17:30:09 2016
@@ -29,7 +29,7 @@ public class RutaKeywords implements IRu
   private static String[] declaration = { "WORDLIST", "DECLARE", "BOOLEAN", "PACKAGE", "TYPE",
       "TYPESYSTEM", "INT", "DOUBLE", "FLOAT", "STRING", "SCRIPT", "WORDTABLE", "ENGINE", "BLOCK",
       "BOOLEANLIST", "INTLIST", "DOUBLELIST", "FLOATLIST", "STRINGLIST", "TYPELIST",
-      "UIMAFIT", "IMPORT" , "FROM", "AS", "null", "ANNOTATION", "ANNOTATIONLIST" };
+      "UIMAFIT", "IMPORT" , "FROM", "AS", "null", "ANNOTATION", "ANNOTATIONLIST", "ACTION", "CONDITION" };
 
   private static String[] action = { "DEL", "CALL", "MARK", "MARKSCORE", "COLOR", "LOG", "REPLACE",
       "FILLOBJECT", "RETAINTYPE", "SETFEATURE", "ASSIGN", "PUTINLIST", "ATTRIBUTE", "MARKFAST",

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaExpressionList.java Wed Jan 13 17:30:09 2016
@@ -30,14 +30,14 @@ import org.eclipse.dltk.ast.statements.S
 import org.eclipse.dltk.utils.CorePrinter;
 
 public class RutaExpressionList extends Expression {
-  private List<Expression> expressions;
+  private List<? extends Expression> expressions;
 
   /**
    * Statement with bounds from first to last expression.
    * 
    * @param expressions
    */
-  public RutaExpressionList(List<Expression> expressions) {
+  public RutaExpressionList(List<? extends Expression> expressions) {
     if (!expressions.isEmpty()) {
       // First
       Expression first = expressions.get(0);
@@ -69,7 +69,7 @@ public class RutaExpressionList extends
     }
   }
 
-  public List<Expression> getExpressions() {
+  public List<? extends Expression> getExpressions() {
     return this.expressions;
   }
 
@@ -109,7 +109,7 @@ public class RutaExpressionList extends
   public void printNode(CorePrinter output) {
     if (this.expressions != null) {
       output.formatPrintLn("");
-      Iterator i = this.expressions.iterator();
+      Iterator<? extends Expression> i = this.expressions.iterator();
       while (i.hasNext()) {
         ASTNode node = (ASTNode) i.next();
         node.printNode(output);
@@ -122,7 +122,7 @@ public class RutaExpressionList extends
   public String toString() {
     String value = "";
     if (this.expressions != null) {
-      Iterator i = this.expressions.iterator();
+      Iterator<? extends Expression> i = this.expressions.iterator();
       while (i.hasNext()) {
         ASTNode node = (ASTNode) i.next();
         value += node.toString();

Added: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java?rev=1724465&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java (added)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java Wed Jan 13 17:30:09 2016
@@ -0,0 +1,43 @@
+/*
+ * 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.parser.ast;
+
+import java.util.Map;
+
+import org.antlr.runtime.Token;
+import org.eclipse.dltk.ast.expressions.Expression;
+import org.eclipse.dltk.ast.references.SimpleReference;
+
+public class RutaMacroDeclaration extends RutaVariableDeclaration {
+
+  private final Map<Token, Token> definition;
+  
+  public RutaMacroDeclaration(String name, int nameStart, int nameEnd, int declStart, int declEnd,
+          SimpleReference ref, int type, Map<Token, Token> definition, Expression initExpression) {
+    super(name, nameStart, nameEnd, declStart, declEnd, ref, type, initExpression);
+    this.definition = definition;
+  }
+
+  public Map<Token, Token> getDefinition() {
+    return definition;
+  }
+
+  
+}

Propchange: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaMacroDeclaration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaStatement.java Wed Jan 13 17:30:09 2016
@@ -110,7 +110,7 @@ public class RutaStatement extends State
   public void printNode(CorePrinter output) {
     if (this.expressions != null) {
       output.formatPrintLn("");
-      Iterator i = this.expressions.iterator();
+      Iterator<Expression> i = this.expressions.iterator();
       while (i.hasNext()) {
         ASTNode node = (ASTNode) i.next();
         node.printNode(output);
@@ -123,7 +123,7 @@ public class RutaStatement extends State
   public String toString() {
     String value = "";
     if (this.expressions != null) {
-      Iterator i = this.expressions.iterator();
+      Iterator<Expression> i = this.expressions.iterator();
       while (i.hasNext()) {
         ASTNode node = (ASTNode) i.next();
         value += node.toString();

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaTypeConstants.java Wed Jan 13 17:30:09 2016
@@ -124,7 +124,7 @@ public final class RutaTypeConstants {
     typeStringOfInt.put(RUTA_TYPE_NL, "NUMBERLIST");
     typeStringOfInt.put(RUTA_TYPE_SL, "STRINGLIST");
     typeStringOfInt.put(RUTA_TYPE_TL, "TYPELIST");
-    typeStringOfInt.put(RUTA_TYPE_AT, "ANNOTATION_TYPE");
+    typeStringOfInt.put(RUTA_TYPE_AT, "TYPE");
     typeStringOfInt.put(RUTA_TYPE_G, "GENERIC");
   }
 

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaUnaryArithmeticExpression.java Wed Jan 13 17:30:09 2016
@@ -49,8 +49,8 @@ public class RutaUnaryArithmeticExpressi
   @Override
   public String getOperator() {
     Map<String, Integer> map = RutaExpressionConstants.opIDs;
-    for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-      String key = (String) iterator.next();
+    for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) {
+      String key = iterator.next();
       Integer intID = map.get(key);
       if (intID.equals(opID)) {
         return key;

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java?rev=1724465&r1=1724464&r2=1724465&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java Wed Jan 13 17:30:09 2016
@@ -21,6 +21,7 @@ package org.apache.uima.ruta.ide.parser.
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.antlr.runtime.CommonToken;
 import org.antlr.runtime.Token;
@@ -273,12 +274,13 @@ public class StatementFactory extends Ab
             declBounds[0], declBounds[1], ref, eachTO);
   }
 
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({ "rawtypes" })
   public static Statement createDeclareDeclarationsStatement(Token declareToken, List declarations,
           ASTNode parent) {
     return createDeclareDeclarationsStatement(declareToken, declarations, parent, new ArrayList<RutaFeatureDeclaration>(0));
   }
   
+  @SuppressWarnings({ "unchecked", "rawtypes" })
   public static Statement createDeclareDeclarationsStatement(Token declareToken, List declarations,
           ASTNode parent, List<RutaFeatureDeclaration> features) {
     List<RutaAbstractDeclaration> decls = declarations;
@@ -304,7 +306,7 @@ public class StatementFactory extends Ab
   }
   
 
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({ "rawtypes", "unchecked" })
   public static Statement createDeclarationsStatement(Token declareToken, List declarations,
           Expression init) {
     List<RutaAbstractDeclaration> decls = declarations;
@@ -325,15 +327,15 @@ public class StatementFactory extends Ab
             init, declBounds[0], declBounds[1]);
   }
 
-  @SuppressWarnings("unchecked")
+
+  @SuppressWarnings("rawtypes")
   public static Statement createDeclarationsStatement(Token declareToken, List declarations) {
     return createDeclarationsStatement(declareToken, declarations, null);
   }
 
-  @SuppressWarnings("unchecked")
   public static Statement createDeclarationsStatement(Token declareToken,
           RutaAbstractDeclaration declaration, Expression init) {
-    List decl = new ArrayList<RutaAbstractDeclaration>();
+    List<RutaAbstractDeclaration> decl = new ArrayList<>();
     return createDeclarationsStatement(declareToken, decl, init);
   }
 
@@ -368,6 +370,19 @@ public class StatementFactory extends Ab
     return new ComponentDeclaration(nameBounds[0], nameBounds[0] + text.length(), text);
   }
 
+  public static Statement createMacroStatement(Token kind, Token name, Map<Token, Token> def,
+          List<? extends Expression> elements) {
+    int declBounds[] = getBounds(kind, elements.get(elements.size()-1));
+    int nameBounds[] = getBounds(name);
+    int k = kind.equals("CONDITION") ? RutaTypeConstants.RUTA_TYPE_C : RutaTypeConstants.RUTA_TYPE_A;
+    // FieldDeclaration
+    SimpleReference ref = new RutaVariableReference(nameBounds[0], nameBounds[1], name.getText(),
+            k);
+    RutaExpressionList expr = new RutaExpressionList(elements); 
+    return new RutaVariableDeclaration(name.getText(), nameBounds[0], nameBounds[1], declBounds[0],
+            declBounds[1], ref, k, expr);
+  }
+
 
 
 }