[
https://issues.apache.org/jira/browse/GROOVY-9077?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul King closed GROOVY-9077.
-----------------------------
> STC: inferred type not always stored for property getters that resolve to a
> method
> ----------------------------------------------------------------------------------
>
> Key: GROOVY-9077
> URL: https://issues.apache.org/jira/browse/GROOVY-9077
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 2.5.6
> Reporter: Eric Milles
> Assignee: Paul King
> Priority: Minor
> Fix For: 3.0.0-beta-1, 2.5.7
>
>
> Consider the following:
> {code:groovy}
> @groovy.transform.CompileStatic
> void meth(List list) {
> if (list instanceof LinkedList && list.first) {
> }
> if (list instanceof LinkedList && list.peek()) {
> }
> }
> {code}
> {{storeTargetMethod}} is called for the method call expression
> {{list.peek()}}. However, when
> {{org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor.existsProperty}}
> resolves {{list.first}} to a method, {{storeTargetMethod}} is not called.
> This means the AST node does not record the direct method call target. Also,
> a type-checking extension does not have a chance to handle the method
> selection event.
> This addition addresses the issue for class getters:
> {code:java}
> if (readMode && checkGetterOrSetter) {
> if (getter != null) {
> ClassNode cn = inferReturnTypeGenerics(current,
> getter, ArgumentListExpression.EMPTY_ARGUMENTS);
> storeInferredTypeForPropertyExpression(pexp, cn);
> // GRECLIPSE add
> storeTargetMethod(pexp, getter);
> // GRECLIPSE end
>
> pexp.removeNodeMetaData(StaticTypesMarker.READONLY_PROPERTY);
> String delegationData = receiver.getData();
> if (delegationData != null)
>
> pexp.putNodeMetaData(StaticTypesMarker.IMPLICIT_RECEIVER, delegationData);
> return true;
> }
> {code}
> and this change addresses the issue for extension method getters:
> {code:java}
> // GROOVY-5568, the property may be defined by DGM
> List<ClassNode> dgmReceivers = new ArrayList<ClassNode>(2);
> dgmReceivers.add(testClass);
> if (isPrimitiveType(testClass))
> dgmReceivers.add(getWrapper(testClass));
> for (ClassNode dgmReceiver : dgmReceivers) {
> List<MethodNode> methods =
> findDGMMethodsByNameAndArguments(getTransformLoader(), dgmReceiver, "get" +
> capName, ClassNode.EMPTY_ARRAY);
> for (MethodNode m :
> findDGMMethodsByNameAndArguments(getTransformLoader(), dgmReceiver, "is" +
> capName, ClassNode.EMPTY_ARRAY)) {
> if (Boolean_TYPE.equals(getWrapper(m.getReturnType())))
> methods.add(m);
> }
> if (!methods.isEmpty()) {
> List<MethodNode> methodNodes =
> chooseBestMethod(dgmReceiver, methods, ClassNode.EMPTY_ARRAY);
> if (methodNodes.size() == 1) {
> MethodNode getter = methodNodes.get(0);
> if (visitor != null) {
> visitor.visitMethod(getter);
> }
> ClassNode cn = inferReturnTypeGenerics(dgmReceiver,
> getter, ArgumentListExpression.EMPTY_ARGUMENTS);
> storeInferredTypeForPropertyExpression(pexp, cn);
> // GRECLIPSE add
> storeTargetMethod(pexp, getter);
> // GRECLIPSE end
> return true;
> }
> }
> }
> {code}
> The selection of a setter method is not as simple, since there may be many
> candidates.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)