Skip to content

Commit

Permalink
ScopeProvider in Java
Browse files Browse the repository at this point in the history
for easier debugging
  • Loading branch information
LorenzoBettini committed Apr 13, 2020
1 parent 643473c commit 78cf922
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
3 changes: 3 additions & 0 deletions edelta.parent/edelta/src/edelta/GenerateEdelta.mwe2
Expand Up @@ -44,6 +44,9 @@ Workflow {
generateStub = true
generateXtendStub = true
}
scopeProvider = {
generateXtendStub = false
}
projectWizard = {
generate = true
}
Expand Down
56 changes: 56 additions & 0 deletions 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);
}
}

0 comments on commit 78cf922

Please sign in to comment.