This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new b5fe697 GROOVY-6328: STC: `onMethodSelection(expr,node)` callback for
property
b5fe697 is described below
commit b5fe697764bc2a7b55666b4d0e2e93433fc469d6
Author: Eric Milles <[email protected]>
AuthorDate: Thu Oct 28 14:14:56 2021 -0500
GROOVY-6328: STC: `onMethodSelection(expr,node)` callback for property
---
.../transform/stc/StaticTypeCheckingVisitor.java | 30 +++++++++++++++-------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 1cef134..d485fe8 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -29,7 +29,6 @@ import groovy.transform.TypeCheckingMode;
import groovy.transform.stc.ClosureParams;
import groovy.transform.stc.ClosureSignatureConflictResolver;
import groovy.transform.stc.ClosureSignatureHint;
-import org.apache.groovy.ast.tools.MethodNodeUtils;
import org.apache.groovy.util.SystemUtil;
import org.codehaus.groovy.GroovyBugError;
import org.codehaus.groovy.ast.ASTNode;
@@ -221,7 +220,6 @@ import static
org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
import static org.codehaus.groovy.ast.tools.GeneralUtils.isOrImplements;
import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
import static org.codehaus.groovy.ast.tools.GeneralUtils.thisPropX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
import static org.codehaus.groovy.ast.tools.GenericsUtils.makeClassSafe0;
@@ -1622,11 +1620,12 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
}
}
}
- foundGetterOrSetter = (foundGetterOrSetter ||
!setters.isEmpty() || getter != null);
- if (property != null && storeProperty(property, pexp,
receiverType, visitor, receiver.getData())) return true;
+ if (property != null && storeProperty(property, pexp,
receiverType, visitor, receiver.getData(), !readMode)) return true;
if (field != null && storeField(field, pexp, receiverType,
visitor, receiver.getData(), !readMode)) return true;
+
+ foundGetterOrSetter = (foundGetterOrSetter ||
!setters.isEmpty() || getter != null);
}
// GROOVY-5568: the property may be defined by DGM
@@ -1841,16 +1840,29 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
return true;
}
- private boolean storeProperty(final PropertyNode property, final
PropertyExpression expressionToStoreOn, final ClassNode receiver, final
ClassCodeVisitorSupport visitor, final String delegationData) {
+ private boolean storeProperty(final PropertyNode property, final
PropertyExpression expression, final ClassNode receiver, final
ClassCodeVisitorSupport visitor, final String delegationData, final boolean
lhsOfAssignment) {
if (visitor != null) visitor.visitProperty(property);
- storeWithResolve(property.getOriginType(), receiver,
property.getDeclaringClass(), property.isStatic(), expressionToStoreOn);
+ ClassNode propertyType = property.getOriginType();
+
+ storeWithResolve(propertyType, receiver, property.getDeclaringClass(),
property.isStatic(), expression);
+
if (delegationData != null) {
- expressionToStoreOn.putNodeMetaData(IMPLICIT_RECEIVER,
delegationData);
+ expression.putNodeMetaData(IMPLICIT_RECEIVER, delegationData);
}
if (Modifier.isFinal(property.getModifiers())) {
- expressionToStoreOn.putNodeMetaData(READONLY_PROPERTY,
Boolean.TRUE);
+ expression.putNodeMetaData(READONLY_PROPERTY, Boolean.TRUE);
+ if (!lhsOfAssignment) {
+ MethodNode implicitGetter = new
MethodNode(property.getGetterNameOrDefault(), Opcodes.ACC_PUBLIC, propertyType,
Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, null);
+ implicitGetter.setDeclaringClass(property.getDeclaringClass());
+ extension.onMethodSelection(expression, implicitGetter);
+ }
} else {
- expressionToStoreOn.removeNodeMetaData(READONLY_PROPERTY);
+ expression.removeNodeMetaData(READONLY_PROPERTY);
+ if (lhsOfAssignment) {
+ MethodNode implicitSetter = new
MethodNode(property.getSetterNameOrDefault(), Opcodes.ACC_PUBLIC, VOID_TYPE,
new Parameter[] {new Parameter(propertyType, "value")}, ClassNode.EMPTY_ARRAY,
null);
+ implicitSetter.setDeclaringClass(property.getDeclaringClass());
+ extension.onMethodSelection(expression, implicitSetter);
+ }
}
return true;
}