/*
* Copyright 2013
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://opensource.org/licenses/eclipse-1.0.txt
*/
package de.lynorics.eclipse.jangaroo.scoping;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.scoping.impl.ImportNormalizer;
import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
import org.eclipse.xtext.util.Strings;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import de.lynorics.eclipse.jangaroo.aS3.Import;
import de.lynorics.eclipse.jangaroo.aS3.Model;
/**
* extends ImportedNamespaceAwareLocalScopeProvider
* http://git.eclipse.org/c/tmf/
* org.eclipse.xtext.git/plain/plugins/org.eclipse.xtext
* /src/org/eclipse/xtext/scoping
* /impl/ImportedNamespaceAwareLocalScopeProvider.java
*
* This is a local scope provider that understands namespace imports.
*
* It scans model elements for an EAttribute importedNamespace. The value of
* this attribute is interpreted as qualified name to be imported. Wildcards are
* supported (see {@link #getWildCard()} for details).
*
* Imports are valid for all elements in the same container and their children.
*
* In the case of xtend then XbaseImportedNamespaceScopeProvider is extended
* instead.
* http://git.eclipse.org/c/tmf/org.eclipse.xtext.git/plain/plugins/org.
* eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/scoping/
* XbaseImportedNamespaceScopeProvider.java
*/
public class AS3ImportedNamespaceScopeProvider extends
ImportedNamespaceAwareLocalScopeProvider {
/**
* Converts QualifiedNames to strings and back
*/
@Inject
private IQualifiedNameConverter qualifiedNameConverter;
// automatically import all types from the package we are in
@SuppressWarnings("unchecked")
@Override
protected List internalGetImportedNamespaceResolvers(EObject context,
boolean ignoreCase) {
if (!(context instanceof Model))
return Collections.emptyList();
Model file = (Model) context;
List importedNamespaceResolvers = Lists.newArrayList();
// import empty namespace
importedNamespaceResolvers.add(createImportedNamespaceResolver(
"default.*", ignoreCase));
// add the import statements
EList<Import> imports = file.getPackage() != null ? file.getPackage()
.getImp().getImports() : file.getImp().getImports();
for (Import imp : imports) {
String value = imp.getImportedNamespace();
ImportNormalizer resolver = createImportedNamespaceResolver(value,
ignoreCase);
if (resolver != null)
importedNamespaceResolvers.add(resolver);
}
// then add types from own package
if (file.getPackage() != null
&& !Strings.isEmpty(file.getPackage().getName())) {
importedNamespaceResolvers.add(
// construct ImportNormalizer with wildCard set to true
// ImportNormalizer constructor has this form:
// ImportNormalizer(QualifiedName importedNamespace, boolean
// wildCard, boolean ignoreCase)
// https://github.com/eclipse/xtext/blob/master/plugins/org.eclipse.xtext/src/org/eclipse/xtext/scoping/impl/ImportNormalizer.java
new ImportNormalizer(qualifiedNameConverter
.toQualifiedName(file.getPackage().getName()),
true, ignoreCase));
// add <package>.config
ImportNormalizer resolver = createImportedNamespaceResolver(file
.getPackage().getName() + ".config.*", ignoreCase);
if (resolver != null)
importedNamespaceResolvers.add(resolver);
}
return importedNamespaceResolvers;
}
public boolean hasImports(EObject context) {
// if it is a package it has always package default imports
// as well as the program for top level scope
return context instanceof de.lynorics.eclipse.jangaroo.aS3.Package;
}
public List<ImportNormalizer> getImportResolvers(final EObject context,
final boolean ignoreCase) {
return getImportedNamespaceResolvers(context, ignoreCase);
}
}