From 65d67aea7a523bfabd27bea2854ae64d392d68af Mon Sep 17 00:00:00 2001 From: Romain Bioteau Date: Wed, 13 Jan 2016 18:07:10 +0100 Subject: [PATCH] Fix groovy completion --- .../VariablesTypeCompletionProposal.java | 172 ++++++++++-------- 1 file changed, 92 insertions(+), 80 deletions(-) diff --git a/bundles/plugins/org.bonitasoft.studio.groovy.ui/src/org/bonitasoft/studio/groovy/ui/contentassist/VariablesTypeCompletionProposal.java b/bundles/plugins/org.bonitasoft.studio.groovy.ui/src/org/bonitasoft/studio/groovy/ui/contentassist/VariablesTypeCompletionProposal.java index 423c3fe2a6..f3407fd2c1 100644 --- a/bundles/plugins/org.bonitasoft.studio.groovy.ui/src/org/bonitasoft/studio/groovy/ui/contentassist/VariablesTypeCompletionProposal.java +++ b/bundles/plugins/org.bonitasoft.studio.groovy.ui/src/org/bonitasoft/studio/groovy/ui/contentassist/VariablesTypeCompletionProposal.java @@ -35,6 +35,7 @@ import org.codehaus.groovy.eclipse.codeassist.requestor.ContentAssistContext; import org.codehaus.groovy.eclipse.codeassist.requestor.GroovyCompletionProposalComputer; import org.codehaus.jdt.groovy.model.GroovyCompilationUnit; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.core.CompletionContext; import org.eclipse.jdt.core.CompletionProposal; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; @@ -42,6 +43,8 @@ import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.Signature; +import org.eclipse.jdt.groovy.core.util.ReflectionUtils; +import org.eclipse.jdt.internal.codeassist.InternalCompletionContext; import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer; import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext; @@ -66,99 +69,108 @@ public class VariablesTypeCompletionProposal implements IJavaCompletionProposalC @Override public List computeCompletionProposals(final ContentAssistInvocationContext context, final IProgressMonitor monitor) { final List list = new ArrayList(); - if (context instanceof JavaContentAssistInvocationContext) { - final ITextViewer viewer = context.getViewer(); - final List scriptVariables = getScriptVariables(viewer); - if (scriptVariables.isEmpty()) { - return list; - } - // final CompletionContext coreContext = ((JavaContentAssistInvocationContext) context).getCoreContext(); - // if (coreContext != null && !coreContext.isExtended()) { - // // must use reflection to set the fields - // ReflectionUtils.setPrivateField(InternalCompletionContext.class, "isExtended", coreContext, true); - // ReflectionUtils.setPrivateField(InternalCompletionContext.class, "extendedContext", coreContext, - // new GroovyExtendedCompletionContext(getContext(), requestor.currentScope)); - // } - final ICompilationUnit unit = ((JavaContentAssistInvocationContext) context).getCompilationUnit(); - if (unit instanceof GroovyCompilationUnit) { - if (((GroovyCompilationUnit) unit).getModuleNode() == null) { - return Collections.emptyList(); + try { + if (context instanceof JavaContentAssistInvocationContext) { + final ITextViewer viewer = context.getViewer(); + final List scriptVariables = getScriptVariables(viewer); + if (scriptVariables.isEmpty()) { + return list; } - final ContentAssistContext assistContext = new GroovyCompletionProposalComputer().createContentAssistContext((GroovyCompilationUnit) unit, - context.getInvocationOffset(), context.getDocument()); - CharSequence prefix = null; - try { - prefix = context.computeIdentifierPrefix(); - } catch (final BadLocationException e) { - BonitaStudioLog.error(e); + final CompletionContext coreContext = ((JavaContentAssistInvocationContext) context).getCoreContext(); + if (coreContext != null && !coreContext.isExtended()) { + // must use reflection to set the fields + ReflectionUtils.setPrivateField(InternalCompletionContext.class, "isExtended", coreContext, true); + // ReflectionUtils.setPrivateField(InternalCompletionContext.class, "extendedContext", coreContext, + // new GroovyExtendedCompletionContext(getContext(), requestor.currentScope)); } - - if (assistContext != null && assistContext.completionNode instanceof VariableExpression) { + final ICompilationUnit unit = ((JavaContentAssistInvocationContext) context).getCompilationUnit(); + if (unit instanceof GroovyCompilationUnit) { + if (((GroovyCompilationUnit) unit).getModuleNode() == null) { + return Collections.emptyList(); + } + final ContentAssistContext assistContext = new GroovyCompletionProposalComputer().createContentAssistContext((GroovyCompilationUnit) unit, + context.getInvocationOffset(), context.getDocument()); + CharSequence prefix = null; try { - final VariableExpression expr = (VariableExpression) assistContext.completionNode; - if (scriptVariables != null) { - for (final ScriptVariable f : scriptVariables) { - if (expr.getName().equals(f.getName())) { - final IType type = javaProject.findType(f.getType()); - if (type == null) { - return list; - } - for (final IMethod m : type.getMethods()) { - if (m.getElementName().startsWith(prefix.toString())) { - final GroovyCompletionProposal proposal = new GroovyCompletionProposal(CompletionProposal.METHOD_REF, - context.getInvocationOffset()); - proposal.setName(m.getElementName().toCharArray()); - proposal.setCompletion(m.getElementName().substring(prefix.length()).toCharArray()); - proposal.setFlags(m.getFlags()); - - if (prefix.length() == m.getElementName().length()) { - proposal.setReplaceRange(context.getInvocationOffset(), context.getInvocationOffset()); - proposal.setReceiverRange(0, 0); - } else { - proposal.setReplaceRange(context.getInvocationOffset() - prefix.length(), context.getInvocationOffset()); - proposal.setReceiverRange(prefix.length(), prefix.length()); - } - - final char[][] parametersArray = new char[m.getParameterNames().length][256]; - final List parameters = new ArrayList(); - for (int i = 0; i < m.getParameterNames().length; i++) { - parametersArray[i] = m.getParameterNames()[i].toCharArray(); - parameters.add(new Parameter(ClassHelper.make(Signature - .getSignatureSimpleName(m.getParameterTypes()[i])), m.getParameterNames()[i])); - } - - final ClassNode classNode = ClassHelper.make(m.getDeclaringType() - .getFullyQualifiedName()); - proposal.setDeclarationSignature(ProposalUtils.createTypeSignature(classNode)); - proposal.setParameterNames(parametersArray); - if (m.getDeclaringType().getFullyQualifiedName().equals(f.getType())) { - proposal.setRelevance(100); - } + prefix = context.computeIdentifierPrefix(); + } catch (final BadLocationException e) { + BonitaStudioLog.error(e); + } - final MethodNode methodNode = new MethodNode(m.getElementName(), m.getFlags(), ClassHelper.make(Signature - .getSignatureSimpleName(m.getReturnType())), - parameters.toArray(new Parameter[parameters.size()]), new ClassNode[0], null); - final char[] methodSignature = ProposalUtils.createMethodSignature(methodNode); - proposal.setSignature(methodSignature); - - final GroovyJavaGuessingCompletionProposal groovyProposal = GroovyJavaGuessingCompletionProposal.createProposal( - proposal, - (JavaContentAssistInvocationContext) context, true, "Groovy", ProposalFormattingOptions.newFromOptions()); - if (groovyProposal != null) { - list.add(groovyProposal); + if (assistContext != null && assistContext.completionNode instanceof VariableExpression) { + try { + final VariableExpression expr = (VariableExpression) assistContext.completionNode; + if (scriptVariables != null) { + for (final ScriptVariable f : scriptVariables) { + if (expr.getName().equals(f.getName())) { + final IType type = javaProject.findType(f.getType()); + if (type == null) { + return list; + } + for (final IMethod m : type.getMethods()) { + if (m.getElementName().startsWith(prefix.toString())) { + final GroovyCompletionProposal proposal = new GroovyCompletionProposal(CompletionProposal.METHOD_REF, + context.getInvocationOffset()); + proposal.setName(m.getElementName().toCharArray()); + proposal.setCompletion(m.getElementName().substring(prefix.length()).toCharArray()); + proposal.setFlags(m.getFlags()); + + if (prefix.length() == m.getElementName().length()) { + proposal.setReplaceRange(context.getInvocationOffset(), context.getInvocationOffset()); + proposal.setReceiverRange(0, 0); + } else { + proposal.setReplaceRange(context.getInvocationOffset() - prefix.length(), context.getInvocationOffset()); + proposal.setReceiverRange(prefix.length(), prefix.length()); + } + + final char[][] parametersArray = new char[m.getParameterNames().length][256]; + final List parameters = new ArrayList(); + for (int i = 0; i < m.getParameterNames().length; i++) { + parametersArray[i] = m.getParameterNames()[i].toCharArray(); + parameters.add(new Parameter(ClassHelper.make(Signature + .getSignatureSimpleName(m.getParameterTypes()[i])), m.getParameterNames()[i])); + } + + final ClassNode classNode = ClassHelper.make(m.getDeclaringType() + .getFullyQualifiedName()); + proposal.setDeclarationSignature(ProposalUtils.createTypeSignature(classNode)); + proposal.setParameterNames(parametersArray); + if (m.getDeclaringType().getFullyQualifiedName().equals(f.getType())) { + proposal.setRelevance(100); + } + + final MethodNode methodNode = new MethodNode(m.getElementName(), m.getFlags(), ClassHelper.make(Signature + .getSignatureSimpleName(m.getReturnType())), + parameters.toArray(new Parameter[parameters.size()]), new ClassNode[0], null); + final char[] methodSignature = ProposalUtils.createMethodSignature(methodNode); + proposal.setSignature(methodSignature); + + final GroovyJavaGuessingCompletionProposal groovyProposal = GroovyJavaGuessingCompletionProposal.createProposal( + proposal, + (JavaContentAssistInvocationContext) context, true, "Groovy", + ProposalFormattingOptions.newFromOptions()); + if (groovyProposal != null) { + list.add(groovyProposal); + } } } } } } + } catch (final JavaModelException e) { + BonitaStudioLog.error(e); } - } catch (final JavaModelException e) { - BonitaStudioLog.error(e); } } - } - return list; + return list; + } + } finally { + final CompletionContext coreContext = ((JavaContentAssistInvocationContext) context).getCoreContext(); + if (coreContext != null && coreContext.isExtended()) { + // must use reflection to set the fields + ReflectionUtils.setPrivateField(InternalCompletionContext.class, "isExtended", coreContext, false); + } } return Collections.emptyList(); -- GitLab