You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2019/02/21 06:17:00 UTC
[jira] [Resolved] (GROOVY-8250) VariableScopeVisitor does not set
declaring class on property nodes
[ https://issues.apache.org/jira/browse/GROOVY-8250?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Paul King resolved GROOVY-8250.
-------------------------------
Resolution: Fixed
Assignee: Paul King
Fix Version/s: 3.0.0-alpha-4
2.5.3
Fixed as part of GROOVY-8797, but see the comments wrt limitations on being able to set the type. If you believe the type information needs further work, please open a new issue.
> VariableScopeVisitor does not set declaring class on property nodes
> -------------------------------------------------------------------
>
> Key: GROOVY-8250
> URL: https://issues.apache.org/jira/browse/GROOVY-8250
> Project: Groovy
> Issue Type: Bug
> Reporter: Eric Milles
> Assignee: Paul King
> Priority: Major
> Fix For: 2.5.3, 3.0.0-alpha-4
>
>
> VariableScopeVisitor.findClassMember creates PropertyNode instances for methods (ex: foo.bar will have a property node created if getBar() is implemented). This is done inside the MethodNode for loop circa line 165.
> The nodes created by this visitor lack a declaring class setting as well as having an improper type. Without these values, type inferencing is more difficult for anyone that processes the AST. These are reasonable simple to remedy:
> {code}
> private Variable findClassMember(ClassNode cn, String name) {
> if (cn == null) return null;
> if (cn.isScript()) {
> return new DynamicVariable(name, false);
> }
> for (FieldNode fn : cn.getFields()) {
> if (fn.getName().equals(name)) return fn;
> }
> for (MethodNode mn : cn.getMethods()) {
> String pName = getPropertyName(mn);
> // GRECLIPSE edit
> //if (pName != null && pName.equals(name))
> // return new PropertyNode(pName, mn.getModifiers(), ClassHelper.OBJECT_TYPE, cn, null, null, null);
> if (pName != null && pName.equals(name)) {
> PropertyNode property = new PropertyNode(pName, mn.getModifiers(), getPropertyType(mn), cn, null, null, null);
> property.getField().setDeclaringClass(cn);
> property.setDeclaringClass(cn);
> return property;
> }
> // GRECLIPSE end
> }
> ...
> // GRECLIPSE add
> private ClassNode getPropertyType(MethodNode m) {
> if (m.getReturnType() != ClassHelper.VOID_TYPE) {
> return m.getReturnType();
> }
> return m.getParameters()[0].getType();
> }
> // GRECLIPSE end
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)