Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
Description
- @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:
@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)) } }
- 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. @AutoFinal (
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
Attachments
Issue Links
- is related to
-
GROOVY-8491 @NamingConvention: Supply class/method/field/... name patterns to compiler
- Open