mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 08:48:55 +00:00
[263773] Validate rule names and discourage ‘super’ as a name for rules
This commit is contained in:
parent
800c35080a
commit
98ee036c02
4 changed files with 26 additions and 1 deletions
|
@ -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}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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" +
|
||||
|
|
Loading…
Reference in a new issue