From 78cf92205ad6ec9882a10e08f98d172a5c485977 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Mon, 13 Apr 2020 10:22:36 +0200 Subject: [PATCH] ScopeProvider in Java for easier debugging --- .../scoping => old}/EdeltaScopeProvider.xtend | 0 .../edelta/src/edelta/GenerateEdelta.mwe2 | 3 + .../edelta/scoping/EdeltaScopeProvider.java | 56 +++++++++++++++++++ 3 files changed, 59 insertions(+) rename edelta.parent/edelta/{src/edelta/scoping => old}/EdeltaScopeProvider.xtend (100%) create mode 100644 edelta.parent/edelta/src/edelta/scoping/EdeltaScopeProvider.java diff --git a/edelta.parent/edelta/src/edelta/scoping/EdeltaScopeProvider.xtend b/edelta.parent/edelta/old/EdeltaScopeProvider.xtend similarity index 100% rename from edelta.parent/edelta/src/edelta/scoping/EdeltaScopeProvider.xtend rename to edelta.parent/edelta/old/EdeltaScopeProvider.xtend diff --git a/edelta.parent/edelta/src/edelta/GenerateEdelta.mwe2 b/edelta.parent/edelta/src/edelta/GenerateEdelta.mwe2 index 3cfa1ed85..0f1bdfed1 100644 --- a/edelta.parent/edelta/src/edelta/GenerateEdelta.mwe2 +++ b/edelta.parent/edelta/src/edelta/GenerateEdelta.mwe2 @@ -44,6 +44,9 @@ Workflow { generateStub = true generateXtendStub = true } + scopeProvider = { + generateXtendStub = false + } projectWizard = { generate = true } diff --git a/edelta.parent/edelta/src/edelta/scoping/EdeltaScopeProvider.java b/edelta.parent/edelta/src/edelta/scoping/EdeltaScopeProvider.java new file mode 100644 index 000000000..eb4fdee7b --- /dev/null +++ b/edelta.parent/edelta/src/edelta/scoping/EdeltaScopeProvider.java @@ -0,0 +1,56 @@ +/* + * generated by Xtext 2.21.0 + */ +package edelta.scoping; + +import static edelta.edelta.EdeltaPackage.Literals.*; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.xtext.scoping.IScope; +import org.eclipse.xtext.scoping.Scopes; +import org.eclipse.xtext.scoping.impl.FilteringScope; +import org.eclipse.xtext.util.IResourceScopeCache; + +import com.google.inject.Inject; + +import edelta.edelta.EdeltaEcoreQualifiedReference; +import edelta.util.EdeltaEcoreHelper; +import edelta.util.EdeltaModelUtil; + +/** + * This class contains custom scoping description. + * + * See + * https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping + * on how and when to use it. + */ +public class EdeltaScopeProvider extends AbstractEdeltaScopeProvider { + @Inject + private IResourceScopeCache cache; + + @Inject + private EdeltaModelUtil edeltaModelUtil; + + @Inject + private EdeltaEcoreHelper edeltaEcoreHelper; + + @Override + public IScope getScope(final EObject context, final EReference reference) { + if (reference == EDELTA_ECORE_REFERENCE__ENAMEDELEMENT) { + if (context instanceof EdeltaEcoreQualifiedReference) { + return Scopes.scopeFor(edeltaEcoreHelper.getENamedElements( + ((EdeltaEcoreQualifiedReference) context).getQualification().getEnamedelement(), + context)); + } + return Scopes.scopeFor(edeltaEcoreHelper.getProgramENamedElements(context)); + } else if (reference == EDELTA_MODIFY_ECORE_OPERATION__EPACKAGE) { + return Scopes.scopeFor(edeltaModelUtil.getProgram(context).getMetamodels()); + } else if (reference == EDELTA_PROGRAM__METAMODELS) { + return cache.get("scopeMetamodels", context.eResource(), + () -> new FilteringScope(delegateGetScope(context, reference), + it -> "false".equals(it.getUserData("nsURI")))); + } + return super.getScope(context, reference); + } +}