From a428423ff2f7aecd75dcc69b9c93fffc7264c55d Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 8 May 2016 12:19:40 -0400 Subject: [PATCH] Support when(...) clause in assert in facets. --- js/compiler/compiler.js | 25 ++++++++++++++++++------- js/compiler/syndicate.ohm | 9 ++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/js/compiler/compiler.js b/js/compiler/compiler.js index 45d80ae..e1f742d 100644 --- a/js/compiler/compiler.js +++ b/js/compiler/compiler.js @@ -144,8 +144,8 @@ var modifiedSourceActions = { return '\n.addDoneBlock((function() ' + block.asES5 + '))'; }, - FacetSituation_assert: function(_assert, expr, _sc) { - return '\n.addAssertion(' + buildSubscription([expr], 'assert', 'pattern') + ')'; + FacetSituation_assert: function(_assert, expr, whenClause, _sc) { + return '\n.addAssertion(' + buildSubscription([expr], 'assert', 'pattern', whenClause) + ')'; }, FacetSituation_event: function(_on, eventPattern, block) { return buildOnEvent(false, @@ -172,6 +172,10 @@ var modifiedSourceActions = { '.completeBuild(); }'); }, + AssertWhenClause: function(_when, _lparen, expr, _rparen) { + return expr.asES5; + }, + FacetStateTransition_withContinuation: function(_case, eventPattern, block) { return buildCaseEvent(eventPattern, block.asES5); }, @@ -200,9 +204,13 @@ semantics.addAttribute('eventType', { FacetTransitionEventPattern_risingEdge: function (_lp, expr, _rp) { return 'risingEdge'; } }); -function buildSubscription(children, patchMethod, mode) { +function buildSubscription(children, patchMethod, mode, whenClause) { var fragments = []; + var hasWhenClause = (whenClause && (whenClause.numChildren === 1)); fragments.push('(function() { var _ = Syndicate.__; return '); + if (hasWhenClause) { + fragments.push('(' + whenClause.asES5 + ') ? '); + } if (patchMethod) { fragments.push('Syndicate.Patch.' + patchMethod + '('); } else { @@ -220,31 +228,34 @@ function buildSubscription(children, patchMethod, mode) { } else { fragments.push(' }'); } + if (hasWhenClause) { + fragments.push(' : Syndicate.Patch.emptyPatch'); + } fragments.push('; })'); return fragments.join(''); } semantics.addAttribute('subscription', { _default: function(children) { - return buildSubscription(children, 'sub', 'pattern'); + return buildSubscription(children, 'sub', 'pattern', null); } }); semantics.addAttribute('instantiatedSubscription', { _default: function(children) { - return buildSubscription(children, 'sub', 'instantiated'); + return buildSubscription(children, 'sub', 'instantiated', null); } }); semantics.addAttribute('instantiatedProjection', { _default: function(children) { - return buildSubscription(children, null, 'instantiated'); + return buildSubscription(children, null, 'instantiated', null); } }); semantics.addAttribute('projection', { _default: function(children) { - return buildSubscription(children, null, 'projection'); + return buildSubscription(children, null, 'projection', null); } }); diff --git a/js/compiler/syndicate.ohm b/js/compiler/syndicate.ohm index 5fb2da7..d52f5e0 100644 --- a/js/compiler/syndicate.ohm +++ b/js/compiler/syndicate.ohm @@ -41,9 +41,11 @@ Syndicate <: ES5 { FacetDoneBlock = done Block FacetSituation - = assert FacetPattern #(sc) -- assert - | on FacetEventPattern Block -- event - | during FacetPattern FacetBlock -- during + = assert FacetPattern AssertWhenClause? #(sc) -- assert + | on FacetEventPattern Block -- event + | during FacetPattern FacetBlock -- during + + AssertWhenClause = when "(" Expression ")" FacetEventPattern = message FacetPattern -- messageEvent @@ -84,4 +86,5 @@ Syndicate <: ES5 { state = "state" ~identifierPart type = "type" ~identifierPart until = "until" ~identifierPart + when = "when" ~identifierPart }