/******************************************************************************* * Copyright (c) 2012 BMW Car IT 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 *******************************************************************************/ /* * generated by Xtext */ package org.jnario.spec.ui.contentassist; import static com.google.common.collect.Iterables.filter; import java.util.List; import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.xtend.core.xtend.XtendClass; import org.eclipse.xtend.core.xtend.XtendField; import org.eclipse.xtend.core.xtend.XtendPackage; import org.eclipse.xtend.core.xtend.XtendParameter; import org.eclipse.xtext.AbstractRule; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.common.types.TypesPackage; import org.eclipse.xtext.common.types.xtext.ui.JdtVariableCompletions; import org.eclipse.xtext.common.types.xtext.ui.TypeMatchFilters; import org.eclipse.xtext.common.types.xtext.ui.JdtVariableCompletions.VariableType; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor; import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage; import org.jnario.spec.spec.SpecPackage; import org.jnario.spec.spec.TestFunction; import com.google.common.collect.Sets; import com.google.inject.Inject; /** * @author Sebastian Benz - Initial contribution and API */ @SuppressWarnings("restriction") public class SpecProposalProvider extends AbstractSpecProposalProvider { @Inject private JdtVariableCompletions completions; @Override public void completeXAnnotation_AnnotationType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeJavaTypes(context, XAnnotationsPackage.Literals.XANNOTATION__ANNOTATION_TYPE, TypeMatchFilters.all(IJavaSearchConstants.ANNOTATION_TYPE), acceptor); } // @Override // public void completeMockLiteral_Type(EObject model, Assignment assignment, // ContentAssistContext context, ICompletionProposalAcceptor acceptor) { // completeJavaTypes(context, XbasePackage.Literals.XTYPE_LITERAL__TYPE, // TypeMatchFilters.all(IJavaSearchConstants.CLASS_AND_INTERFACE), acceptor); // } @Override public void completeType_TargetType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeJavaTypes(context, SpecPackage.Literals.EXAMPLE_GROUP__TARGET_TYPE, true, getQualifiedNameValueConverter(), new TypeMatchFilters.All(IJavaSearchConstants.TYPE), acceptor); } @Override public void completeMember_TargetType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeJavaTypes(context, SpecPackage.Literals.EXAMPLE_GROUP__TARGET_TYPE, true, getQualifiedNameValueConverter(), new TypeMatchFilters.All(IJavaSearchConstants.TYPE), acceptor); } @Override public void completeMember_TargetOperation(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { super.completeMember_TargetOperation(model, assignment, context, acceptor); } @Override public void completeXFeatureCall_Feature(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (model instanceof TestFunction) { EObject xtendClass = model.eContainer(); while(xtendClass != null && (xtendClass instanceof XtendClass)){ for (XtendField field : filter(((XtendClass)xtendClass).getMembers(), XtendField.class)) { acceptor.accept(createCompletionProposal(field.getName(), field.getName(), getImage(field), context)); } xtendClass = xtendClass.eContainer(); } createLocalVariableAndImplicitProposals(model, context, acceptor); }else if (model instanceof XtendField) { createLocalVariableAndImplicitProposals(model, context, acceptor); } else { super.completeXFeatureCall_Feature(model, assignment, context, acceptor); } } @Override public void complete_RICH_TEXT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeInRichString(model, ruleCall, context, acceptor); } @Override public void complete_RICH_TEXT_START(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeInRichString(model, ruleCall, context, acceptor); } @Override public void complete_RICH_TEXT_END(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeInRichString(model, ruleCall, context, acceptor); } @Override public void complete_RICH_TEXT_INBETWEEN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeInRichString(model, ruleCall, context, acceptor); } @Override public void complete_COMMENT_RICH_TEXT_END(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeInRichString(model, ruleCall, context, acceptor); } @Override public void complete_COMMENT_RICH_TEXT_INBETWEEN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeInRichString(model, ruleCall, context, acceptor); } @Override public void completeParameter_Name(final EObject model, Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) { if (model instanceof XtendParameter) { final List<XtendParameter> siblings = EcoreUtil2.getSiblingsOfType(model, XtendParameter.class); Set<String> alreadyTaken = Sets.newHashSet(); for(XtendParameter sibling: siblings) { alreadyTaken.add(sibling.getName()); } alreadyTaken.addAll(getAllKeywords()); completions.getVariableProposals(model, XtendPackage.Literals.XTEND_PARAMETER__PARAMETER_TYPE, VariableType.PARAMETER, alreadyTaken, new JdtVariableCompletions.CompletionDataAcceptor() { public void accept(String replaceText, StyledString label, Image img) { acceptor.accept(createCompletionProposal(replaceText, label, img, context)); } }); } else { super.completeParameter_Name(model, assignment, context, acceptor); } } @Override public void completeMember_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (model instanceof XtendField) { // don't propose types everywhere but only if there's already an indicator for fields, e.g. static, extension, var, val completeJavaTypes(context, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE, true, getQualifiedNameValueConverter(), new TypeMatchFilters.All(IJavaSearchConstants.TYPE), acceptor); } } @Override public void completeMember_ReturnType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { completeJavaTypes(context, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE, true, getQualifiedNameValueConverter(), new TypeMatchFilters.All(IJavaSearchConstants.TYPE), acceptor); } @Override public void completeMember_Name(final EObject model, Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) { if (model instanceof XtendField) { //TODO go up type hierarchy and collect all local fields final List<XtendField> siblings = EcoreUtil2.getSiblingsOfType(model, XtendField.class); Set<String> alreadyTaken = Sets.newHashSet(); for(XtendField sibling: siblings) { alreadyTaken.add(sibling.getName()); } alreadyTaken.addAll(getAllKeywords()); completions.getVariableProposals(model, XtendPackage.Literals.XTEND_FIELD__TYPE, VariableType.INSTANCE_FIELD, alreadyTaken, new JdtVariableCompletions.CompletionDataAcceptor() { public void accept(String replaceText, StyledString label, Image img) { acceptor.accept(createCompletionProposal(replaceText, label, img, context)); } }); } else { super.completeMember_Name(model, assignment, context, acceptor); } } }