mgroovy created GROOVY-8490:
-------------------------------

             Summary: Extend @Newify to support a class name pattern parameter
                 Key: GROOVY-8490
                 URL: https://issues.apache.org/jira/browse/GROOVY-8490
             Project: Groovy
          Issue Type: Improvement
          Components: Compiler
            Reporter: mgroovy


* @Newify should be extended to support a classNamePattern parameter
* All class names inside e.g. a @Newify annotated class that match the given 
pattern shall support having its ctor called without the new keyword ("Python 
style")
* Example:
{code}
@Newify(classNamePattern=/[A-Z].*/)
class Foo {
  // Any class whose name starts with an uppercase letter
  // can have its ctors called without new keyword inside Foo
  
  String s
  Integer x
  File f
  
  Foo(String s, File f, Integer x) { 
    this.s = s
    this.f = f
    this.x = x
  }
  
  void createFoo(File base) {
    // Java style
    new Foo(new String('abc'), new File(base,'log'), new Integer(123))
    // new Groovy style
    Foo(String('abc'), File(base,'log'), Integer(123))
  }
} 
{code}
* The classNamePattern parameter:
## Is 100% backwards compatible (same as the existing value parameter)
## Would allow e.g. @Newify(classNamePattern=/[A-Z].*/) to be auto-applied to 
all classes in a project (same as e.g. [#GROOVY-8300])
*** In practice that would typically cover 99.9...% of all classes, since most 
projects follow the Java convention of classes being the only callable entities 
to start with an uppercase letter
*** The existing value parameter cannot be used that way on a global level, 
since it is not practical to explicitly list all project classes
## Compile time performance wise classNamePattern=/[A-Z].*/ avoids having to 
check any (method/field/variable)() call whether it is a class ctor call if it 
is lowercase (i.e. again typically in 99.9...% of cases), i.e. the approach is 
fast



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to