Commit 1cc0d10c authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ better support for new instances, collection items, filtering of proposals, #122

* refactoring
* exclude assigned parameters
parent e64d80ca
Loading
Loading
Loading
Loading
Loading
+62 −36
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
package org.etsi.mts.tdl.ui.contentassist;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;

import org.eclipse.emf.common.util.EList;
@@ -23,6 +24,7 @@ import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import org.eclipse.xtext.util.Strings;
import org.etsi.mts.tdl.CastDataUse;
import org.etsi.mts.tdl.CollectionDataType;
import org.etsi.mts.tdl.Connection;
import org.etsi.mts.tdl.DataElementUse;
import org.etsi.mts.tdl.DataInstance;
@@ -48,6 +50,7 @@ import org.etsi.mts.tdl.StructuredDataType;
 */
public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
	public static boolean traceCompletions = false;
	public static boolean traceCompletionsInUI = false;

	//super patterns
	//rule: empty
@@ -117,6 +120,7 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
	@Override
	public void createProposals(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		traceCompletions = false;
		traceCompletionsInUI = false;
		superRule = true;
		superReference = true;
		superContainment = true;
@@ -135,7 +139,7 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
		preTrace(ruleCall, contentAssistContext);
		super.completeRuleCall(ruleCall, contentAssistContext, acceptor);
		postTrace(acceptor);
		if (traceCompletions) {
		if (traceCompletionsInUI) {
			String name = "--R: "+getName(ruleCall) + " : "+contentAssistContext.getCurrentModel().eClass().getName();
			acceptor.accept(createCompletionProposal(name, new StyledString(name), null, 1000000001, "", contentAssistContext));
		}
@@ -147,7 +151,7 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
		preTrace(assignment, contentAssistContext);
		super.completeAssignment(assignment, contentAssistContext, acceptor);
		postTrace(acceptor);
		if (traceCompletions) {
		if (traceCompletionsInUI) {
			String name = "--A: "+getName(assignment) + " : "+contentAssistContext.getCurrentModel().eClass().getName();
			acceptor.accept(createCompletionProposal(name, new StyledString(name), null, 1000000001, "", contentAssistContext));
		}
@@ -216,6 +220,7 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {

		if (model instanceof DataElementUse) {
			completeMemberReferenceForDataUse(model, context, acceptor, "", " = ?", " : assign to member");
			return; 
		}
		//TODO: what is this?
		//after comma
@@ -230,8 +235,8 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
	public void completeParameterBindingFragment_Argument(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		//super: completeRuleCall
		if (superContainment)
			super.completeParameterBindingFragment_Argument(model, assignment, context, acceptor);
		//if (superContainment)
			//super.completeParameterBindingFragment_Argument(model, assignment, context, acceptor);
	}
	
	@Override
@@ -240,6 +245,10 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {

		//TODO: relevant?
		if (model instanceof ParameterBinding) {
//			var pb = ((ParameterBinding) model);
//			var type = pb.getParameter().getDataType();
//			completeAssignment(model, context, acceptor, type);
			
			return;
		}

@@ -333,7 +342,13 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
			if (ne instanceof DataInstance && ((DataInstance)ne).getDataType().conformsTo(type)) {
				accept = true;
			} else if (ne instanceof DataType && ((DataType) ne).conformsTo(type)) {
				accept = true;
				//accept = true;
				String prefix = "new ";
				String suffix = "()";
				if (ne instanceof CollectionDataType) {
					suffix = "[]";
				}
				acceptor.accept(createCompletionProposal(prefix+ne.getName()+suffix, new StyledString(prefix+ne.getName()+suffix).append(" : new instance of type", StyledString.DECORATIONS_STYLER), getImage(ne), 1000, "", context));
			} else if (ne instanceof Function && ((Function) ne).getReturnType().conformsTo(type)) {
				accept = true;
			} else if (ne instanceof FormalParameter && EcoreUtil2.isAncestor(EcoreUtil2.getContainerOfType(model, PackageableElement.class), ne)) {
@@ -474,6 +489,10 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
			//TODO: add suffix? e.g. =
			NamedElement dataElement = ((DataElementUse) model).getDataElement();
			EList<MemberReference> reduction = ((DataElementUse)model).getReduction();
			List<Parameter> assigned = ((DataElementUse) model).getArgument().stream()
					.map(ParameterBinding::getParameter)
					.toList();

			//TODO: a bit of a hack.. this belongs elsewhere -> affects the whole chain, should be applied selectively
//			System.out.println(model);
//			System.out.println(context.getPreviousModel());
@@ -482,65 +501,72 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
//				dataElement = reduction.get(reduction.size()-2).getMember().getDataType();
//			}
			if (dataElement instanceof StructuredDataType) { 
				for (Member m : ((StructuredDataType) dataElement).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 100000, "", context));
				}
				acceptMembers(context, acceptor, prefix, suffix, description, assigned, (StructuredDataType) dataElement);
			} else if (dataElement instanceof StructuredDataInstance) {
				for (Member m : ((StructuredDataType) ((StructuredDataInstance)dataElement).getDataType()).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 100000, "", context));
				}
				acceptMembers(context, acceptor, prefix, suffix, description, assigned, (StructuredDataType) ((StructuredDataInstance)dataElement).getDataType());
			} else if (dataElement instanceof FormalParameter) {
				DataType dataType = ((FormalParameter) dataElement).getDataType();
				if (dataType instanceof StructuredDataType) {
					for (Member m : ((StructuredDataType) dataType).allMembers()) {
						acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 1000, "", context));
					}
					acceptMembers(context, acceptor, prefix, suffix, description, assigned, (StructuredDataType) dataType);
				}
			} else if (dataElement instanceof Function) {
				DataType dataType = ((Function) dataElement).getReturnType();
				if (dataType instanceof StructuredDataType) {
					for (Member m : ((StructuredDataType) dataType).allMembers()) {
						acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 1000, "", context));
					}
					acceptMembers(context, acceptor, prefix, suffix, description, assigned, (StructuredDataType) dataType);
				}
			}
		} else if (model instanceof StructuredDataType) {
			for (Member m : ((StructuredDataType) model).allMembers()) {
				acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 1000, "", context));
			}
			//TODO: add already assigned
			acceptMembers(context, acceptor, prefix, suffix, description, Collections.emptyList(), (StructuredDataType) model);
			
		} else if (model instanceof StructuredDataInstance) {
			StructuredDataInstance instance = (StructuredDataInstance) model;
			DataType dataType = instance.getDataType();
			//get assigned members of instance
			List<Member> assigned = instance.getMemberAssignment().stream()
			List<Parameter> assigned = instance.getMemberAssignment().stream()
				.map(MemberAssignment::getMember)
				.map(e -> (Parameter) e)
				.toList();

			//TODO: reuse
			if (dataType instanceof StructuredDataType) {
				for (Member m : ((StructuredDataType) dataType).allMembers()) {
					if (!assigned.contains(m)) {
						acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 1000, "", context));
					}
				}
			}
			acceptMembers(context, acceptor, prefix, suffix, description, assigned, (StructuredDataType) instance.getDataType());
		} else if (model instanceof MemberReference) {
			DataType dataType = ((MemberReference) model).getMember().getDataType();
			//TODO: add already assigned
			if (dataType instanceof StructuredDataType) {
				for (Member m : ((StructuredDataType) dataType).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 1000, "", context));
				}
				acceptMembers(context, acceptor, prefix, suffix, description, Collections.emptyList(), (StructuredDataType) dataType);
			}
		} else if (model instanceof Member) {
			DataType dataType = ((Member) model).getDataType();
			//TODO: add already assigned
			if (dataType instanceof StructuredDataType) {
				for (Member m : ((StructuredDataType) dataType).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 1000, "", context));
				acceptMembers(context, acceptor, prefix, suffix, description, Collections.emptyList(), (StructuredDataType) dataType);
			}
		}
	}

	private void acceptMembers(ContentAssistContext context, ICompletionProposalAcceptor acceptor, String prefix,
			String suffix, String description, List<Parameter> assigned, StructuredDataType type) {
		for (Member m : type.allMembers()) {
			if (!assigned.contains(m)) {
				acceptor.accept(createCompletionProposal(prefix+m.getName()+suffix, new StyledString(prefix+m.getName()+suffix).append(description, StyledString.DECORATIONS_STYLER), getImage(m), 100000, "", context));
			}
		}
	}
	
	@Override
	public void completeCollectionItemFragment_Item(EObject model, Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		if (model instanceof DataElementUse) {
			NamedElement dataElement = ((DataElementUse) model).getDataElement();
			if (dataElement instanceof CollectionDataType) {
				DataType itemType = ((CollectionDataType) dataElement).getItemType();
				completeAssignment(model, context, acceptor, itemType);
				return; //?
			}
		}
		//super completeRuleCall
		if (superContainment)
			super.completeCollectionItemFragment_Item(model, assignment, context, acceptor);
	}
	
	@Override
	public void complete_FunctionCall(EObject model, RuleCall ruleCall, ContentAssistContext context,