/** * Copyright (c) 2014 Eclipse contributors and others. * 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.eclipse.emf.ecore.xcore.scoping; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.xcore.XImportDirective; import org.eclipse.emf.ecore.xcore.XPackage; import org.eclipse.xtext.common.types.JvmDeclaredType; import org.eclipse.xtext.common.types.JvmType; import org.eclipse.xtext.common.types.access.IJvmTypeProvider; import org.eclipse.xtext.common.types.xtext.AbstractTypeScopeProvider; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.IResourceScopeCache; import org.eclipse.xtext.util.Strings; import org.eclipse.xtext.xbase.imports.DefaultImportsConfiguration; import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations; import org.eclipse.xtext.xtype.XImportDeclaration; import org.eclipse.xtext.xtype.XImportSection; import org.eclipse.xtext.xtype.XtypeFactory; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Provider; public class XcoreImportsConfiguration extends DefaultImportsConfiguration { @Inject private IJvmModelAssociations associations; @Inject private IResourceScopeCache cache; @Inject private AbstractTypeScopeProvider typeScopeProvider; @Override public XImportSection getImportSection(final XtextResource resource) { return cache.get ("synthetic.import.section", resource, new Provider<XImportSection>() { public XImportSection get() { XImportSection importSection = XtypeFactory.eINSTANCE.createXImportSection(); EList<XImportDeclaration> importDeclarations = importSection.getImportDeclarations(); IJvmTypeProvider typeProvider = typeScopeProvider.getTypeProvider(resource.getResourceSet()); XPackage xPackage = (XPackage) resource.getContents().get(0); EList<XImportDirective> importDirectives = xPackage.getImportDirectives(); for (XImportDirective importDirective : importDirectives) { JvmDeclaredType importedType = null; String importedNamespace = importDirective.getImportedNamespace(); boolean isWildcard = importedNamespace.endsWith(".*"); if (!isWildcard) { EObject importedObject = importDirective.getImportedObject(); if (importedObject instanceof JvmDeclaredType) { importedType = (JvmDeclaredType) importedObject; } else if (importedObject != null) { EObject primaryJvmElement = associations.getPrimaryJvmElement(importedObject); if (primaryJvmElement instanceof JvmDeclaredType) { importedType = (JvmDeclaredType) primaryJvmElement; } else { JvmType jvmType = typeProvider.findTypeByName(importedNamespace, false); if (jvmType instanceof JvmDeclaredType) { importedType = (JvmDeclaredType)jvmType; } } } } if (isWildcard || importedType != null) { XImportDeclaration importDeclaration = XtypeFactory.eINSTANCE.createXImportDeclaration(); importDeclaration.setImportedType(importedType); importDeclaration.setImportedNamespace(importedNamespace); importDeclaration.setExtension(false); importDeclaration.setStatic(false); importDeclarations.add(importDeclaration); } } return importSection; } }); } @Override public Iterable<JvmDeclaredType> getLocallyDefinedTypes(XtextResource resource) { List<EObject> contents = resource.getContents(); String packageName = getPackageName(resource); List<JvmDeclaredType> knownTypes = Lists.newArrayListWithExpectedSize(contents.size() / 2); for (JvmDeclaredType content : Iterables.filter(contents, JvmDeclaredType.class)) { if (Strings.equal(packageName, content.getPackageName())) { knownTypes.add(content); } } return knownTypes; } @Override public String getPackageName(XtextResource resource) { XPackage xPackage = (XPackage) resource.getContents().get(0); return xPackage.getName(); } @Override public int getImportSectionOffset(XtextResource resource) { return 0; } }