groovy
  1. groovy
  2. GROOVY-3867

Allow methodMissing/propertyMissing to be defined through category

    Details

    • Type: Improvement Improvement
    • Status: Open Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 1.6.5
    • Fix Version/s: None
    • Component/s: groovy-runtime
    • Labels:
      None
    • Number of attachments :
      1

      Description

      When integrating a library defined by a 3rd party into Groovy, it's often convenient to be able to define missing method/property receiver. Since I can't modify the library directly, it would be great if this can be achieved via category.

      In the current MetaClassImpl implementation, category isn't searched for a missing method/property receiver.

      Note that the generic "Object get(String name)" serves as a replacement for propertyMissing, but there's nothing like that for methods. Plus the get method isn't invoked for "foo.someMethod(...)" even though it works for "(foo.someMethod)(...)" due to the difference in the property look up and method invocation handling.

        Activity

        Hide
        Merlyn Albery-Speyer added a comment - - edited

        Attached is a test that fails:

        class MetaClassImplTest extends GroovyTestCase {
            void testExtensionByCategory() {
                assertScript """
                    @Category(String)
                    class StringCategory {
                        def methodMissing(String name, args) {
                            return "methodMissing $name"
                        }
                        
                        def bar() {
                        	return "normal method"
                        }
                    }
                    
                    use(StringCategory) {
                        assert "aString".bar() == "normal method"
                        assert "aString".foo() == "methodMissing foo"
                    }
                """
            }
        }
        
        Show
        Merlyn Albery-Speyer added a comment - - edited Attached is a test that fails: class MetaClassImplTest extends GroovyTestCase { void testExtensionByCategory() { assertScript """ @Category( String ) class StringCategory { def methodMissing( String name, args) { return "methodMissing $name" } def bar() { return "normal method" } } use(StringCategory) { assert "aString" .bar() == "normal method" assert "aString" .foo() == "methodMissing foo" } """ } }
        Hide
        Merlyn Albery-Speyer added a comment -

        Corrected the attached test.

        Show
        Merlyn Albery-Speyer added a comment - Corrected the attached test.
        Hide
        Merlyn Albery-Speyer added a comment -

        Test fails on the second assertion:

            [junit] groovy.lang.MissingMethodException: No signature of method: java.lang.String.foo() is applicable for argument types: () values: []
        
        Show
        Merlyn Albery-Speyer added a comment - Test fails on the second assertion: [junit] groovy.lang.MissingMethodException: No signature of method: java.lang. String .foo() is applicable for argument types: () values: []
        Hide
        Pascal Schumacher added a comment -

        Is this something for Groovy 3?

        Show
        Pascal Schumacher added a comment - Is this something for Groovy 3?

          People

          • Assignee:
            Unassigned
            Reporter:
            Kohsuke Kawaguchi
          • Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated: