diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/OverriddenValueInspector.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/OverriddenValueInspector.java index a14ef9795..20845b154 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/OverriddenValueInspector.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/OverriddenValueInspector.java @@ -19,6 +19,7 @@ import org.eclipse.xtext.Assignment; import org.eclipse.xtext.CompoundElement; import org.eclipse.xtext.EnumRule; import org.eclipse.xtext.GrammarUtil; +import org.eclipse.xtext.Keyword; import org.eclipse.xtext.ParserRule; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.TerminalRule; @@ -91,6 +92,9 @@ public class OverriddenValueInspector extends XtextRuleInspector mergedAssignedFeatures = LinkedHashMultimap.create(); Set prevPermanentlyVisited = permanentlyVisited; Set mergedPermanentlyVisited = Sets.newHashSet(); + boolean allAborted = true; for (AbstractElement element : object.getElements()) { assignedFeatures = newMultimap(prevAssignedFeatures); permanentlyVisited = Sets.newHashSet(prevPermanentlyVisited); - doSwitch(element); + if (!doSwitch(element)) { + allAborted = false; + } mergedAssignedFeatures.putAll(assignedFeatures); mergedPermanentlyVisited.addAll(prevPermanentlyVisited); } @@ -198,7 +205,7 @@ public class OverriddenValueInspector extends XtextRuleInspector newMultimap(Multimap from) { return LinkedHashMultimap.create(from); } + + @Override + public Boolean caseAbstractElement(AbstractElement object) { + return Boolean.FALSE; + } @Override public Boolean caseCompoundElement(CompoundElement object) { Multimap prevAssignedFeatures = newMultimap(assignedFeatures); for (AbstractElement element : object.getElements()) { - doSwitch(element); + if (doSwitch(element)) { + if (GrammarUtil.isOptionalCardinality(object)) + assignedFeatures.putAll(prevAssignedFeatures); + return Boolean.TRUE; + } } if (GrammarUtil.isMultipleCardinality(object)) { for (AbstractElement element : object.getElements()) { diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/OverriddenValueInspectorTest.xtend b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/OverriddenValueInspectorTest.xtend index 68416439a..36b92fa73 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/OverriddenValueInspectorTest.xtend +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/OverriddenValueInspectorTest.xtend @@ -119,6 +119,86 @@ class OverriddenValueInspectorTest extends AbstractXtextRuleInspectorTest