From ad152a1fcf12d578ee8cbe36f2b4cac9de64e0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Spo=CC=88nemann?= Date: Mon, 1 Dec 2014 16:33:28 +0100 Subject: [PATCH] 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) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I78c4681dfd2c0e9ad937662ed71d8c968463614b Signed-off-by: Miro Spönemann --- .../org.eclipse.xtext/META-INF/MANIFEST.MF | 2 +- .../org/eclipse/xtext/XtextRuntimeModule.java | 9 ++ .../xtext/XtextConfigurableIssueCodes.java | 82 ++++++++++++++++ .../eclipse/xtext/xtext/XtextValidator.java | 98 ++++++++++--------- .../xtext/xtext/XtextValidationTest.java | 34 ++++--- 5 files changed, 167 insertions(+), 58 deletions(-) create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextConfigurableIssueCodes.java diff --git a/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF b/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF index 8135b4d9f..642d78411 100644 --- a/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF @@ -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, diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/XtextRuntimeModule.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/XtextRuntimeModule.java index 90a1831cf..d37a8cef7 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/XtextRuntimeModule.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/XtextRuntimeModule.java @@ -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 bindIResourceDescriptionManager() { return DerivedStateAwareResourceDescriptionManager.class; } + + /** + * @since 2.8 + */ + public Class bindConfigurableIssueCodesProvider() { + return XtextConfigurableIssueCodes.class; + } } 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 new file mode 100644 index 000000000..bd82b00a3 --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/XtextConfigurableIssueCodes.java @@ -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 issueCodes; + + public XtextConfigurableIssueCodes() { + final Map map = Maps.newLinkedHashMap(); + initialize(new IAcceptor() { + public void accept(PreferenceKey prefKey) { + map.put(prefKey.getId(), prefKey); + } + }); + this.issueCodes = ImmutableMap.copyOf(map); + } + + protected void initialize(IAcceptor 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 getConfigurableIssueCodes() { + return issueCodes; + } + +} 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 00989d4ab..eedc1e5c8 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 @@ -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 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); + } + } + } } } 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 041aed8cd..fe5c7e43f 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 @@ -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(); }