package org.overture.ide.ui.templates; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jface.text.contentassist.ContextInformation; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.templates.Template; import org.eclipse.jface.text.templates.TemplateContext; import org.overture.ast.node.INode; import org.overture.ide.ui.internal.viewsupport.VdmElementImageProvider; public class VdmCompletionHelper extends VdmTemplateAssistProcessor{ static VdmElementImageProvider imgProvider = new VdmElementImageProvider(); public boolean checkForDuplicates(String value, ArrayList<String> container){ Iterator<String> iter = container.iterator(); while(iter.hasNext()){ String item = iter.next(); if(Objects.equals(value, item)){ return true; } } return false; } public boolean nullOrEmptyCheck(String str){ return str != null && !str.isEmpty(); } public boolean findInString(String text,String word) { if(text == ""){ return true; } return word.toLowerCase().startsWith(text.toLowerCase()); } public void createProposal(INode node, String displayname, String replacmentString,String additionalProposalInfo,final VdmCompletionContext info, final List<ICompletionProposal> proposals,final int offset) { if(nullOrEmptyCheck(replacmentString) && findInString(info.getProposalPrefix(),replacmentString)) { IContextInformation contextInfo = new ContextInformation(displayname, displayname); //$NON-NLS-1$ int curOffset = offset + info.getReplacementOffset();// - info2.proposalPrefix.length(); int length = replacmentString.length(); int replacementLength = info.getProposalPrefix().length(); proposals.add(new CompletionProposal(replacmentString, curOffset, replacementLength, length, imgProvider.getImageLabel(node, 0), displayname, contextInfo, additionalProposalInfo)); } } public String[] templatePatternGenerator(List<String> parameterNames,String[] functionName){ StringBuilder sbPattern = new StringBuilder(); StringBuilder sbDisplayName = new StringBuilder(); sbPattern.append(functionName[1]); sbDisplayName.append(functionName[1]); if((parameterNames != null && !parameterNames.isEmpty())){ List<String> checkedParamenterNames = parameterNameChecker(parameterNames); for (int i = 0; i < checkedParamenterNames.size(); i++) { String str = checkedParamenterNames.get(i); if(str != checkedParamenterNames.get(0)){ sbPattern.append(", "); sbDisplayName.append(", "); } sbPattern.append("${" + str + "}"); sbDisplayName.append(str); } } sbPattern.append(")"); sbDisplayName.append(")"); functionName[1] = sbPattern.toString(); functionName[0] = sbDisplayName.toString(); return functionName; } public void dynamicTemplateCreator(String[] extractedNames, String type, int offset,TemplateContext context,List<ICompletionProposal> proposals,VdmCompletionContext info,ITextViewer viewer,int nodeOffsetPosition) { dynamicTemplateCreator( extractedNames, type, offset, context, proposals, info, viewer, nodeOffsetPosition, null); } public void dynamicTemplateCreator(String[] extractedNames, String type, int offset,TemplateContext context,List<ICompletionProposal> proposals,VdmCompletionContext info,ITextViewer viewer,int nodeOffsetPosition, String prefix) { if (context == null) return; if(nullOrEmptyCheck(extractedNames[0]) && findInString(info.getProposalPrefix(),extractedNames[1])){ ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection(); // get caret pos = selection.getOffset() if (selection.getOffset() == offset){ offset = selection.getOffset() + selection.getLength(); } if(prefix == null){ prefix = extractPrefix(viewer, offset); } Region region = new Region(offset - prefix.length(), prefix.length()); context.setVariable("selection", selection.getText()); Template template = new Template(extractedNames[0],type,"org.overture.ide.vdmsl.ui.contextType",extractedNames[1],true); proposals.add(createProposal(template, context, (IRegion) region, getRelevance(template, prefix))); } } @Override protected String getTempleteContextType() { // TODO Auto-generated method stub return null; } private List<String> parameterNameChecker(List<String> parameterNames){ //TODO Temp class which has to be removed and replaced with the NameGen from package org.overture.codegen.vdm2jml.util; since it duplicates functionality NameGen nameGen = new NameGen(); List<String> checkedParameterNames = new ArrayList<String>(); for (String parm : parameterNames) { String tempParm = parm; tempParm = parm.replaceAll("[^a-zA-Z0-9_]", ""); if(tempParm.length() <= 0){ tempParm = "parameter"; } checkedParameterNames.add(nameGen.getName(tempParm)); } return checkedParameterNames; } }