From 0acf058e39edd1fdf0bd432250768825af203551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Galland?= Date: Wed, 19 Jul 2017 13:10:26 +0200 Subject: [PATCH] [lang][ui] Extra-Language validator becomes a sub-validator of the SARL UI validator. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #703 Signed-off-by: Stéphane Galland --- .../validator/PyValidator.java | 22 ++- .../io.sarl.lang.mwe2/GenerateSARL2.mwe2 | 2 +- .../io/sarl/lang/ui/AbstractSARLUiModule.java | 4 +- .../src/io/sarl/lang/ui/SARLUiModule.java | 4 +- .../lang/ui/validation/SARLUIValidator.java | 20 ++- ...bstractExtraLanguageValidatorProvider.java | 4 +- ...onPointExtraLanguageValidatorProvider.java | 8 +- ...ava => ExtraLanguageGeneratorSupport.java} | 2 +- .../io/sarl/lang/validation/IssueCodes.java | 2 +- .../extra/AbstractExtraLanguageValidator.java | 128 +++++++++++++++++- .../extra/ExtraLanguageValidatorSupport.java | 92 +++++++++++++ .../IExtraLanguageValidatorProvider.java | 5 +- .../NullExtraLanguageValidatorProvider.java | 4 +- 13 files changed, 263 insertions(+), 34 deletions(-) rename main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/{ExtraLanguageSupportGenerator.java => ExtraLanguageGeneratorSupport.java} (98%) create mode 100644 main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/ExtraLanguageValidatorSupport.java diff --git a/contribs/io.sarl.pythongenerator/io.sarl.pythongenerator.plugin/src/io/sarl/pythongenerator/validator/PyValidator.java b/contribs/io.sarl.pythongenerator/io.sarl.pythongenerator.plugin/src/io/sarl/pythongenerator/validator/PyValidator.java index 2c3a253370..cf5877ff0c 100644 --- a/contribs/io.sarl.pythongenerator/io.sarl.pythongenerator.plugin/src/io/sarl/pythongenerator/validator/PyValidator.java +++ b/contribs/io.sarl.pythongenerator/io.sarl.pythongenerator.plugin/src/io/sarl/pythongenerator/validator/PyValidator.java @@ -36,10 +36,12 @@ import org.eclipse.xtext.validation.Check; import org.eclipse.xtext.xbase.XFeatureCall; import org.eclipse.xtext.xbase.XMemberFeatureCall; +import org.eclipse.xtext.xbase.XbasePackage; import org.eclipse.xtext.xbase.featurecalls.IdentifiableSimpleNameProvider; import org.eclipse.xtext.xbase.lib.Functions.Function2; import org.eclipse.xtext.xbase.lib.Procedures.Procedure3; import org.eclipse.xtext.xtype.XImportDeclaration; +import org.eclipse.xtext.xtype.XtypePackage; import io.sarl.lang.generator.extra.IExtraLanguageConversionInitializer; import io.sarl.lang.validation.extra.AbstractExtraLanguageValidator; @@ -59,8 +61,16 @@ public class PyValidator extends AbstractExtraLanguageValidator { /** Error handler for the type conversions. */ - private final Procedure3 typeErrorHandler = (source, invalidType, name) -> { - error(MessageFormat.format(Messages.PyValidator_0, name), source); + private final Procedure3 typeErrorHandler1 = (source, invalidType, name) -> { + error(MessageFormat.format(Messages.PyValidator_0, name), source, + XtypePackage.eINSTANCE.getXImportDeclaration_ImportedType()); + }; + + /** Error handler for the type conversions. + */ + private final Procedure3 typeErrorHandler2 = (source, invalidType, name) -> { + error(MessageFormat.format(Messages.PyValidator_0, name), source, + XbasePackage.eINSTANCE.getXAbstractFeatureCall_Feature()); }; /** Error handler for the feature conversions. @@ -77,7 +87,7 @@ public class PyValidator extends AbstractExtraLanguageValidator { // This type of JVM element is not supposed to be converted return false; } - error(message, source); + error(message, source, XbasePackage.eINSTANCE.getXAbstractFeatureCall_Feature()); return true; }; @@ -111,7 +121,7 @@ protected String getErrorMessageFormat() { @Check public void checkImportsMapping(XImportDeclaration importDeclaration) { final JvmDeclaredType type = importDeclaration.getImportedType(); - doTypeMappingCheck(importDeclaration, type, this.typeErrorHandler); + doTypeMappingCheck(importDeclaration, type, this.typeErrorHandler1); } /** Check that member feature calls have a conversion mapping. @@ -120,7 +130,7 @@ public void checkImportsMapping(XImportDeclaration importDeclaration) { */ @Check public void checkMemberFeatureCallMapping(XMemberFeatureCall featureCall) { - doCheckMemberFeatureCallMapping(featureCall, this.typeErrorHandler, this.featureErrorHandler); + doCheckMemberFeatureCallMapping(featureCall, this.typeErrorHandler2, this.featureErrorHandler); } /** Check that member feature calls have a conversion mapping. @@ -129,7 +139,7 @@ public void checkMemberFeatureCallMapping(XMemberFeatureCall featureCall) { */ @Check public void checkMemberFeatureCallMapping(XFeatureCall featureCall) { - doCheckMemberFeatureCallMapping(featureCall, this.typeErrorHandler, this.featureErrorHandler); + doCheckMemberFeatureCallMapping(featureCall, this.typeErrorHandler2, this.featureErrorHandler); } } diff --git a/main/coreplugins/io.sarl.lang.mwe2/GenerateSARL2.mwe2 b/main/coreplugins/io.sarl.lang.mwe2/GenerateSARL2.mwe2 index d73ccfab6e..b939b285ae 100644 --- a/main/coreplugins/io.sarl.lang.mwe2/GenerateSARL2.mwe2 +++ b/main/coreplugins/io.sarl.lang.mwe2/GenerateSARL2.mwe2 @@ -735,7 +735,7 @@ Workflow { } ui = { bind = "org.eclipse.xtext.generator.IGenerator" - to = "io.sarl.lang.generator.extra.ExtraLanguageSupportGenerator" + to = "io.sarl.lang.generator.extra.ExtraLanguageGeneratorSupport" } ui = { bind = "io.sarl.lang.generator.extra.IExtraLanguageGeneratorProvider" diff --git a/main/coreplugins/io.sarl.lang.ui/src-gen/io/sarl/lang/ui/AbstractSARLUiModule.java b/main/coreplugins/io.sarl.lang.ui/src-gen/io/sarl/lang/ui/AbstractSARLUiModule.java index 14dd9214df..07d8ec1790 100644 --- a/main/coreplugins/io.sarl.lang.ui/src-gen/io/sarl/lang/ui/AbstractSARLUiModule.java +++ b/main/coreplugins/io.sarl.lang.ui/src-gen/io/sarl/lang/ui/AbstractSARLUiModule.java @@ -28,7 +28,7 @@ import com.google.inject.name.Names; import io.sarl.lang.generator.IGeneratorConfigProvider2; import io.sarl.lang.generator.extra.ExtraLanguageFeatureNameConverter; -import io.sarl.lang.generator.extra.ExtraLanguageSupportGenerator; +import io.sarl.lang.generator.extra.ExtraLanguageGeneratorSupport; import io.sarl.lang.generator.extra.ExtraLanguageTypeConverter; import io.sarl.lang.generator.extra.IExtraLanguageGeneratorProvider; import io.sarl.lang.ide.contentassist.antlr.PartialSARLContentAssistParser; @@ -705,7 +705,7 @@ public Class bindIExtraLanguageGenera // contributed by io.sarl.lang.mwe2.binding.InjectionFragment2 [Bindings provided by SARL API] public Class bindIGenerator() { - return ExtraLanguageSupportGenerator.class; + return ExtraLanguageGeneratorSupport.class; } // contributed by io.sarl.lang.mwe2.binding.InjectionFragment2 [Bindings provided by SARL API] diff --git a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/SARLUiModule.java b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/SARLUiModule.java index 3007875410..9170f56c02 100644 --- a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/SARLUiModule.java +++ b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/SARLUiModule.java @@ -34,7 +34,7 @@ import org.eclipse.xtext.ui.editor.autoedit.AbstractEditStrategy; import org.eclipse.xtext.validation.IssueSeveritiesProvider; -import io.sarl.lang.generator.extra.ExtraLanguageSupportGenerator; +import io.sarl.lang.generator.extra.ExtraLanguageGeneratorSupport; import io.sarl.lang.ui.bugfixes.pending.xtexteclipse282.Issue282BuilderConfigurationBlock; import io.sarl.lang.ui.validation.UIConfigurableIssueSeveritiesProvider; import io.sarl.lang.validation.IConfigurableIssueSeveritiesProvider; @@ -102,7 +102,7 @@ public void configure(Binder binder) { binder.bind(IssueSeveritiesProvider.class).toProvider(provider); binder.bind(IConfigurableIssueSeveritiesProvider.class).toProvider(provider); // Configure the extra generator/validator provider. - binder.bind(IGenerator2.class).annotatedWith(Names.named(ExtraLanguageSupportGenerator.MAIN_GENERATOR_NAME)) + binder.bind(IGenerator2.class).annotatedWith(Names.named(ExtraLanguageGeneratorSupport.MAIN_GENERATOR_NAME)) .to(XtendGenerator.class); } diff --git a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/SARLUIValidator.java b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/SARLUIValidator.java index 7f18287ab4..73fa9251bf 100644 --- a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/SARLUIValidator.java +++ b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/SARLUIValidator.java @@ -31,10 +31,15 @@ import org.eclipse.xtend.core.xtend.XtendFile; import org.eclipse.xtend.core.xtend.XtendPackage; import org.eclipse.xtend.ide.validator.XtendUIValidator; +import org.eclipse.xtext.common.types.TypesPackage; import org.eclipse.xtext.validation.Check; +import org.eclipse.xtext.validation.ComposedChecks; import org.eclipse.xtext.validation.ValidationMessageAcceptor; +import org.eclipse.xtext.xbase.XbasePackage; +import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage; +import org.eclipse.xtext.xtype.XtypePackage; -import io.sarl.lang.sarl.SarlPackage; +import io.sarl.lang.validation.extra.ExtraLanguageValidatorSupport; /** Validator based on the Eclipse UI. * @@ -43,17 +48,18 @@ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ +@ComposedChecks(validators = {ExtraLanguageValidatorSupport.class}) public class SARLUIValidator extends XtendUIValidator { @Override protected List getEPackages() { final List packages = super.getEPackages(); - packages.add(SarlPackage.eINSTANCE); - packages.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtend")); //$NON-NLS-1$ - packages.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xbase")); //$NON-NLS-1$ - packages.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/common/JavaVMTypes")); //$NON-NLS-1$ - packages.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xtype")); //$NON-NLS-1$ - packages.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/Xtext/Xbase/XAnnotations")); //$NON-NLS-1$ + packages.add(io.sarl.lang.sarl.SarlPackage.eINSTANCE); + packages.add(XtendPackage.eINSTANCE); + packages.add(XbasePackage.eINSTANCE); + packages.add(TypesPackage.eINSTANCE); + packages.add(XtypePackage.eINSTANCE); + packages.add(XAnnotationsPackage.eINSTANCE); return packages; } diff --git a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/AbstractExtraLanguageValidatorProvider.java b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/AbstractExtraLanguageValidatorProvider.java index 58ce0dd475..5aaa99e9be 100644 --- a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/AbstractExtraLanguageValidatorProvider.java +++ b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/AbstractExtraLanguageValidatorProvider.java @@ -23,13 +23,13 @@ import java.lang.ref.SoftReference; import java.util.Collections; +import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import com.google.inject.Injector; import org.eclipse.core.resources.IProject; -import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; import io.sarl.lang.ui.generator.extra.ProjectAdapter; @@ -72,7 +72,7 @@ public abstract class AbstractExtraLanguageValidatorProvider getValidators(Resource resource) { + public List getValidators(Resource resource) { final IProject project = ProjectAdapter.getProject(resource); if (this.preferences.isGeneratorEnabled( getPluginID(), diff --git a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/ExtensionPointExtraLanguageValidatorProvider.java b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/ExtensionPointExtraLanguageValidatorProvider.java index da894d7587..d01b4b87f2 100644 --- a/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/ExtensionPointExtraLanguageValidatorProvider.java +++ b/main/coreplugins/io.sarl.lang.ui/src/io/sarl/lang/ui/validation/extra/ExtensionPointExtraLanguageValidatorProvider.java @@ -32,11 +32,11 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; -import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; import io.sarl.lang.ui.SARLUiConfig; import io.sarl.lang.ui.internal.LangActivator; +import io.sarl.lang.validation.extra.AbstractExtraLanguageValidator; import io.sarl.lang.validation.extra.IExtraLanguageValidatorProvider; /** Implementation of the provider of the extra language generators that replies no generator. @@ -57,8 +57,8 @@ public class ExtensionPointExtraLanguageValidatorProvider implements IExtraLangu private List providers; @Override - public Iterable getValidators(Resource resource) { - final List validators = new ArrayList<>(); + public List getValidators(Resource resource) { + final List validators = new ArrayList<>(); if (this.providers == null) { this.providers = new ArrayList<>(); final IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint( @@ -82,7 +82,7 @@ public Iterable getValidators(Resource resource) { } } for (final IExtraLanguageValidatorProvider provider: this.providers) { - for (final EValidator validator : provider.getValidators(resource)) { + for (final AbstractExtraLanguageValidator validator : provider.getValidators(resource)) { validators.add(validator); } } diff --git a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/ExtraLanguageSupportGenerator.java b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/ExtraLanguageGeneratorSupport.java similarity index 98% rename from main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/ExtraLanguageSupportGenerator.java rename to main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/ExtraLanguageGeneratorSupport.java index ed19300c8d..35be460008 100644 --- a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/ExtraLanguageSupportGenerator.java +++ b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/generator/extra/ExtraLanguageGeneratorSupport.java @@ -43,7 +43,7 @@ * @mavenartifactid $ArtifactId$ * @since 0.6 */ -public class ExtraLanguageSupportGenerator implements IGenerator, IGenerator2 { +public class ExtraLanguageGeneratorSupport implements IGenerator, IGenerator2 { /** Name of the injected element for the main generator. */ diff --git a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java index 52bc882586..3e15251888 100644 --- a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java +++ b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java @@ -170,7 +170,7 @@ public final class IssueCodes { ISSUE_CODE_PREFIX + "invalid_use_of_break"; //$NON-NLS-1$ /** - * Invalid extr-language generation. + * Invalid extra-language generation. * @since 0.6 */ public static final String INVALID_EXTRA_LANGUAGE_GENERATION = diff --git a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/AbstractExtraLanguageValidator.java b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/AbstractExtraLanguageValidator.java index f3b5151426..9198f31238 100644 --- a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/AbstractExtraLanguageValidator.java +++ b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/AbstractExtraLanguageValidator.java @@ -21,32 +21,49 @@ package io.sarl.lang.validation.extra; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeSet; import javax.inject.Inject; +import com.google.common.collect.Sets; import com.google.inject.Injector; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.xtend.core.xtend.XtendPackage; import org.eclipse.xtext.common.types.JvmIdentifiableElement; import org.eclipse.xtext.common.types.JvmType; +import org.eclipse.xtext.common.types.TypesPackage; +import org.eclipse.xtext.util.SimpleCache; +import org.eclipse.xtext.util.Strings; +import org.eclipse.xtext.validation.AbstractDeclarativeValidator; +import org.eclipse.xtext.validation.EValidatorRegistrar; import org.eclipse.xtext.validation.ValidationMessageAcceptor; import org.eclipse.xtext.xbase.XAbstractFeatureCall; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.XFeatureCall; import org.eclipse.xtext.xbase.XMemberFeatureCall; +import org.eclipse.xtext.xbase.XbasePackage; +import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage; import org.eclipse.xtext.xbase.lib.Functions.Function2; import org.eclipse.xtext.xbase.lib.Procedures.Procedure3; -import org.eclipse.xtext.xbase.validation.AbstractXbaseValidator; +import org.eclipse.xtext.xtype.XtypePackage; import io.sarl.lang.generator.extra.ExtraLanguageFeatureNameConverter; import io.sarl.lang.generator.extra.ExtraLanguageFeatureNameConverter.ConversionType; import io.sarl.lang.generator.extra.ExtraLanguageTypeConverter; import io.sarl.lang.generator.extra.IExtraLanguageConversionInitializer; import io.sarl.lang.generator.extra.IExtraLanguageGeneratorContext; +import io.sarl.lang.sarl.SarlPackage; import io.sarl.lang.util.Utils; import io.sarl.lang.validation.IssueCodes; @@ -58,10 +75,29 @@ * @mavenartifactid $ArtifactId$ * @since 0.6 */ -public abstract class AbstractExtraLanguageValidator extends AbstractXbaseValidator { +public abstract class AbstractExtraLanguageValidator extends AbstractDeclarativeValidator { private static final String CHECKED_FEATURE_CALLS = "io.sarl.lang.validation.extra.CheckedFeatureCalls"; //$NON-NLS-1$ + private static final Field CHECK_METHODS_FIELD; + + private static final Field METHODS_FOR_TYPE_FIELD; + + private static final Method COLLECT_METHODS_METHOD; + + static { + try { + CHECK_METHODS_FIELD = AbstractDeclarativeValidator.class.getDeclaredField("checkMethods"); //$NON-NLS-1$ + CHECK_METHODS_FIELD.setAccessible(true); + METHODS_FOR_TYPE_FIELD = AbstractDeclarativeValidator.class.getDeclaredField("methodsForType"); //$NON-NLS-1$ + METHODS_FOR_TYPE_FIELD.setAccessible(true); + COLLECT_METHODS_METHOD = AbstractDeclarativeValidator.class.getDeclaredMethod("collectMethods", Class.class); //$NON-NLS-1$ + COLLECT_METHODS_METHOD.setAccessible(true); + } catch (Exception exception) { + throw new Error(exception); + } + } + private ExtraLanguageTypeConverter typeConverter; private ExtraLanguageFeatureNameConverter featureConverter; @@ -69,6 +105,54 @@ public abstract class AbstractExtraLanguageValidator extends AbstractXbaseValida @Inject private Injector injector; + /** Replies the collected check methods. + * + * @param type the type to search for. + * @return the collected check methods. + */ + @SuppressWarnings("unchecked") + List getMethodsForType(Class type) { + try { + ensureMethodWrappers(); + final SimpleCache, List> cache = + (SimpleCache, List>) METHODS_FOR_TYPE_FIELD.get(this); + return cache.get(type); + } catch (Exception exception) { + throw new Error(exception); + } + } + + @SuppressWarnings("unchecked") + private void ensureMethodWrappers() throws Exception { + Set set = (Set) CHECK_METHODS_FIELD.get(this); + if (set == null) { + synchronized (this) { + if (CHECK_METHODS_FIELD.get(this) == null) { + set = Sets.newLinkedHashSet(); + set.addAll((List) COLLECT_METHODS_METHOD.invoke(this, getClass())); + CHECK_METHODS_FIELD.set(this, set); + } + } + } + } + + @Override + public void register(EValidatorRegistrar registrar) { + // + } + + @Override + protected List getEPackages() { + final List result = new ArrayList<>(super.getEPackages()); + result.add(SarlPackage.eINSTANCE); + result.add(XtendPackage.eINSTANCE); + result.add(XbasePackage.eINSTANCE); + result.add(TypesPackage.eINSTANCE); + result.add(XtypePackage.eINSTANCE); + result.add(XAnnotationsPackage.eINSTANCE); + return result; + } + @Override public void setInjector(Injector injector) { super.setInjector(injector); @@ -84,12 +168,48 @@ public void setInjector(Injector injector) { * @param source the source of the error. */ protected void error(String message, EObject source) { - error(MessageFormat.format(getErrorMessageFormat(), message), source, + error(message, source, null, ValidationMessageAcceptor.INSIGNIFICANT_INDEX, IssueCodes.INVALID_EXTRA_LANGUAGE_GENERATION); } + @Override + protected void error(String message, EObject source, EStructuralFeature feature, String code, String... issueData) { + super.error(MessageFormat.format(getErrorMessageFormat(), message), source, feature, + Strings.isEmpty(code) ? IssueCodes.INVALID_EXTRA_LANGUAGE_GENERATION : code, issueData); + } + + @Override + protected void error(String message, EObject source, EStructuralFeature feature, int index, String code, + String... issueData) { + super.error(MessageFormat.format(getErrorMessageFormat(), message), source, feature, index, + Strings.isEmpty(code) ? IssueCodes.INVALID_EXTRA_LANGUAGE_GENERATION : code, issueData); + } + + @Override + protected void info(String message, EObject source, EStructuralFeature feature, int index, String code, + String... issueData) { + super.info(MessageFormat.format(getErrorMessageFormat(), message), source, feature, index, code, issueData); + } + + @Override + protected void info(String message, EObject source, EStructuralFeature feature, String code, String... issueData) { + super.info(MessageFormat.format(getErrorMessageFormat(), message), source, feature, code, issueData); + } + + @Override + protected void warning(String message, EObject source, EStructuralFeature feature, int index, String code, + String... issueData) { + super.warning(MessageFormat.format(getErrorMessageFormat(), message), source, feature, index, code, issueData); + } + + @Override + protected void warning(String message, EObject source, EStructuralFeature feature, String code, + String... issueData) { + super.warning(MessageFormat.format(getErrorMessageFormat(), message), source, feature, code, issueData); + } + /** Replies the message format to be used for building an alert message. * *

The replied format must be compatible with {@link MessageFormat#format(Object)} with the @@ -257,7 +377,7 @@ private static XAbstractFeatureCall getRootFeatureCall(XAbstractFeatureCall feat final XAbstractFeatureCall rootFeatureCall; if (container instanceof XMemberFeatureCall || container instanceof XFeatureCall) { rootFeatureCall = (XAbstractFeatureCall) Utils.getFirstContainerForPredicate(featureCall, - (it) -> it.eContainer() != null && !(it.eContainer() instanceof XMemberFeatureCall || it.eContainer() instanceof XFeatureCall)); + (it) -> it.eContainer() != null && !(it.eContainer() instanceof XMemberFeatureCall || it.eContainer() instanceof XFeatureCall)); } else { rootFeatureCall = featureCall; } diff --git a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/ExtraLanguageValidatorSupport.java b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/ExtraLanguageValidatorSupport.java new file mode 100644 index 0000000000..a44ba2dc3e --- /dev/null +++ b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/ExtraLanguageValidatorSupport.java @@ -0,0 +1,92 @@ +/* + * $Id$ + * + * SARL is an general-purpose agent programming language. + * More details on http://www.sarl.io + * + * Copyright (C) 2014-2017 the original authors or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.sarl.lang.validation.extra; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.xtend.core.xtend.XtendPackage; +import org.eclipse.xtext.common.types.TypesPackage; +import org.eclipse.xtext.validation.AbstractDeclarativeValidator; +import org.eclipse.xtext.validation.Check; +import org.eclipse.xtext.validation.CheckType; +import org.eclipse.xtext.validation.EValidatorRegistrar; +import org.eclipse.xtext.validation.ValidationMessageAcceptor; +import org.eclipse.xtext.xbase.XbasePackage; +import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage; +import org.eclipse.xtext.xtype.XtypePackage; + +/** The validator from SARL to the extra target languages. + * + * @author $Author: sgalland$ + * @version $FullVersion$ + * @mavengroupid $GroupId$ + * @mavenartifactid $ArtifactId$ + * @since 0.6 + */ +public class ExtraLanguageValidatorSupport extends AbstractDeclarativeValidator { + + @Inject + private IExtraLanguageValidatorProvider validatorProvider; + + @Override + protected List getEPackages() { + final List result = new ArrayList<>(super.getEPackages()); + result.add(io.sarl.lang.sarl.SarlPackage.eINSTANCE); + result.add(XtendPackage.eINSTANCE); + result.add(XbasePackage.eINSTANCE); + result.add(TypesPackage.eINSTANCE); + result.add(XtypePackage.eINSTANCE); + result.add(XAnnotationsPackage.eINSTANCE); + return result; + } + + @Override + public void register(EValidatorRegistrar registrar) { + // + } + + /** Check the rules for the activated extra languages. + * + * @param currentObject the current object to test. + */ + @Check(CheckType.NORMAL) + public void checkExtraLanguageRules(EObject currentObject) { + final List validators = this.validatorProvider.getValidators( + currentObject.eResource()); + if (!validators.isEmpty()) { + final ValidationMessageAcceptor acceptor = getMessageAcceptor(); + final StateAccess stateAccess = setMessageAcceptor(acceptor); + for (final AbstractExtraLanguageValidator validator : validators) { + validator.setMessageAcceptor(acceptor); + for (final MethodWrapper wrapper : validator.getMethodsForType(currentObject.getClass())) { + wrapper.invoke(stateAccess.getState()); + } + } + } + } + +} diff --git a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/IExtraLanguageValidatorProvider.java b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/IExtraLanguageValidatorProvider.java index c1e5c59543..0487616ed4 100644 --- a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/IExtraLanguageValidatorProvider.java +++ b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/IExtraLanguageValidatorProvider.java @@ -21,8 +21,9 @@ package io.sarl.lang.validation.extra; +import java.util.List; + import com.google.inject.ImplementedBy; -import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; /** Provider of the extra language validators. @@ -43,6 +44,6 @@ public interface IExtraLanguageValidatorProvider { * @param resource the resource for which the validators should be retreived. * @return the list of the generators. */ - Iterable getValidators(Resource resource); + List getValidators(Resource resource); } diff --git a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/NullExtraLanguageValidatorProvider.java b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/NullExtraLanguageValidatorProvider.java index d0a13634ff..9083c27f4b 100644 --- a/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/NullExtraLanguageValidatorProvider.java +++ b/main/coreplugins/io.sarl.lang/src/io/sarl/lang/validation/extra/NullExtraLanguageValidatorProvider.java @@ -22,8 +22,8 @@ package io.sarl.lang.validation.extra; import java.util.Collections; +import java.util.List; -import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; /** Implementation of the provider of the extra language validators that replies no generator. @@ -37,7 +37,7 @@ public class NullExtraLanguageValidatorProvider implements IExtraLanguageValidatorProvider { @Override - public Iterable getValidators(Resource resource) { + public List getValidators(Resource resource) { return Collections.emptyList(); }