You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2012/06/20 16:01:08 UTC

svn commit: r1352107 - in /ant/sandbox/antdsl: org.apache.ant.antdsl/src/org/apache/ant/antdsl/ org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/ test/

Author: hibou
Date: Wed Jun 20 14:01:07 2012
New Revision: 1352107

URL: http://svn.apache.org/viewvc?rev=1352107&view=rev
Log:
Add support for boolean expressions

Modified:
    ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntDSL.g
    ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext
    ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java
    ant/sandbox/antdsl/test/build.ant

Modified: ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntDSL.g
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntDSL.g?rev=1352107&r1=1352106&r2=1352107&view=diff
==============================================================================
--- ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntDSL.g (original)
+++ ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntDSL.g Wed Jun 20 14:01:07 2012
@@ -90,8 +90,8 @@ extensionPoint returns [ExtensionPoint e
     'extension-point' n=NAME
     ('depends' d=targetList)?
     ('extensionOf' eo=targetList ('onMiss' onMiss=STRING )? )?
-    ('if' if_=innerElement { ep.setIf(projectHelper.mapExpectedUnknown(project, context, if_, Condition.class)); } )?
-    ('unless' unless=innerElement { ep.setUnless(projectHelper.mapExpectedUnknown(project, context, unless, Condition.class)); } )?
+    ('if' if_=boolExpr { ep.setIf(if_); } )?
+    ('unless' unless=boolExpr { ep.setUnless(unless); } )?
     { projectHelper.mapCommonTarget(ep, project, context, $n.text, $desc.text, d, eo, $onMiss.text); }
     { context.setCurrentTarget(context.getImplicitTarget()); }
     ;
@@ -102,8 +102,8 @@ target returns [Target t = new Target()]
     'target' n=NAME
     ('depends' d=targetList)?
     ('extensionOf' eo=targetList ('onMiss' onMiss=STRING)? )?
-    ('if' if_=innerElement { t.setIf(projectHelper.mapExpectedUnknown(project, context, if_, Condition.class)); } )?
-    ('unless' unless=innerElement { t.setUnless(projectHelper.mapExpectedUnknown(project, context, unless, Condition.class)); } )?
+    ('if' if_=boolExpr { t.setIf(if_); } )?
+    ('unless' unless=boolExpr { t.setUnless(unless); } )?
     { projectHelper.mapCommonTarget(t, project, context, $n.text, $desc.text, d, eo, $onMiss.text); }
     tl=taskList?
     { for (Task task : tl) { t.addTask(task); } }
@@ -168,10 +168,59 @@ branch returns [IfTask if_ = new IfTask(
 
 conditionedTasks returns [ConditionnalSequential seq = new ConditionnalSequential()]:
     { projectHelper.mapCommonTask(project, context, seq); }
-    'if' '(' ie=innerElement { seq.setCondition(projectHelper.mapExpectedUnknown(project, context, ie, Condition.class)); } ')'
+    'if' '(' ie=boolExpr { seq.setCondition(ie); } ')'
     tl=taskList { for (Task t : tl) { seq.addTask(t); } }
     ;
 
+boolExpr returns [Condition c]:
+    be=boolXorExpr { c = be; } ;
+
+boolXorExpr returns [Condition c]:
+    be=boolOrExpr { c = be; }
+    ( '^^' right=boolOrExpr
+      { Xor xor = new Xor();
+        xor.setProject(project);
+        xor.add(c);
+        xor.add(right);
+        c = xor;
+      }
+    )*;
+
+boolOrExpr returns [Condition c]:
+    be=boolAndExpr { c = be; }
+    ( '||' right=boolAndExpr
+      { Or or = new Or();
+        or.setProject(project);
+        or.add(c);
+        or.add(right);
+        c = or;
+      }
+    )*;
+
+boolAndExpr returns [Condition c]:
+    be=boolPrimaryExpr { c = be; }
+    ( '&&' right=boolPrimaryExpr
+      { And and = new And();
+        and.setProject(project);
+        and.add(c);
+        and.add(right);
+        c = and;
+      }
+    )*;
+
+boolPrimaryExpr returns [Condition c]:
+     ie=innerElement { c = projectHelper.mapExpectedUnknown(project, context, ie, Condition.class); }
+   | '(' be=boolExpr { c = be; } ')'
+   | be=boolNotExpr { c = be; } ;
+
+boolNotExpr returns [Condition c]:
+    '!' be=boolExpr
+    { Not not = new Not();
+      not.setProject(project);
+      not.add(be);
+      c = not;
+    };
+
 macrodef returns [MacroDef macroDef = new MacroDef()]:
     ( DOC { macroDef.setDescription($DOC.text); } )?  
     'macrodef' NAME { macroDef.setName($NAME.text); }

Modified: ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext?rev=1352107&r1=1352106&r2=1352107&view=diff
==============================================================================
--- ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext (original)
+++ ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext Wed Jun 20 14:01:07 2012
@@ -35,12 +35,12 @@ ENamespace:
 
 EExtensionPoint:
     description=DOC? 'extension-point' name=NAME (('extensionOf' extensionsOf=ETargetList ('onMiss' onMissingExtensionPoint=STRING)? )?
-        & ('depends' depends=ETargetList)? & ('if' if=EInnerElement)? & ('unless' unless=EInnerElement)?
+        & ('depends' depends=ETargetList)? & ('if' if=EBoolExpr)? & ('unless' unless=EBoolExpr)?
     );
 
 ETarget:
     description=DOC? 'target' name=NAME (('extensionOf' extensionsOf=ETargetList ('onMiss' onMissingExtensionPoint=STRING)? )?
-        & ('depends' depends=ETargetList)? & ('if' if=EInnerElement)? & ('unless' unless=EInnerElement)?
+        & ('depends' depends=ETargetList)? & ('if' if=EBoolExpr)? & ('unless' unless=EBoolExpr)?
     ) tasks=ETaskLists?;
 
 ETaskLists:
@@ -81,7 +81,27 @@ EBranch:
     if=EConditionedTasks ('else' elseif+=EConditionedTasks )* ('else' else=ETaskLists)?;
 
 EConditionedTasks:
-    'if' '(' condition=EInnerElement ')' tasks=ETaskLists;
+    'if' '(' condition=EBoolExpr ')' tasks=ETaskLists;
+
+EBoolExpr:
+    EBoolXorExpr;
+
+EBoolXorExpr returns EBoolExpr:
+    EBoolOrExpr ({EBoolXorExpr.left=current} '^^' right=EBoolOrExpr)*;
+
+EBoolOrExpr returns EBoolExpr:
+    EBoolAndExpr ({EBoolOrExpr.left=current} '||' right=EBoolAndExpr)*;
+
+EBoolAndExpr returns EBoolExpr:
+    EBoolPrimaryExpr ({EBoolAndExpr.left=current} '&&' right=EBoolPrimaryExpr)*;
+
+EBoolPrimaryExpr returns EBoolExpr:
+     EInnerElement
+   | '(' EBoolExpr ')'
+   | EBoolNotExpr;
+
+EBoolNotExpr returns EBoolNotExpr:
+    '!' expr=EBoolExpr;
 
 EMacrodef:
     description=DOC? 'macrodef' name=NAME '(' attributes=EAttributes? ')' tasks=ETaskLists;

Modified: ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java?rev=1352107&r1=1352106&r2=1352107&view=diff
==============================================================================
--- ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java (original)
+++ ant/sandbox/antdsl/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java Wed Jun 20 14:01:07 2012
@@ -36,6 +36,11 @@ import org.apache.ant.antdsl.xtext.antds
 import org.apache.ant.antdsl.xtext.antdsl.EArguments;
 import org.apache.ant.antdsl.xtext.antdsl.EAttribute;
 import org.apache.ant.antdsl.xtext.antdsl.EAttributes;
+import org.apache.ant.antdsl.xtext.antdsl.EBoolAndExpr;
+import org.apache.ant.antdsl.xtext.antdsl.EBoolExpr;
+import org.apache.ant.antdsl.xtext.antdsl.EBoolNotExpr;
+import org.apache.ant.antdsl.xtext.antdsl.EBoolOrExpr;
+import org.apache.ant.antdsl.xtext.antdsl.EBoolXorExpr;
 import org.apache.ant.antdsl.xtext.antdsl.EBranch;
 import org.apache.ant.antdsl.xtext.antdsl.EConditionedTasks;
 import org.apache.ant.antdsl.xtext.antdsl.EElementAttribute;
@@ -62,7 +67,11 @@ import org.apache.tools.ant.taskdefs.Mac
 import org.apache.tools.ant.taskdefs.MacroDef.Text;
 import org.apache.tools.ant.taskdefs.Property;
 import org.apache.tools.ant.taskdefs.Sequential;
+import org.apache.tools.ant.taskdefs.condition.And;
 import org.apache.tools.ant.taskdefs.condition.Condition;
+import org.apache.tools.ant.taskdefs.condition.Not;
+import org.apache.tools.ant.taskdefs.condition.Or;
+import org.apache.tools.ant.taskdefs.condition.Xor;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.xtext.nodemodel.INode;
 import org.eclipse.xtext.parser.IParseResult;
@@ -180,8 +189,8 @@ public class AntDslXTextProjectHelper ex
     private Target mapTarget(Project project, AntDslContext context, ETarget eTarget) {
         Target target = new Target();
         context.setCurrentTarget(target);
-        target.setIf(mapExpectedUnknown(project, context, mapInnerElement(eTarget.getIf()), Condition.class));
-        target.setUnless(mapExpectedUnknown(project, context, mapInnerElement(eTarget.getUnless()), Condition.class));
+        target.setIf(mapCondition(project, context, eTarget.getIf()));
+        target.setUnless(mapCondition(project, context, eTarget.getUnless()));
         mapCommonTarget(target, project, context, eTarget.getName(), eTarget.getDescription(), mapTargetList(eTarget.getDepends()),
                 mapTargetList(eTarget.getExtensionsOf()), eTarget.getOnMissingExtensionPoint());
         ETaskLists tasks = eTarget.getTasks();
@@ -203,8 +212,8 @@ public class AntDslXTextProjectHelper ex
 
     private ExtensionPoint mapExtensionPoint(Project project, AntDslContext context, EExtensionPoint eExtensionPoint) {
         ExtensionPoint extensionPoint = new ExtensionPoint();
-        extensionPoint.setIf(mapExpectedUnknown(project, context, mapInnerElement(eExtensionPoint.getIf()), Condition.class));
-        extensionPoint.setUnless(mapExpectedUnknown(project, context, mapInnerElement(eExtensionPoint.getUnless()), Condition.class));
+        extensionPoint.setIf(mapCondition(project, context, eExtensionPoint.getIf()));
+        extensionPoint.setUnless(mapCondition(project, context, eExtensionPoint.getUnless()));
         mapCommonTarget(extensionPoint, project, context, eExtensionPoint.getName(), eExtensionPoint.getDescription(),
                 mapTargetList(eExtensionPoint.getDepends()), mapTargetList(eExtensionPoint.getExtensionsOf()),
                 eExtensionPoint.getOnMissingExtensionPoint());
@@ -241,7 +250,7 @@ public class AntDslXTextProjectHelper ex
             if (if_ != null) {
                 ConditionnalSequential main = new ConditionnalSequential();
                 mapCommonTask(project, context, main);
-                main.setCondition(mapExpectedUnknown(project, context, mapInnerElement(if_.getCondition()), Condition.class));
+                main.setCondition(mapCondition(project, context, if_.getCondition()));
                 for (ETask t : if_.getTasks().getTasks()) {
                     main.addTask(mapTask(project, context, t));
                 }
@@ -252,7 +261,7 @@ public class AntDslXTextProjectHelper ex
                 for (EConditionedTasks elseif : elseifs) {
                     ConditionnalSequential ei = new ConditionnalSequential();
                     mapCommonTask(project, context, ei);
-                    ei.setCondition(mapExpectedUnknown(project, context, mapInnerElement(elseif.getCondition()), Condition.class));
+                    ei.setCondition(mapCondition(project, context, elseif.getCondition()));
                     for (ETask t : elseif.getTasks().getTasks()) {
                         ei.addTask(mapTask(project, context, t));
                     }
@@ -273,6 +282,48 @@ public class AntDslXTextProjectHelper ex
         throw new IllegalStateException("Unknown task type " + eTask.getClass().getName());
     }
 
+    private Condition mapCondition(Project project, AntDslContext context, EBoolExpr expr) {
+        if (expr == null) {
+            return null;
+        }
+        if (expr instanceof EInnerElement) {
+            EInnerElement elemExpr = (EInnerElement) expr;
+            return mapExpectedUnknown(project, context, mapInnerElement(elemExpr), Condition.class);
+        }
+        if (expr instanceof EBoolAndExpr) {
+            EBoolAndExpr andExpr = (EBoolAndExpr) expr;
+            And and = new And();
+            and.setProject(project);
+            and.add(mapCondition(project, context, andExpr.getLeft()));
+            and.add(mapCondition(project, context, andExpr.getRight()));
+            return and;
+        }
+        if (expr instanceof EBoolOrExpr) {
+            EBoolOrExpr orExpr = (EBoolOrExpr) expr;
+            Or or = new Or();
+            or.setProject(project);
+            or.add(mapCondition(project, context, orExpr.getLeft()));
+            or.add(mapCondition(project, context, orExpr.getRight()));
+            return or;
+        }
+        if (expr instanceof EBoolXorExpr) {
+            EBoolXorExpr xorExpr = (EBoolXorExpr) expr;
+            Xor xor = new Xor();
+            xor.setProject(project);
+            xor.add(mapCondition(project, context, xorExpr.getLeft()));
+            xor.add(mapCondition(project, context, xorExpr.getRight()));
+            return xor;
+        }
+        if (expr instanceof EBoolNotExpr) {
+            EBoolNotExpr notExpr = (EBoolNotExpr) expr;
+            Not not = new Not();
+            not.setProject(project);
+            not.add(mapCondition(project, context, notExpr.getExpr()));
+            return not;
+        }
+        throw new IllegalArgumentException("Unsupported boolean expression " + expr.getClass().getName());
+    }
+
     private InnerElement mapInnerElement(EInnerElement eInnerElement) {
         if (eInnerElement == null) {
             return null;

Modified: ant/sandbox/antdsl/test/build.ant
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/test/build.ant?rev=1352107&r1=1352106&r2=1352107&view=diff
==============================================================================
--- ant/sandbox/antdsl/test/build.ant (original)
+++ ant/sandbox/antdsl/test/build.ant Wed Jun 20 14:01:07 2012
@@ -50,5 +50,9 @@ target build
     } else {
         fail(message = "fail !")
     }
+    if (isset(property = "foo") && !isset(property = "notsetproperty")) {
+        echo(message = "test ok")
+    } else {
+        fail(message = "fail !")
+    }
 }
-