package org.overture.ide.ui.templates; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.templates.TemplateContext; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.analysis.DepthFirstAnalysisAdaptor; import org.overture.ast.definitions.AClassClassDefinition; import org.overture.ast.definitions.AExplicitFunctionDefinition; import org.overture.ast.definitions.AExplicitOperationDefinition; import org.overture.ast.definitions.AImplicitFunctionDefinition; import org.overture.ast.definitions.AImplicitOperationDefinition; import org.overture.ast.definitions.AInstanceVariableDefinition; import org.overture.ast.expressions.AVariableExp; import org.overture.ast.node.INode; import org.overture.ide.ui.VdmUIPlugin; import org.overture.ide.ui.editor.core.VdmDocument; public final class VdmCompletionExtractor { private static VdmCompletionHelper VdmHelper = new VdmCompletionHelper(); private static VdmFunctionCompletionExtractor VdmFunctionHelper = new VdmFunctionCompletionExtractor(); private static VdmOperationCompletionExtractor VdmOperationHelper = new VdmOperationCompletionExtractor(); private ArrayList<String> basicTypes = new ArrayList<String>(); private ArrayList<String> dynamicTemplateProposals = new ArrayList<String>(); private ArrayList<String> dynamicProposals = new ArrayList<String>(); public VdmCompletionExtractor(){ basicTypes.add("nat"); basicTypes.add("nat1"); basicTypes.add("bool"); basicTypes.add("int"); basicTypes.add("real"); basicTypes.add("char"); } public void generateCompleteProposals(final VdmCompletionContext info, VdmDocument document, final List<ICompletionProposal> proposals, final int offset, List<INode> Ast, final TemplateContext context,final ITextViewer viewer) { for (final INode element : Ast) { try { element.apply(new DepthFirstAnalysisAdaptor() { @Override public void caseAInstanceVariableDefinition(AInstanceVariableDefinition node) throws AnalysisException{ String name = node.getName().toString(); if(!VdmHelper.checkForDuplicates(name,dynamicTemplateProposals)){ VdmHelper.createProposal(node,name,name,"Instance Variable",info,proposals,offset); dynamicTemplateProposals.add(name); } } @Override public void caseAExplicitFunctionDefinition(AExplicitFunctionDefinition node) throws AnalysisException{ String extractedName[] = VdmFunctionHelper.explicitFunctionNameExtractor(node); if(VdmHelper.nullOrEmptyCheck(extractedName[1]) && !VdmHelper.checkForDuplicates(extractedName[1],dynamicTemplateProposals)){ VdmHelper.dynamicTemplateCreator(extractedName,"Explicit Function",offset,context,proposals,info,viewer,node.getLocation().getEndOffset()); dynamicTemplateProposals.add(extractedName[1]); } } @Override public void caseAImplicitFunctionDefinition(AImplicitFunctionDefinition node) throws AnalysisException{ String extractedName[] = VdmFunctionHelper.implicitFunctionNameExtractor(node); if(VdmHelper.nullOrEmptyCheck(extractedName[1]) && !VdmHelper.checkForDuplicates(extractedName[1],dynamicTemplateProposals)){ VdmHelper.dynamicTemplateCreator(extractedName,"Implicit Function",offset,context,proposals,info,viewer,node.getLocation().getEndOffset()); dynamicTemplateProposals.add(extractedName[1]); } } @Override public void caseAExplicitOperationDefinition(AExplicitOperationDefinition node) throws AnalysisException{ String extractedName[] = VdmOperationHelper.explicitOperationNameExtractor(node); if(VdmHelper.nullOrEmptyCheck(extractedName[1]) && !VdmHelper.checkForDuplicates(extractedName[1],dynamicTemplateProposals)){ VdmHelper.dynamicTemplateCreator(extractedName,"Explicit Operation",offset,context,proposals,info,viewer,node.getLocation().getEndOffset()); dynamicTemplateProposals.add(extractedName[1]); } } @Override public void caseAImplicitOperationDefinition(AImplicitOperationDefinition node) throws AnalysisException{ String extractedName[] = VdmOperationHelper.implicitOperationNameExtractor(node); if(VdmHelper.nullOrEmptyCheck(extractedName[1]) && !VdmHelper.checkForDuplicates(extractedName[1],dynamicTemplateProposals)){ VdmHelper.dynamicTemplateCreator(extractedName,"Implicit Operation",offset,context,proposals,info,viewer,node.getLocation().getEndOffset()); dynamicTemplateProposals.add(extractedName[1]); } } @Override public void caseAVariableExp(AVariableExp node) throws AnalysisException{ String name = node.toString(); if(!VdmHelper.checkForDuplicates(name,dynamicTemplateProposals)){ VdmHelper.createProposal(node,name,name,"Variable Exp",info,proposals,offset); dynamicTemplateProposals.add(name); } } }); } catch (AnalysisException e) { VdmUIPlugin.log("Completion error in " + getClass().getSimpleName() + "faild during populateNameList", e); } } basicTypeProposalFunction(info, proposals, offset); dynamicTemplateProposals.clear(); dynamicProposals.clear(); } private void basicTypeProposalFunction(final VdmCompletionContext info, final List<ICompletionProposal> proposals, final int offset){ Iterator<String> iter = basicTypes.iterator(); while(iter.hasNext()){ String item = iter.next(); VdmHelper.createProposal(null,item,item,"Basic Type",info,proposals,offset); } } }