/******************************************************************************* * Copyright (c) 2008,2010 itemis AG (http://www.itemis.eu) 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.mwe2.language.ui.contentassist; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.mwe2.language.mwe2.Assignment; import org.eclipse.emf.mwe2.language.mwe2.Component; import org.eclipse.emf.mwe2.language.mwe2.DeclaredProperty; import org.eclipse.emf.mwe2.language.mwe2.Module; import org.eclipse.emf.mwe2.language.mwe2.Mwe2Package; import org.eclipse.emf.mwe2.language.scoping.Mwe2ScopeProvider; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.xtext.common.types.JvmIdentifiableElement; import org.eclipse.xtext.common.types.JvmOperation; import org.eclipse.xtext.common.types.JvmType; import org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider; import org.eclipse.xtext.common.types.xtext.ui.TypeMatchFilters; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor; import com.google.common.base.Function; import com.google.inject.Inject; /** * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant */ public class Mwe2ProposalProvider extends AbstractMwe2ProposalProvider { @Inject private ITypesProposalProvider typeProposalProvider; @Override public Mwe2ScopeProvider getScopeProvider() { return (Mwe2ScopeProvider) super.getScopeProvider(); } @Override public void completeAssignment_Feature(EObject model, org.eclipse.xtext.Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (model instanceof Assignment && model.eContainer() instanceof Component) { createFeatureProposals((Component) model.eContainer(), context, acceptor); } else if (model instanceof Component) { createFeatureProposals((Component) model, context, acceptor); } } protected void createFeatureProposals(Component component, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { IScope scope = getScopeProvider().createComponentFeaturesScope(component); Iterable<IEObjectDescription> candidates = scope.getAllElements(); Function<IEObjectDescription, ICompletionProposal> factory = getProposalFactory("FQN", context); for (IEObjectDescription candidate: candidates) { if (!acceptor.canAcceptMoreProposals()) return; acceptor.accept(factory.apply(candidate)); } } @Override public void completeRootComponent_Type(EObject model, org.eclipse.xtext.Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeComponent_Type(model, assignment, context, acceptor); } @Override public void completeComponent_Type(EObject model, org.eclipse.xtext.Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (model instanceof Component) model = model.eContainer(); if (model instanceof Module) { typeProposalProvider.createTypeProposals(this, context, Mwe2Package.Literals.REFERRABLE__TYPE, TypeMatchFilters.canInstantiate(), acceptor); } else if (model instanceof Assignment) { Assignment attribute = (Assignment) model; if (attribute.getFeature() == null || attribute.getFeature().eIsProxy()) return; JvmIdentifiableElement feature = attribute.getFeature(); if (feature instanceof JvmOperation) { JvmType parameterType = ((JvmOperation) feature).getParameters().get(0).getParameterType().getType(); typeProposalProvider.createSubTypeProposals(parameterType, this, context, Mwe2Package.Literals.REFERRABLE__TYPE, TypeMatchFilters.canInstantiate(), acceptor); } } } @Override protected String getDisplayString(EObject element, String qualifiedName, String shortName) { if (element instanceof DeclaredProperty) { return qualifiedName; } return super.getDisplayString(element, qualifiedName, shortName); } }