Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-8250

VariableScopeVisitor does not set declaring class on property nodes

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 3.0.0-alpha-4, 2.5.3
    • Component/s: None
    • Labels:
      None

      Description

      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:

          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
      

        Attachments

          Activity

            People

            • Assignee:
              paulk Paul King
              Reporter:
              emilles Eric Milles
            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: