Merge "Fixes bug 453524: - created a preference page and a project properties page to manage problem markers in the Xtext grammar editor - added a warning for bidirectional references - moved issue identifier strings from XtextValidator to XtextConfigurableIssueCodes - using addIssue(..) instead of error(..) / warning(..) in order to respect the user preferences - added ConfigurableIssueCodesPreferenceStoreInitializer to DefaultUiModule - fixed a problem in OptionsConfigurationBlock.hasProjectSpecificOptions(IProject)"

This commit is contained in:
Sven Efftinge 2014-12-03 05:36:58 -05:00 committed by Gerrit Code Review @ Eclipse.org
commit 063aa839e6
5 changed files with 167 additions and 58 deletions

View file

@ -55,7 +55,7 @@ Export-Package: org.eclipse.xtext,
org.eclipse.xtext.parser.packrat.tokens;x-internal:=true,
org.eclipse.xtext.parsetree.reconstr,
org.eclipse.xtext.parsetree.reconstr.impl,
org.eclipse.xtext.preferences;x-friends:="org.eclipse.xtext.xbase.ui,org.eclipse.xtend.ide",
org.eclipse.xtext.preferences;x-friends:="org.eclipse.xtext.xbase.ui,org.eclipse.xtend.ide,org.eclipse.xtext.xtext.ui",
org.eclipse.xtext.resource,
org.eclipse.xtext.resource.clustering;x-internal:=true,
org.eclipse.xtext.resource.containers,

View file

@ -27,8 +27,10 @@ import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.scoping.IGlobalScopeProvider;
import org.eclipse.xtext.scoping.IScopeProvider;
import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
import org.eclipse.xtext.validation.ConfigurableIssueCodesProvider;
import org.eclipse.xtext.validation.IDiagnosticConverter;
import org.eclipse.xtext.xtext.GrammarResource;
import org.eclipse.xtext.xtext.XtextConfigurableIssueCodes;
import org.eclipse.xtext.xtext.XtextCrossReferenceSerializer;
import org.eclipse.xtext.xtext.XtextDiagnosticConverter;
import org.eclipse.xtext.xtext.XtextFormatter;
@ -155,4 +157,11 @@ public class XtextRuntimeModule extends AbstractXtextRuntimeModule {
public Class<? extends IResourceDescription.Manager> bindIResourceDescriptionManager() {
return DerivedStateAwareResourceDescriptionManager.class;
}
/**
* @since 2.8
*/
public Class<? extends ConfigurableIssueCodesProvider> bindConfigurableIssueCodesProvider() {
return XtextConfigurableIssueCodes.class;
}
}

View file

@ -0,0 +1,82 @@
/*******************************************************************************
* Copyright (c) 2014 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.xtext.xtext;
import java.util.Map;
import org.eclipse.xtext.preferences.PreferenceKey;
import org.eclipse.xtext.util.IAcceptor;
import org.eclipse.xtext.validation.ConfigurableIssueCodesProvider;
import org.eclipse.xtext.validation.SeverityConverter;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.inject.Singleton;
/**
* This class holds all the configurable issue codes for the Xtext grammar language.
* Use {@link #getConfigurableIssueCodes()} to get all registered codes.
*
* @author Miro Spoenemann - Initial contribution and API
*/
@Singleton
public class XtextConfigurableIssueCodes extends ConfigurableIssueCodesProvider {
protected static final String ISSUE_CODE_PREFIX = "org.eclipse.xtext.grammar.";
public static final String INVALID_METAMODEL_NAME = ISSUE_CODE_PREFIX + "InvalidMetaModelName";
public static final String INVALID_ACTION_USAGE = ISSUE_CODE_PREFIX + "InvalidActionUsage";
public static final String EMPTY_ENUM_LITERAL = ISSUE_CODE_PREFIX + "EmptyEnumLiteral";
public static final String EMPTY_KEYWORD = ISSUE_CODE_PREFIX + "EmptyKeyword";
public static final String INVALID_HIDDEN_TOKEN = ISSUE_CODE_PREFIX + "InvalidHiddenToken";
public static final String INVALID_HIDDEN_TOKEN_FRAGMENT = ISSUE_CODE_PREFIX + "InvalidHiddenTokenFragment";
public static final String INVALID_PACKAGE_REFERENCE_INHERITED = ISSUE_CODE_PREFIX + "InvalidPackageReference.inherited";
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 DUPLICATE_ENUM_LITERAL = ISSUE_CODE_PREFIX + "DuplicateEnumLiteral";
public static final String BIDIRECTIONAL_REFERENCE = ISSUE_CODE_PREFIX + "BidirectionalReference";
private Map<String, PreferenceKey> issueCodes;
public XtextConfigurableIssueCodes() {
final Map<String, PreferenceKey> map = Maps.newLinkedHashMap();
initialize(new IAcceptor<PreferenceKey>() {
public void accept(PreferenceKey prefKey) {
map.put(prefKey.getId(), prefKey);
}
});
this.issueCodes = ImmutableMap.copyOf(map);
}
protected void initialize(IAcceptor<PreferenceKey> acceptor) {
acceptor.accept(create(INVALID_ACTION_USAGE, SeverityConverter.SEVERITY_ERROR));
acceptor.accept(create(EMPTY_ENUM_LITERAL, SeverityConverter.SEVERITY_ERROR));
acceptor.accept(create(EMPTY_KEYWORD, SeverityConverter.SEVERITY_ERROR));
acceptor.accept(create(INVALID_HIDDEN_TOKEN, SeverityConverter.SEVERITY_ERROR));
acceptor.accept(create(INVALID_HIDDEN_TOKEN_FRAGMENT, SeverityConverter.SEVERITY_ERROR));
acceptor.accept(create(INVALID_PACKAGE_REFERENCE_INHERITED, SeverityConverter.SEVERITY_ERROR));
acceptor.accept(create(INVALID_METAMODEL_NAME, SeverityConverter.SEVERITY_WARNING));
acceptor.accept(create(INVALID_PACKAGE_REFERENCE_EXTERNAL, SeverityConverter.SEVERITY_WARNING));
acceptor.accept(create(INVALID_PACKAGE_REFERENCE_NOT_ON_CLASSPATH, SeverityConverter.SEVERITY_WARNING));
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));
}
protected final PreferenceKey create(String id, String defaultValue) {
return new PreferenceKey(id, defaultValue);
}
@Override
public final Map<String, PreferenceKey> getConfigurableIssueCodes() {
return issueCodes;
}
}

