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

VariableScopeVisitor does not set declaring class on property nodes

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 3.0.0-alpha-4, 2.5.3
    • None
    • 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

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

            Dates

              Created:
              Updated:
              Resolved: