package org.xtest.scoping; import static java.util.Collections.singletonList; import java.util.Collections; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtend.core.scoping.XtendImportedNamespaceScopeProvider; import org.eclipse.xtend.core.xtend.XtendImport; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.ISelectable; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.impl.FilteringScope; import org.eclipse.xtext.scoping.impl.ImportNormalizer; import org.eclipse.xtext.scoping.impl.ScopeBasedSelectable; import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations; import org.eclipse.xtext.xbase.scoping.XbaseImportedNamespaceScopeProvider; import org.xtest.xTest.Body; import org.xtest.xTest.XMethodDef; import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.google.inject.Inject; /** * Change {@link XbaseImportedNamespaceScopeProvider} so that it does not process static imports. * Static imports are processed in {@link XtestStaticMethodsFeatureForTypeProvider}. * * @author Michael Barry */ @SuppressWarnings("restriction") public class XtestImportedNamespaceScopeProvider extends XtendImportedNamespaceScopeProvider { @Inject private IJvmModelAssociations associations; @Override protected IScope getLocalElementsScope(IScope parent, final EObject context, final EReference reference) { IScope result = parent; ISelectable allDescriptions = getAllDescriptions(context.eResource()); ScopeBasedSelectable parentSelectable = new ScopeBasedSelectable(parent); QualifiedName name = getQualifiedNameOfLocalElement(context); boolean ignoreCase = isIgnoreCase(reference); if (context instanceof Body) { // explicitly add java.lang imports with correct import-selectable List<ImportNormalizer> defaultImports = getDefaultImports(); result = createImportScope(result, defaultImports, parentSelectable, reference.getEReferenceType(), isIgnoreCase(reference)); } final List<ImportNormalizer> namespaceResolvers = getImportedNamespaceResolvers(context, ignoreCase); if (!namespaceResolvers.isEmpty()) { if (isRelativeImport() && name != null) { ImportNormalizer localNormalizer = doCreateImportNormalizer(name, true, ignoreCase); result = createImportScope(result, singletonList(localNormalizer), allDescriptions, reference.getEReferenceType(), isIgnoreCase(reference)); } result = createImportScope(result, namespaceResolvers, parentSelectable, reference.getEReferenceType(), isIgnoreCase(reference)); } if (name != null) { ImportNormalizer localNormalizer = doCreateImportNormalizer(name, true, ignoreCase); result = createImportScope(result, singletonList(localNormalizer), allDescriptions, reference.getEReferenceType(), isIgnoreCase(reference)); } return new FilteringScope(result, new Predicate<IEObjectDescription>() { @Override public boolean apply(IEObjectDescription input) { EObject eObjectOrProxy = input.getEObjectOrProxy(); return eObjectOrProxy.eContainer() == null || !(eObjectOrProxy.eContainer() instanceof XMethodDef) && associations.getPrimarySourceElement(eObjectOrProxy) == null; } }); } @Override protected List<ImportNormalizer> internalGetImportedNamespaceResolvers(final EObject context, boolean ignoreCase) { if (!(context instanceof Body)) { return Collections.emptyList(); } Body file = (Body) context; List<ImportNormalizer> importedNamespaceResolvers = Lists.newArrayList(); for (XtendImport imp : file.getImports()) { if (!imp.isStatic()) { String value = imp.getImportedNamespace(); if (value == null) { value = imp.getImportedTypeName(); } ImportNormalizer resolver = createImportedNamespaceResolver(value, ignoreCase); if (resolver != null) { importedNamespaceResolvers.add(resolver); } } } return importedNamespaceResolvers; } }