/* * generated by Xtext 2.12.0 */ package rba.tool.editor.ui.contentassist import com.google.common.base.Predicate import com.google.common.base.Predicates import com.google.inject.Inject import org.apache.log4j.Logger import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.util.EcoreUtil import org.eclipse.jface.text.contentassist.ICompletionProposal import org.eclipse.jface.viewers.StyledString import org.eclipse.swt.graphics.Image import org.eclipse.xtext.Assignment import org.eclipse.xtext.CrossReference import org.eclipse.xtext.Keyword import org.eclipse.xtext.RuleCall import org.eclipse.xtext.conversion.ValueConverterException import org.eclipse.xtext.resource.IEObjectDescription import org.eclipse.xtext.scoping.IScope import org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider.DefaultProposalCreator 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 rba.core.Content import rba.core.LambdaExpression import rba.core.RBACorePackage import rba.core.Variable import rba.sound.SoundContent import rba.sound.SoundContentSet import rba.sound.Zone import rba.sound.ZoneSet import rba.tool.editor.resource.RBAModelEObjectDescription import rba.tool.editor.ui.util.CharacterUtil import rba.view.Area import rba.view.AreaSet import rba.view.Display import rba.view.Size import rba.view.ViewContent import rba.view.ViewContentSet /** * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#content-assist * on how to customize the content assistant. */ class RBAModelProposalProvider extends AbstractRBAModelProposalProvider { private final static Logger log = Logger.getLogger(RBAModelProposalProvider); @Inject RBAModelExpressionScopeCreator expressionScopeCreator; override completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { if (!CharacterUtil.isKeywordWorthyToPropose(keyword)) { super.completeKeyword(keyword, contentAssistContext, acceptor) } } override lookupCrossReference(CrossReference crossReference, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { lookupCrossReference(crossReference, contentAssistContext, acceptor, getFeatureDescriptionPredicate(crossReference, contentAssistContext)); } def protected Predicate getFeatureDescriptionPredicate(CrossReference crossReference, ContentAssistContext contentAssistContext) { return Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { if (input.EObjectOrProxy instanceof Variable) { return contentAssistContext.currentModel.internalLambdaExpression(input.EObjectOrProxy); } if (input.EObjectOrProxy instanceof Size) { return isValidSizeModel(input.EObjectOrProxy, crossReference) } return true; } }); } def private boolean isValidSizeModel(EObject objectOrProxy, CrossReference crossReference) { var EObject tmpObj if (objectOrProxy.eIsProxy) { // resolve proxy object with crossReference tmpObj = EcoreUtil.resolve(objectOrProxy, crossReference); } else { tmpObj = objectOrProxy } // get the container of the real object if (tmpObj instanceof Size) { if (!(tmpObj.eContainer instanceof Area) && !(tmpObj.eContainer instanceof Content) && !(tmpObj.eContainer instanceof Display)) { return true; } } return false; } def protected boolean internalLambdaExpression(EObject eObj1, EObject eObj2) { if (eObj1 === null || !(eObj2 instanceof Variable)) { return false; } if (eObj1 instanceof LambdaExpression && (eObj1 as LambdaExpression).x === eObj2) { return true; } return internalLambdaExpression(eObj1.eContainer, eObj2); } override protected getProposalFactory(String ruleName, ContentAssistContext contentAssistContext) { return new DefaultProposalCreator(contentAssistContext, ruleName, getQualifiedNameConverter()) { override apply(IEObjectDescription candidate) { if (candidate === null) return null; var ICompletionProposal result = null; var String proposal = qualifiedNameConverter.toString(candidate.getName()); if (valueConverter !== null) { try { proposal = valueConverter.toString(proposal); } catch (ValueConverterException e) { log.debug(e.getMessage(), e); return null; } } else if (ruleName !== null) { try { proposal = getValueConverter().toString(proposal, ruleName); } catch (ValueConverterException e) { log.debug(e.getMessage(), e); return null; } } val EObject objectOrProxy = candidate.getEObjectOrProxy(); val StyledString displayString = getStyledDisplayString(candidate); val Image image = getImage(candidate); result = createCompletionProposal(proposal, displayString, image, contentAssistContext); if (result instanceof ConfigurableCompletionProposal) { (result as ConfigurableCompletionProposal).setProposalContextResource(contentAssistContext.getResource()); (result as ConfigurableCompletionProposal).setAdditionalProposalInfo(objectOrProxy); (result as ConfigurableCompletionProposal).setHover(hover); if (candidate instanceof RBAModelEObjectDescription) { (result as ConfigurableCompletionProposal).setCursorPosition((result as ConfigurableCompletionProposal).cursorPosition + (candidate as RBAModelEObjectDescription).getAdditionalInfo().get(0)); (result as ConfigurableCompletionProposal).setPriority((result as ConfigurableCompletionProposal).priority + (candidate as RBAModelEObjectDescription).getAdditionalInfo().get(1)); } } getPriorityHelper().adjustCrossReferencePriority(result, contentAssistContext.getPrefix()); return result; } }; } override completeAreaSet_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof Area || input.EObjectOrProxy instanceof AreaSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeViewContentSet_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof ViewContent || input.EObjectOrProxy instanceof ViewContentSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeViewContentSet_Allocatable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof Area || input.EObjectOrProxy instanceof AreaSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeZoneSet_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof Zone || input.EObjectOrProxy instanceof ZoneSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeSoundContentSet_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof SoundContent || input.EObjectOrProxy instanceof SoundContentSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeSoundContentSet_Allocatable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof Zone || input.EObjectOrProxy instanceof ZoneSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeViewContent_Allocatable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof Area || input.EObjectOrProxy instanceof AreaSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeSoundContent_Allocatable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val Predicate filter = Predicates.and(new Predicate() { override public boolean apply(IEObjectDescription input) { return (input.EObjectOrProxy instanceof Zone || input.EObjectOrProxy instanceof ZoneSet); } }); lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor, filter); } override completeCMemberFeatureReference_RefObject(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { createMemberAndOperatorProposals(model, assignment, context, acceptor); } override completeVMemberFeatureReference_RefObject(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { createMemberAndOperatorProposals(model, assignment, context, acceptor); } def protected void createMemberAndOperatorProposals(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val IScope scope = expressionScopeCreator.getExpressionScope(model, context); if (scope === null) { lookupCrossReference((assignment.getTerminal() as CrossReference), context, acceptor); } else { getCrossReferenceProposalCreator().lookupCrossReference(scope, model, RBACorePackage.Literals.OBJECT_REFERENCE__REF_OBJECT, acceptor, getFeatureDescriptionPredicate((assignment.getTerminal() as CrossReference), context), getProposalFactory("ValidID", context)); } } override complete_OpGetProperty(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val IScope scope = expressionScopeCreator.getExpressionScope(model, context); if (scope !== null) { getCrossReferenceProposalCreator().lookupCrossReference(scope, model, RBACorePackage.Literals.OPERATOR__OPERAND, acceptor, Predicates.alwaysTrue(), getProposalFactory(null, context)); } } }