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 !")
+ }
}
-