diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/SuperCallScope.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/SuperCallScope.java index a69202929..b86b07c4e 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/SuperCallScope.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/SuperCallScope.java @@ -31,7 +31,7 @@ import com.google.common.collect.Maps; */ public class SuperCallScope implements IScope { - private static final String SUPER = "super"; + static final String SUPER = "super"; /** * Used during linking to set the {@link RuleCall#isExplicitlyCalled() flag} diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextConfigurableIssueCodes.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextConfigurableIssueCodes.java index ef853a1fa..cea6c2f54 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextConfigurableIssueCodes.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextConfigurableIssueCodes.java @@ -39,6 +39,7 @@ public class XtextConfigurableIssueCodes extends ConfigurableIssueCodesProvider public static final String INVALID_PACKAGE_REFERENCE_EXTERNAL = ISSUE_CODE_PREFIX + "InvalidPackageReference.external"; public static final String INVALID_PACKAGE_REFERENCE_NOT_ON_CLASSPATH = ISSUE_CODE_PREFIX + "InvalidPackageReference.notOnClasspath"; public static final String INVALID_TERMINALRULE_NAME = ISSUE_CODE_PREFIX + "InvalidTerminalRuleName"; + public static final String DISCOURAGED_RULE_NAME = ISSUE_CODE_PREFIX + "DiscouragedName"; public static final String DUPLICATE_ENUM_LITERAL = ISSUE_CODE_PREFIX + "DuplicateEnumLiteral"; public static final String BIDIRECTIONAL_REFERENCE = ISSUE_CODE_PREFIX + "BidirectionalReference"; @@ -69,6 +70,7 @@ public class XtextConfigurableIssueCodes extends ConfigurableIssueCodesProvider acceptor.accept(create(INVALID_TERMINALRULE_NAME, SeverityConverter.SEVERITY_WARNING)); acceptor.accept(create(DUPLICATE_ENUM_LITERAL, SeverityConverter.SEVERITY_WARNING)); acceptor.accept(create(BIDIRECTIONAL_REFERENCE, SeverityConverter.SEVERITY_WARNING)); + acceptor.accept(create(DISCOURAGED_RULE_NAME, SeverityConverter.SEVERITY_WARNING)); } protected final PreferenceKey create(String id, String defaultValue) { diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextValidator.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextValidator.java index da74c6f2f..1079d5387 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextValidator.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextValidator.java @@ -693,6 +693,7 @@ public class XtextValidator extends AbstractDeclarativeValidator { if (!superGrammar) message = message + " This grammar contains another rule '" + name + "'."; error(message, XtextPackage.Literals.ABSTRACT_RULE__NAME); + return; } } else { @@ -710,8 +711,12 @@ public class XtextValidator extends AbstractDeclarativeValidator { builder.append("'").append(name).append("'"); } error(message + " The conflicting rules are " + builder + ".", XtextPackage.Literals.ABSTRACT_RULE__NAME); + return; } } + if (SuperCallScope.SUPER.equals(rule.getName())) { + addIssue("Discouraged rule name 'super'", rule, XtextPackage.Literals.ABSTRACT_RULE__NAME, DISCOURAGED_RULE_NAME); + } } private Multimap getAllRules(Grammar grammar, String name) { diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/XtextValidationTest.java b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/XtextValidationTest.java index 80e562022..6c7b07ecf 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/XtextValidationTest.java +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/XtextValidationTest.java @@ -82,6 +82,24 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC state.context = newHashMap(); } + @Test public void testRuleCalledSuper() throws Exception { + XtextResource resource = getResourceFromString( + "grammar com.acme.Bar with org.eclipse.xtext.common.Terminals\n" + + "generate metamodel 'myURI'\n" + + "Model: super=super;\n" + + "super: name=ID;"); + + IResourceValidator validator = get(IResourceValidator.class); + List issues = validator.validate(resource, CheckMode.FAST_ONLY, CancelIndicator.NullImpl); + assertEquals(issues.toString(), 1, issues.size()); + assertEquals("Discouraged rule name 'super'", issues.get(0).getMessage()); + Grammar grammar = (Grammar) resource.getContents().get(0); + AbstractRule model = grammar.getRules().get(0); + Assignment assignment = (Assignment) model.getAlternatives(); + RuleCall ruleCall = (RuleCall) assignment.getTerminal(); + assertSame(grammar.getRules().get(1), ruleCall.getRule()); + } + @Test public void testMissingArgument() throws Exception { XtextResource resource = getResourceFromString( "grammar com.acme.Bar with org.eclipse.xtext.common.Terminals\n" +