/******************************************************************************* * Copyright (c) 2010-2012, Zoltan Ujhelyi, Istvan Rath and Daniel Varro * 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 * * Contributors: * Zoltan Ujhelyi - initial API and implementation *******************************************************************************/ package org.eclipse.incquery.patternlanguage.ui.contentassist; import org.eclipse.emf.ecore.EObject; import org.eclipse.incquery.patternlanguage.annotations.PatternAnnotationProvider; import org.eclipse.incquery.patternlanguage.patternLanguage.Annotation; import org.eclipse.incquery.patternlanguage.patternLanguage.PatternLanguagePackage; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.IScopeProvider; import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor; import com.google.common.base.Predicates; import com.google.inject.Inject; /** * see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#contentAssist on how to customize content assistant */ public class PatternLanguageProposalProvider extends AbstractPatternLanguageProposalProvider { @Inject private PatternAnnotationProvider annotationProvider; @Inject private IScopeProvider scopeProvider; @Inject private ReferenceProposalCreator crossReferenceProposalCreator; @Override public void complete_Annotation(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { for (String annotationName : annotationProvider.getAllAnnotationNames()) { String prefixedName = String.format("@%s", annotationName); String prefix = context.getPrefix(); ContentAssistContext modifiedContext = context; INode lastNode = context.getLastCompleteNode(); if ("".equals(prefix) && lastNode.getSemanticElement() instanceof Annotation) { Annotation previousNode = (Annotation) lastNode.getSemanticElement(); String annotationPrefix = previousNode.getName(); if (previousNode.getParameters().isEmpty() && !annotationProvider.getAllAnnotationNames().contains(annotationPrefix)) { modifiedContext = context.copy() .setReplaceRegion(new Region(lastNode.getOffset(), lastNode.getLength() + prefix.length())) .toContext(); prefixedName = annotationName; } } ICompletionProposal proposal = createCompletionProposal(prefixedName, prefixedName, null, modifiedContext); if (proposal instanceof ConfigurableCompletionProposal) { ((ConfigurableCompletionProposal) proposal).setAdditionalProposalInfo(annotationProvider .getAnnotationObject(annotationName)); ((ConfigurableCompletionProposal) proposal).setHover(getHover()); } acceptor.accept(proposal); } } @Override public void complete_AnnotationParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (model instanceof Annotation) { Annotation annotation = (Annotation) model; for (String paramName : annotationProvider.getAnnotationParameters(annotation.getName())) { String outputName = String.format("%s = ", paramName); ICompletionProposal proposal = createCompletionProposal(outputName, paramName, null, context); if (proposal instanceof ConfigurableCompletionProposal) { ((ConfigurableCompletionProposal) proposal).setAdditionalProposalInfo(annotationProvider .getAnnotationParameter(annotation.getName(), paramName)); ((ConfigurableCompletionProposal) proposal).setHover(getHover()); } acceptor.accept(proposal); } } } @Override public void complete_VariableReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { IScope scope = scopeProvider.getScope(model, PatternLanguagePackage.Literals.VARIABLE_REFERENCE__VARIABLE); crossReferenceProposalCreator.lookupCrossReference(scope, model, PatternLanguagePackage.Literals.VARIABLE_REFERENCE__VARIABLE, acceptor, Predicates.<IEObjectDescription> alwaysTrue(), getProposalFactory(ruleCall.getRule().getName(), context)); } }