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

* improved proposal for simple data type parameters and members, refined tracing, #122

parent 3cb2501b
Loading
Loading
Loading
Loading
+50 −9
Original line number Diff line number Diff line
@@ -4,11 +4,13 @@
package org.etsi.mts.tdl.ui.contentassist;

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

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.AbstractRule;
@@ -20,6 +22,7 @@ import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.ui.editor.contentassist.CompletionProposalComputer;
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 org.eclipse.xtext.util.Strings;
@@ -59,12 +62,16 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
	public static boolean superRule = false;
	public static boolean superReference = false;
	public static boolean superContainment = false;
	private static String trace = "";

	
	private void trace(ContentAssistContext contentAssistContext, String methodName) {
		System.out.println(methodName);
		System.out.println("    context: "+NodeModelUtils.findActualNodeFor(contentAssistContext.getCurrentModel()).getText().trim()+" : "+contentAssistContext.getCurrentModel().eClass().getName());
		System.out.println("    replace: "+contentAssistContext.getReplaceRegion());
		trace += "\n"+methodName;
		trace += "\n"+"    context: "+NodeModelUtils.findActualNodeFor(contentAssistContext.getCurrentModel()).getText().trim()+" : "+contentAssistContext.getCurrentModel().eClass().getName();
		trace += "\n"+"    replace: "+contentAssistContext.getReplaceRegion();
	}
	
	private void preTrace(Assignment assignment, ContentAssistContext contentAssistContext) {
@@ -98,12 +105,25 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
		if (traceCompletions) {
			Object proposals = getProposals(acceptor);
			System.out.println("      proposals: "+proposals);
			List<String> proposalDescriptions = ((Collection<ICompletionProposal>)proposals).stream()
					.map(e->(ConfigurableCompletionProposal) e)
					.sorted(ConfigurableCompletionProposal::compareTo)
					.map(ICompletionProposal::getDisplayString)
					.filter(e -> !e.startsWith("--")).toList();
			trace += "\n      proposals: "+proposals;
			trace += "\n        "+String.join("\n        ", proposalDescriptions);

		}
	}

	private Object getProposals(ICompletionProposalAcceptor acceptor) {
		try {
			CompletionProposalComputer completionProposalComputer = (CompletionProposalComputer)((NullSafeCompletionProposalAcceptor) acceptor).getDelegate();
			CompletionProposalComputer completionProposalComputer;
			if (acceptor instanceof NullSafeCompletionProposalAcceptor) {
				completionProposalComputer = (CompletionProposalComputer)((NullSafeCompletionProposalAcceptor) acceptor).getDelegate();
			} else {
				completionProposalComputer = (CompletionProposalComputer) acceptor;
			}
			Field proposalsField = completionProposalComputer.getClass().getDeclaredField("proposals"); 
			proposalsField.setAccessible(true);
			Object proposals = proposalsField.get(completionProposalComputer);
@@ -124,13 +144,18 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
		superRule = true;
		superReference = true;
		superContainment = true;
		super.createProposals(context, acceptor);
		if (traceCompletions) {
			Collection<ICompletionProposal> proposals = (Collection<ICompletionProposal>) getProposals(acceptor);
			if (!proposals.stream().anyMatch(e -> e.getDisplayString().startsWith("---"))) {
				trace = "";
			}
//			System.out.println("Complete: -----------------------------------------------------");
//			for (AbstractElement element : context.getFirstSetGrammarElements()) {
//				System.out.println("--P: "+element);
//			}
		}
		super.createProposals(context, acceptor);

	}
	
	@Override
@@ -141,10 +166,22 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
		postTrace(acceptor);
		if (traceCompletionsInUI) {
			String name = "--R: "+getName(ruleCall) + " : "+contentAssistContext.getCurrentModel().eClass().getName();
			acceptor.accept(createCompletionProposal(name, new StyledString(name), null, 1000000001, "", contentAssistContext));
			traceUI(contentAssistContext, acceptor, name);
		}
	}

	private void traceUI(ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor,
			String name) {
		ICompletionProposal proposal = createCompletionProposal("--TRACE", new StyledString("---TRACE"), null, 1000000001, "", contentAssistContext);
		((ConfigurableCompletionProposal)proposal).setAdditionalProposalInfo(trace);

		Collection<ICompletionProposal> proposals = (Collection<ICompletionProposal>) getProposals(acceptor);
		List<String> proposalDescriptions = proposals.stream().map(ICompletionProposal::getDisplayString).filter(e -> !e.startsWith("--")).toList();
//		ICompletionProposal proposal = createCompletionProposal(name, new StyledString(name), null, 1000000001, "", contentAssistContext);
//		((ConfigurableCompletionProposal)proposal).setAdditionalProposalInfo(String.join("\n", proposalDescriptions));
		acceptor.accept(proposal);
	}

	@Override
	public void completeAssignment(Assignment assignment, ContentAssistContext contentAssistContext,
			ICompletionProposalAcceptor acceptor) {
@@ -153,7 +190,7 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
		postTrace(acceptor);
		if (traceCompletionsInUI) {
			String name = "--A: "+getName(assignment) + " : "+contentAssistContext.getCurrentModel().eClass().getName();
			acceptor.accept(createCompletionProposal(name, new StyledString(name), null, 1000000001, "", contentAssistContext));
			traceUI(contentAssistContext, acceptor, name);
		}
	}
	
@@ -343,12 +380,16 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
				accept = true;
			} else if (ne instanceof DataType && ((DataType) ne).conformsTo(type)) {
				//accept = true;
				if (ne instanceof SimpleDataType) {
					
				} else {
					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)) {