[263773] Validate rule names and discourage ‘super’ as a name for rules

This commit is contained in:
Sebastian Zarnekow 2015-08-13 14:21:27 +02:00
parent 800c35080a
commit 98ee036c02
4 changed files with 26 additions and 1 deletions

View file

@ -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}

View file

@ -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) {

View file

@ -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<String, AbstractRule> getAllRules(Grammar grammar, String name) {

View file

@ -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<Issue> 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" +