Commit aaf5102d authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ completion proposal improvements for reduction / member reference, #122

parent 99433488
Loading
Loading
Loading
Loading
+108 −0
Original line number Diff line number Diff line
@@ -7,14 +7,23 @@ import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import org.etsi.mts.tdl.CastDataUse;
import org.etsi.mts.tdl.Connection;
import org.etsi.mts.tdl.DataElementUse;
import org.etsi.mts.tdl.DataType;
import org.etsi.mts.tdl.DataUse;
import org.etsi.mts.tdl.Member;
import org.etsi.mts.tdl.MemberReference;
import org.etsi.mts.tdl.Message;
import org.etsi.mts.tdl.NamedElement;
import org.etsi.mts.tdl.Parameter;
import org.etsi.mts.tdl.Target;

import org.etsi.mts.tdl.StructuredDataInstance;
import org.etsi.mts.tdl.StructuredDataType;

@@ -24,15 +33,45 @@ import org.etsi.mts.tdl.StructuredDataType;
 */
public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {

	@Override
	public void complete_ParameterBinding(EObject model, RuleCall ruleCall, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		// TODO Auto-generated method stub
		super.complete_ParameterBinding(model, ruleCall, context, acceptor);
//		System.out.println("PB:");
	}
	
	@Override
	public void completeParameterBinding_Parameter(EObject model, Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
//		super.completeParameterBinding_Parameter(model, assignment, context, acceptor);
//		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
//		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);

		if (model instanceof DataElementUse) {
			for (Member m : ((StructuredDataType)((DataElementUse) model).resolveDataType()).allMembers()) {
				acceptor.accept(createCompletionProposal(m.getName(), new StyledString(m.getName()), getImage(m), 1000, "", context));
			}
		}
		//after comma
//		System.out.println("s1");
//		System.out.println(assignment);
	}
	
	@Override
	public void complete_ParameterBindingFragment(EObject model, RuleCall ruleCall, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		// TODO Auto-generated method stub 
		//before comma!! context: current element
//		super.complete_ParameterBindingFragment(model, ruleCall, context, acceptor);
//		model.eContainer() instanceof 
//		if (model instanceof DataElementUse) {
//			for (Member m : ((StructuredDataType)((DataElementUse) model.eContainer()).resolveDataType()).allMembers()) {
//				acceptor.accept(createCompletionProposal(m.getName(), new StyledString(m.getName()), getImage(m), 1000, "", context));
//			}
//		}
//		System.out.println("s2");
//		System.out.println(NodeModelUtils.findActualNodeFor(model).getText());
	}

	@Override
@@ -51,6 +90,75 @@ public class TDLtxProposalProvider extends AbstractTDLtxProposalProvider {
	    // methods check for valid prefixes and terminal token conflicts.
	    // The acceptor handles null-values gracefully.
	}
	
	@Override
	public void complete_ParameterReductionFragment(EObject model, RuleCall ruleCall, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		// TODO Auto-generated method stub
		super.complete_ParameterReductionFragment(model, ruleCall, context, acceptor);
	}
	
	@Override
	public void completeParameterReductionFragment_Reduction(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		// TODO Auto-generated method stub
		super.completeParameterReductionFragment_Reduction(model, assignment, context, acceptor);
	}
	
	@Override
	public void complete_ReductionFragment(EObject model, RuleCall ruleCall, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMemberReferenceForDataUse(model, context, acceptor, ".");
	}
	
	@Override
	public void completeReductionFragment_Reduction(EObject model, Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
//		 TODO Auto-generated method stub
		super.completeReductionFragment_Reduction(model, assignment, context, acceptor);
	}
	
	@Override
	public void complete_MemberReference(EObject model, RuleCall ruleCall, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		// TODO Auto-generated method stub
//		super.complete_MemberReference(model, ruleCall, context, acceptor);
		completeMemberReferenceForDataUse(model, context, acceptor, "");
//		if (model instanceof MemberReference) {
//			DataType dataType = ((MemberReference)model).getMember().getDataType();
//			if (dataType instanceof StructuredDataType) {
//				for (Member m : ((StructuredDataType) dataType).allMembers()) {
//					acceptor.accept(createCompletionProposal("."+m.getName(), new StyledString(m.getName()), getImage(m), 100000, "", context));
//				}
//			}
//		}
		
	}

	private void completeMemberReferenceForDataUse(EObject model, ContentAssistContext context, ICompletionProposalAcceptor acceptor, String prefix) {
		if (model instanceof CastDataUse) {
			DataType dataType = ((CastDataUse) model).getDataType();
			if (dataType instanceof StructuredDataType) {
				for (Member m : ((StructuredDataType) dataType).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName(), new StyledString(m.getName()), getImage(m), 1000, "", context));
				}
			}
		} else if (model instanceof DataElementUse) {
//			System.out.println(model);
			NamedElement dataElement = ((DataElementUse) model).getDataElement();
			if (dataElement instanceof StructuredDataType) { 
				for (Member m : ((StructuredDataType) dataElement).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName(), new StyledString(m.getName()), getImage(m), 100000, "", context));
				}
			} else if (dataElement instanceof StructuredDataInstance) {
				for (Member m : ((StructuredDataType) ((StructuredDataInstance)dataElement).getDataType()).allMembers()) {
					acceptor.accept(createCompletionProposal(prefix+m.getName(), new StyledString(m.getName()), getImage(m), 100000, "", context));
				}
			}
			//TODO: function / parameter
		}
	}
	
	@Override
	public void complete_FunctionCall(EObject model, RuleCall ruleCall, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {