diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java b/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java index c2d2219f0..d9607577f 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java @@ -225,6 +225,23 @@ public class HoistingProcessorTest extends AbstractXtextTests { assertTrue(guard.hasTerminal()); } + @Test + public void testGroupInGroup_expectMinimalParentheses() throws Exception { + // @formatter:off + String model = + MODEL_PREAMBLE + + "S: $$ p0 $$?=> ($$ p1 $$?=> ($$ p2 $$?=> 'a')); "; + // @formatter:off + XtextResource resource = getResourceFromString(model); + Grammar grammar = ((Grammar) resource.getContents().get(0)); + AbstractRule rule = getRule(grammar, "S"); + + HoistingGuard guard = hoistingProcessor.findHoistingGuard(rule.getAlternatives()); + assertFalse(guard.isTrivial()); + assertTrue(guard.hasTerminal()); + assertEquals("((p0) && (p1) && (p2))", guard.render()); + } + @Test public void testCardinalityPlusPredicate_expectPredicateAfterGroupNotInGuard() throws Exception { // @formatter:off diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/GroupGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/GroupGuard.java index d0be39445..001b34395 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/GroupGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/GroupGuard.java @@ -31,8 +31,15 @@ public class GroupGuard implements HoistingGuard { } public void add(Guard guard) { - if (!guard.isTrivial()) + if (guard.isTrivial()) { + return; + } + + if (guard instanceof GroupGuard) { + ((GroupGuard) guard).elementGuards.forEach(this::add); + } else { elementGuards.add(guard); + } } public void setHasTerminal() {