View file

@ -7,6 +7,8 @@
*******************************************************************************/
package org.eclipse.xtext.xtext;
import static org.eclipse.xtext.xtext.XtextConfigurableIssueCodes.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -60,6 +62,7 @@ import org.eclipse.xtext.UnorderedGroup;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.conversion.ValueConverterException;
import org.eclipse.xtext.diagnostics.Severity;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
@ -94,17 +97,6 @@ import com.google.inject.Inject;
*/
public class XtextValidator extends AbstractDeclarativeValidator {
public static final String INVALID_METAMODEL_NAME = "org.eclipse.xtext.grammar.InvalidMetaModelName";
public static final String INVALID_ACTION_USAGE = "org.eclipse.xtext.grammar.InvalidActionUsage";
public static final String EMPTY_ENUM_LITERAL= "org.eclipse.xtext.grammar.EmptyEnumLiteral";
public static final String EMPTY_KEYWORD= "org.eclipse.xtext.grammar.EmptyKeyword";
public static final String INVALID_HIDDEN_TOKEN = "org.eclipse.xtext.grammar.InvalidHiddenToken";
public static final String INVALID_HIDDEN_TOKEN_FRAGMENT = "org.eclipse.xtext.grammar.InvalidHiddenTokenFragment";
public static final String INVALID_PACKAGE_REFERENCE_INHERITED = "org.eclipse.xtext.grammar.InvalidPackageReference.inherited";
public static final String INVALID_PACKAGE_REFERENCE_EXTERNAL = "org.eclipse.xtext.grammar.InvalidPackageReference.external";
public static final String INVALID_PACKAGE_REFERENCE_NOT_ON_CLASSPATH = "org.eclipse.xtext.grammar.InvalidPackageReference.notOnClasspath";
public static final String INVALID_TERMINALRULE_NAME = "org.eclipse.xtext.grammar.InvalidTerminalRuleName";
@Inject
private IValueConverterService valueConverter;
@ -212,10 +204,9 @@ public class XtextValidator extends AbstractDeclarativeValidator {
public void checkGeneratedMetamodel(GeneratedMetamodel metamodel) {
if (metamodel.getName() != null && metamodel.getName().length() != 0)
if (Character.isUpperCase(metamodel.getName().charAt(0)))
warning(
"Metamodel names should start with a lower case letter.",
addIssue("Metamodel names should start with a lower case letter.",
metamodel,
XtextPackage.Literals.GENERATED_METAMODEL__NAME,
ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
INVALID_METAMODEL_NAME,
metamodel.getName());
}
@ -416,8 +407,8 @@ public class XtextValidator extends AbstractDeclarativeValidator {
EPackage generatedPackage = generatedMetamodel.getEPackage();
if (generatedPackage != null && nsURI.equals((generatedPackage.getNsURI()))) {
if (!text.equals(nsURI)) {
error(
"Metamodels that have been generated by a super grammar must be referenced by nsURI: " + nsURI,
addIssue("Metamodels that have been generated by a super grammar must be referenced by nsURI: " + nsURI,
metamodel,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_INHERITED,
nsURI);
@ -434,8 +425,8 @@ public class XtextValidator extends AbstractDeclarativeValidator {
if (referencedPackage.eIsProxy() || isRuntime(metamodelReference))
return;
if (isRegisteredPackage(referencedPackage)) {
warning(
"The imported package is not on the classpath of this project which may lead to follow up errors.",
addIssue("The imported package is not on the classpath of this project which may lead to follow-up errors.",
metamodelReference,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_NOT_ON_CLASSPATH,
importURI);
@ -448,14 +439,14 @@ public class XtextValidator extends AbstractDeclarativeValidator {
QualifiedName.create(referencedPackage.getNsURI()),
false);
if (!Iterables.isEmpty(packagesInIndex)) {
warning(
"Packages should be imported by their namespace URI.",
addIssue("Packages should be imported by their namespace URI.",
metamodelReference,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_EXTERNAL,
referencedPackage.getNsURI());
} else if (!ClasspathUriUtil.isClasspathUri(URI.createURI(importURI))) {
warning(
"The imported package is not on the classpath of this project which may lead to follow up errors.",
addIssue("The imported package is not on the classpath of this project which may lead to follow-up errors.",
metamodelReference,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_NOT_ON_CLASSPATH,
importURI);
@ -479,20 +470,20 @@ public class XtextValidator extends AbstractDeclarativeValidator {
Iterable<IEObjectDescription> packagesInIndex = descriptions.getExportedObjects(EcorePackage.Literals.EPACKAGE, QualifiedName.create(importURI), false);
if (!Iterables.isEmpty(packagesInIndex)) {
if (setting.getEObject().eResource().getURI().isPlatformResource())
warning(
"The imported package refers to elements the package registry instead of using the instances from the workspace",
addIssue("The imported package refers to elements in the package registry instead of using the instances from the workspace",
metamodelReference,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_EXTERNAL,
referencedPackage.getNsURI());
else
warning(
"The imported package refers to elements the package registry instead of using the instances from the workspace",
addIssue("The imported package refers to elements in the package registry instead of using the instances from the workspace",
metamodelReference,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_EXTERNAL);
return;
} else {
warning(
"The imported package refers to elements that are not on the classpath of this project. The package '" + transitive.getNsURI() + "' was loaded from the registry.",
addIssue("The imported package refers to elements that are not on the classpath of this project. The package '" + transitive.getNsURI() + "' was loaded from the registry.",
metamodelReference,
XtextPackage.Literals.ABSTRACT_METAMODEL_DECLARATION__EPACKAGE,
INVALID_PACKAGE_REFERENCE_NOT_ON_CLASSPATH,
referencedPackage.getNsURI());
@ -948,9 +939,11 @@ public class XtextValidator extends AbstractDeclarativeValidator {
}
if (otherDecl.getEnumLiteral() == decl.getEnumLiteral()) {
if (!decl.getEnumLiteral().getLiteral().equals(decl.getLiteral().getValue()))
warning("Enum literal '" + decl.getEnumLiteral().getName()
addIssue("Enum literal '" + decl.getEnumLiteral().getName()
+ "' has already been defined with literal '" + decl.getEnumLiteral().getLiteral() + "'.",
XtextPackage.Literals.ENUM_LITERAL_DECLARATION__ENUM_LITERAL);
decl,
XtextPackage.Literals.ENUM_LITERAL_DECLARATION__ENUM_LITERAL,
DUPLICATE_ENUM_LITERAL);
return;
}
}
@ -959,10 +952,9 @@ public class XtextValidator extends AbstractDeclarativeValidator {
@Check
public void checkEnumLiteralIsValid(EnumLiteralDeclaration decl) {
if ("".equals(decl.getLiteral().getValue()))
error(
"Enum literal must not be an empty string.",
addIssue("Enum literal must not be an empty string.",
decl,
XtextPackage.Literals.ENUM_LITERAL_DECLARATION__LITERAL,
ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
EMPTY_ENUM_LITERAL,
decl.getEnumLiteral().getName());
}
@ -988,12 +980,10 @@ public class XtextValidator extends AbstractDeclarativeValidator {
@Check
public void checkKeywordNotEmpty(final Keyword keyword) {
if (keyword.getValue().length()==0 && !(keyword.eContainer() instanceof EnumLiteralDeclaration)) {
error(
"A keyword cannot be empty.",
addIssue("A keyword cannot be empty.",
keyword,
null,
ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
XtextValidator.EMPTY_KEYWORD);
EMPTY_KEYWORD);
}
}
@ -1013,11 +1003,9 @@ public class XtextValidator extends AbstractDeclarativeValidator {
@Check
public void checkActionInUnorderedGroup(final Action action) {
if (EcoreUtil2.getContainerOfType(action, UnorderedGroup.class) != null)
error(
"Actions may not be used in unordered groups.",
addIssue("Actions may not be used in unordered groups.",
action,
null,
ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
INVALID_ACTION_USAGE);
}
@ -1083,16 +1071,14 @@ public class XtextValidator extends AbstractDeclarativeValidator {
AbstractRule hiddenToken = hiddenTokens.get(i);
if (hiddenToken instanceof TerminalRule) {
if (((TerminalRule) hiddenToken).isFragment())
error(
"Cannot use terminal fragments as hidden tokens.",
addIssue("Cannot use terminal fragments as hidden tokens.",
owner,
reference,
i,
INVALID_HIDDEN_TOKEN_FRAGMENT,
String.valueOf(i));
} else {
error(
"Only terminal rules may be used as hidden tokens.",
addIssue("Only terminal rules may be used as hidden tokens.",
owner,
reference,
i,
@ -1111,7 +1097,29 @@ public class XtextValidator extends AbstractDeclarativeValidator {
@Check
public void checkTerminalRuleNamingConventions(TerminalRule terminalRule){
if(!terminalRule.getName().equals(terminalRule.getName().toUpperCase()))
warning("TerminalRule must be written in uppercase.", terminalRule, XtextPackage.eINSTANCE.getAbstractRule_Name(),INVALID_TERMINALRULE_NAME, terminalRule.getName());
addIssue("TerminalRule must be written in uppercase.", terminalRule, XtextPackage.eINSTANCE.getAbstractRule_Name(),
INVALID_TERMINALRULE_NAME, terminalRule.getName());
}
@Check
public void checkOppositeReferenceUsed(Assignment assignment) {
Severity severity = getIssueSeverities(getContext(), getCurrentObject()).getSeverity(BIDIRECTIONAL_REFERENCE);
if (severity == null || severity == Severity.IGNORE) {
// Don't perform any check if the result is ignored
return;
}
EClassifier classifier = GrammarUtil.findCurrentType(assignment);
if (classifier instanceof EClass) {
EStructuralFeature feature = ((EClass) classifier).getEStructuralFeature(assignment.getFeature());
if (feature instanceof EReference) {
EReference reference = (EReference) feature;
if (reference.getEOpposite() != null && !(reference.isContainment() || reference.isContainer())) {
addIssue("The feature '" + assignment.getFeature() + "' is a bidirectional reference."
+ " This may cause problems in the linking process.",
assignment, XtextPackage.eINSTANCE.getAssignment_Feature(), BIDIRECTIONAL_REFERENCE);
}
}
}
}
}

View file

@ -7,6 +7,8 @@
*******************************************************************************/
package org.eclipse.xtext.xtext;
import static com.google.common.collect.Maps.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@ -43,8 +45,10 @@ import org.eclipse.xtext.XtextFactory;
import org.eclipse.xtext.XtextStandaloneSetup;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.util.StringInputStream;
import org.eclipse.xtext.validation.AbstractDeclarativeValidator.State;
import org.eclipse.xtext.validation.AbstractValidationMessageAcceptingTestCase;
import org.eclipse.xtext.validation.AbstractValidationMessageAcceptor;
import org.eclipse.xtext.validation.ValidationMessageAcceptor;
import org.junit.Ignore;
import org.junit.Test;
@ -67,6 +71,12 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
EValidator.Registry.INSTANCE.put(EcorePackage.eINSTANCE, EcoreValidator.INSTANCE);
}
private void configureValidator(XtextValidator validator, ValidationMessageAcceptor messageAcceptor, EObject currentObject) {
State state = validator.setMessageAcceptor(messageAcceptor).getState();
state.currentObject = currentObject;
state.context = newHashMap();
}
/**
* see https://bugs.eclipse.org/bugs/show_bug.cgi?id=348052
*/
@ -243,7 +253,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
child.getRules().add(subRuleFoo);
XtextValidator validator = get(XtextValidator.class);
validator.setMessageAcceptor(this).getState().currentObject = subRuleFoo;
configureValidator(validator, this, subRuleFoo);
validator.checkRuleName(subRuleFoo);
assertEquals("A rule's name has to be unique even case insensitive. A used grammar contains another rule 'Foo'.", lastMessage);
}
@ -258,7 +268,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
base.getRules().add(subRuleFoo);
XtextValidator validator = get(XtextValidator.class);
validator.setMessageAcceptor(this).getState().currentObject = subRuleFoo;
configureValidator(validator, this, subRuleFoo);
validator.checkRuleName(subRuleFoo);
assertEquals("A rule's name has to be unique even case insensitive. This grammar contains another rule 'Foo'.", lastMessage);
}
@ -273,7 +283,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
base.getRules().add(subRuleFoo);
XtextValidator validator = get(XtextValidator.class);
validator.setMessageAcceptor(this).getState().currentObject = subRuleFoo;
configureValidator(validator, this, subRuleFoo);
validator.checkRuleName(subRuleFoo);
assertEquals("A rule's name has to be unique.", lastMessage);
}
@ -294,7 +304,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
base.getRules().add(subRuleFoo3);
XtextValidator validator = get(XtextValidator.class);
validator.setMessageAcceptor(this).getState().currentObject = subRuleFoo;
configureValidator(validator, this, subRuleFoo);
validator.checkRuleName(subRuleFoo);
assertEquals("A rule's name has to be unique even case insensitive. The conflicting rules are 'FOO' and 'Foo'.", lastMessage);
}
@ -315,7 +325,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
base.getRules().add(subRuleFoo3);
XtextValidator validator = get(XtextValidator.class);
validator.setMessageAcceptor(this).getState().currentObject = subRuleFoo;
configureValidator(validator, this, subRuleFoo);
validator.checkRuleName(subRuleFoo);
assertEquals("A rule's name has to be unique even case insensitive. The conflicting rules are 'FOO', 'Foo' and 'fOO'.", lastMessage);
}
@ -914,7 +924,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
Action action = XtextFactory.eINSTANCE.createAction();
unorderedGroup.getElements().add(action);
ValidatingMessageAcceptor messageAcceptor = new ValidatingMessageAcceptor(action, true, false);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, action);
validator.checkActionInUnorderedGroup(action);
messageAcceptor.validate();
}
@ -1189,7 +1199,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
Grammar grammar = (Grammar) getModel(grammarAsText);
XtextValidator validator = get(XtextValidator.class);
ValidatingMessageAcceptor messageAcceptor = new ValidatingMessageAcceptor(grammar, true, false);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, grammar);
validator.checkHiddenTokenIsNotAFragment(grammar);
messageAcceptor.validate();
}
@ -1205,7 +1215,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
ParserRule rule = (ParserRule) grammar.getRules().get(0);
XtextValidator validator = get(XtextValidator.class);
ValidatingMessageAcceptor messageAcceptor = new ValidatingMessageAcceptor(rule, true, false);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, rule);
validator.checkHiddenTokenIsNotAFragment(rule);
messageAcceptor.validate();
}
@ -1220,7 +1230,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
Grammar grammar = (Grammar) getModel(grammarAsText);
XtextValidator validator = get(XtextValidator.class);
ValidatingMessageAcceptor messageAcceptor = new ValidatingMessageAcceptor(grammar, true, false);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, grammar);
validator.checkHiddenTokenIsNotAFragment(grammar);
messageAcceptor.validate();
}
@ -1236,7 +1246,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
ParserRule rule = (ParserRule) grammar.getRules().get(0);
XtextValidator validator = get(XtextValidator.class);
ValidatingMessageAcceptor messageAcceptor = new ValidatingMessageAcceptor(rule, true, false);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, rule);
validator.checkHiddenTokenIsNotAFragment(rule);
messageAcceptor.validate();
}
@ -1485,7 +1495,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
TerminalRule rule = (TerminalRule) grammar.getRules().get(1);
XtextValidator validator = get(XtextValidator.class);
ValidatingMessageAcceptor messageAcceptor = new ValidatingMessageAcceptor(rule, false, true);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, rule);
validator.checkTerminalRuleNamingConventions(rule);
messageAcceptor.validate();
}
@ -1547,7 +1557,7 @@ public class XtextValidationTest extends AbstractValidationMessageAcceptingTestC
messageAcceptor.expectedContext(
valueAssignment.getTerminal()
);
validator.setMessageAcceptor(messageAcceptor);
configureValidator(validator, messageAcceptor, valueAssignment);
validator.checkKeywordNotEmpty((Keyword) valueAssignment.getTerminal());
messageAcceptor.validate();
}