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

MissingPropertyException when referencing a static import in a closure's optional parameters

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 2.4.7
    • Fix Version/s: 2.4.8
    • Component/s: None
    • Labels:
      None

      Description

      A MissingPropertyException is thrown when calling a closure which references a statically imported field in the value of an optional parameter for a closure. Likewise, a MissingMethodException is thrown when referencing a statically imported method in the same manner. This only occurs when calling the method without specifying the optional parameter.

      I have confirmed that this issue does not impact methods with optional parameters.

      The following code illustrates the issue:

      import static java.util.Collections.EMPTY_LIST
      import static java.util.Collections.emptyList
      
      Closure closureWithStaticImport = { List list = EMPTY_LIST -> }
      Closure closureWithoutStaticImport = { List list = Collections.EMPTY_LIST -> }
      
      try {
        // An exception is thrown when the statically imported optional parameter is not specified
        closureWithStaticImport()
      } catch (MissingPropertyException e) {
        assert e.message == 'No such property: EMPTY_LIST for class: staticImportTest'
        e.printStackTrace()
      }
      
      // No exception is thrown when the optional parameter is specified
      closureWithStaticImport(EMPTY_LIST)
      
      // No exception is thrown when the optional parameter is not statically imported
      closureWithoutStaticImport()
      
      
      void methodWithStaticImport(List list = EMPTY_LIST) {}
      
      // No exception is thrown when a method's optional parameter uses a static import
      methodWithStaticImport()
      
      
      Closure closureWithStaticImportMethod = { List list = emptyList() -> }
      
      try {
        // An exception is thrown when the statically imported optional parameter is not specified
        closureWithStaticImportMethod()
      } catch (MissingMethodException e) {
        assert e.message == 'No signature of method: staticImportTest.emptyList() is applicable for argument types: () values: []'
        e.printStackTrace()
      }

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                paulk Paul King
                Reporter:
                mjjustin M. Justin
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: