/*******************************************************************************
* Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
******************************************************************************/
package org.axdt.as3.scoping;
import java.util.List;
import org.axdt.as3.model.As3Import;
import org.axdt.as3.model.As3ImportList;
import org.axdt.as3.model.As3Package;
import org.axdt.as3.model.As3Program;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.resource.ISelectable;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.impl.ImportNormalizer;
import org.eclipse.xtext.scoping.impl.ImportScope;
import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
import com.google.common.collect.Lists;
public class As3ImportScopeProvider extends ImportedNamespaceAwareLocalScopeProvider {
protected boolean isRelativeImport() {
return false;
}
protected ImportScope createImportScope(IScope parent,
List<ImportNormalizer> namespaceResolvers, ISelectable importFrom,
EClass type, boolean ignoreCase) {
return new As3ImportScope(namespaceResolvers, parent, importFrom, type,
ignoreCase);
}
protected List<ImportNormalizer> internalGetImportedNamespaceResolvers(
final EObject context, boolean ignoreCase) {
List<ImportNormalizer> importedNamespaceResolvers = Lists
.newArrayList();
collectImportDefinitions(context, importedNamespaceResolvers,
ignoreCase);
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 As3Package || context instanceof As3Program;
}
public List<ImportNormalizer> getImportResolvers(final EObject context,
final boolean ignoreCase) {
return getImportedNamespaceResolvers(context, ignoreCase);
}
protected void collectImportDefinitions(EObject context,
List<ImportNormalizer> list, boolean ignoreCase) {
if (hasImports(context) || context instanceof As3ImportList) {
// XXX explicit imports first ?
for (EObject child : context.eContents())
collectImportDefinitions(child, list, ignoreCase);
if (context instanceof As3Package) {
String packageName = ((As3Package) context).getCanonicalName();
if (packageName != null && packageName.length() > 0) {
ImportNormalizer normalizer = createImportedNamespaceResolver(
packageName + ".*", ignoreCase);
if (normalizer != null)
list.add(normalizer);
}
}
} else if (context instanceof As3Import) {
As3Import imprt = (As3Import) context;
ImportNormalizer normalizer = createImportedNamespaceResolver(
imprt.getCanonicalName(), ignoreCase);
if (normalizer != null)
list.add(normalizer);
}
}
}