Eric Milles created GROOVY-8250:
-----------------------------------

             Summary: 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


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
(v6.4.14#64029)

Reply via email to