Skip to content

Commit ce114e7

Browse files
committedFeb 5, 2024
Fix for #1543: link the source method for method-based property proposal
1 parent 0233324 commit ce114e7

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed
 

‎ide/org.codehaus.groovy.eclipse.codeassist/src/org/codehaus/groovy/eclipse/codeassist/creators/AbstractProposalCreator.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2023 the original author or authors.
2+
* Copyright 2009-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -71,7 +71,9 @@ protected static FieldNode createMockField(final MethodNode method) {
7171

7272
FieldNode fieldNode = new FieldNode(fieldName, fieldModifiers, fieldType, method.getDeclaringClass(), null);
7373
fieldNode.setDeclaringClass(method.getDeclaringClass());
74+
fieldNode.setNodeMetaData("groovy.method", method);
7475
fieldNode.setSourcePosition(method);
76+
fieldNode.setSynthetic(true);
7577
return fieldNode;
7678
}
7779

‎ide/org.codehaus.groovy.eclipse.codeassist/src/org/codehaus/groovy/eclipse/codeassist/proposals/GroovyFieldProposal.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2023 the original author or authors.
2+
* Copyright 2009-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
1717

1818
import org.codehaus.groovy.ast.AnnotatedNode;
1919
import org.codehaus.groovy.ast.FieldNode;
20+
import org.codehaus.groovy.ast.MethodNode;
2021
import org.codehaus.groovy.eclipse.codeassist.ProposalUtils;
2122
import org.codehaus.groovy.eclipse.codeassist.completions.GroovyJavaFieldCompletionProposal;
2223
import org.codehaus.groovy.eclipse.codeassist.processors.GroovyCompletionProposal;
@@ -31,6 +32,9 @@
3132
import org.eclipse.jdt.groovy.search.VariableScope;
3233
import org.eclipse.jdt.internal.codeassist.InternalCompletionProposal;
3334
import org.eclipse.jdt.internal.codeassist.impl.AssistOptions;
35+
import org.eclipse.jdt.internal.ui.text.java.AbstractJavaCompletionProposal;
36+
import org.eclipse.jdt.internal.ui.text.java.MemberProposalInfo;
37+
import org.eclipse.jdt.internal.ui.text.java.ProposalInfo;
3438
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
3539
import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
3640
import org.eclipse.jface.viewers.StyledString;
@@ -105,7 +109,24 @@ public IJavaCompletionProposal createJavaProposal(ContentAssistContext context,
105109
proposal.setRequiredProposals(new CompletionProposal[] {importProposal});
106110
}
107111

108-
return new GroovyJavaFieldCompletionProposal(proposal, createDisplayString(field), javaContext);
112+
var javaProposal = new GroovyJavaFieldCompletionProposal(proposal, createDisplayString(field), javaContext);
113+
var groovyMethod = field.<MethodNode>getNodeMetaData("groovy.method");
114+
if (groovyMethod != null) {
115+
try {
116+
var type = javaContext.getProject().findType(groovyMethod.getDeclaringClass().getName());
117+
if (type != null) {
118+
var method = type.getMethod(groovyMethod.getName(), GroovyUtils.getParameterTypeSignatures(groovyMethod, true));
119+
if (method != null && method.exists()) {
120+
ProposalInfo proposalInfo = ReflectionUtils.executePrivateMethod(AbstractJavaCompletionProposal.class, "getProposalInfo", javaProposal);
121+
ReflectionUtils.throwableSetPrivateField(MemberProposalInfo.class, "fJavaElementResolved", proposalInfo, Boolean.TRUE);
122+
ReflectionUtils.throwableSetPrivateField(ProposalInfo.class, "fElement", proposalInfo, method);
123+
}
124+
}
125+
} catch (Exception e) {
126+
e.printStackTrace();
127+
}
128+
}
129+
return javaProposal;
109130
}
110131

111132
protected StyledString createDisplayString(FieldNode field) {

0 commit comments

Comments
 (0)
Please sign in to comment.