Changelog for Groovy 6.0.0
Bug
- [GROOVY-10162] - GroovyDoc generates CLASS_NAME.1.html if an enum class has an abstract method
- [GROOVY-10198] - Extending a class via its superclass' metaclass changes method visibility rules
- [GROOVY-10355] - Compiler interpret variable name as class name when in parentheses.
- [GROOVY-10547] - Sql.java namedParamSqlCache map is getting populated despite the cacheNamedQueries flag
- [GROOVY-10702] - STC: no error for multiple instanceof and sparse method call
- [GROOVY-11022] - StackOverflowError when having parameterized function with recursive bounds
- [GROOVY-11202] - Support use of patterns with instanceof in groovydoc
- [GROOVY-11208] - No parse error for interface method with default value
- [GROOVY-11762] - callable property field shadowing
- [GROOVY-11775] - Stateful runtime mixins sometimes do not work properly
- [GROOVY-11779] - Object#dump should consider properties when fields are not accessible
- [GROOVY-11792] - for-in loop variable captured by closure/AIC sees final value, not per-iteration value
- [GROOVY-11807] - MapWithDefault can break type safety of key set
- [GROOVY-11820] - Overwriting a getter method in a supertype via category results in inconsistent property / getter behavior
- [GROOVY-11829] - Properties located from a set(key, value) always use the same method even when the value type is better matched by another *
- [GROOVY-11831] - Compiler crash with TYPE_USE annotation on void method during AST transformation
- [GROOVY-11843] - SC: map-style constructor call optimization
- [GROOVY-11846] - AIC within closure has incorrect enclosing method and outer class
- [GROOVY-11849] - groovydoc: Use of patterns with instanceof is not supported
- [GROOVY-11853] - breaking changes for inner class methodMissing and propertyMissing protocol *
- [GROOVY-11858] - Splitting string inside tap closure throws NullPointerException
- [GROOVY-11859] - JarJarTask: Windows build issue where glob patterns containing * are treated as literal file paths
- [GROOVY-11888] - STC: method resolution fails for UnionTypeClassNode due to premature covariant elimination
- [GROOVY-11889] - STC: instanceof check rejects UnionTypeClassNode members as incompatible types
- [GROOVY-11899] - Static methods in Traits do not compile in Java/Groovy joint compiliation
- [GROOVY-11929] - Generic type information erased for super call
- [GROOVY-11954] - groovydoc: short-name type resolution cache makes doc output order-dependent and non-reproducible
- [GROOVY-11955] - Provide a size guard for flattening of chained method calls
- [GROOVY-11959] - multi-assignment failure for singleton primitives
- [GROOVY-11965] - groovydoc incorrectly includes members declared inside anonymous Java class bodies in the generated documentation of the enclosing class
- [GROOVY-11966] - AnnotationNode.isTargetAllowed introduces concurrent write to shared ListHashMap
- [GROOVY-11967] - VerifyError in @CompileStatic constructor with default-valued list parameter
- [GROOVY-11968] - SC: trait static field access generates invalid bytecode under indy=false (GROOVY-11907 follow-up)
- [GROOVY-11971] - StackOverflowError processing generics for kubernetes-client library (improved fix)
- [GROOVY-11980] - @AutoClone clone() override adds CloneNotSupportedException not declared by superclass
- [GROOVY-11982] - Default methods in interface throw IncompatibleClassChangeError under indy=false
- [GROOVY-11983] - STC: unsound smart-cast in else branch of if (cond && !(x instanceof Y))
- [GROOVY-11985] - Static method override on trait implementer ignored when called via this in trait body
- [GROOVY-11986] - genericGetMethod registration too permissive: matches any get(X) where X is a supertype of String
- [GROOVY-11987] - groovydoc CLI fails with "Unsupported Java Version: false" when --javaVersion omitted
- [GROOVY-11994] - GEP-16: Missing groovy.val.enabled flag
- [GROOVY-11999] - ProxyGeneratorAdapter NPE when proxy interfaces mix bootstrap and user classloaders
- [GROOVY-12000] - STC: instanceof or combined with not
- [GROOVY-12009] - StringGroovyMethods#stripIndent(boolean) doesn't handle non-String cases as advertised *
- [GROOVY-12022] - deprecate IndyStaticTypesMultiTypeDispatcher
- [GROOVY-12024] - Subscript operator for Map has unexpected behavior when key is 'properties'
- [GROOVY-12040] - restore @Builder retention to RUNTIME in 5.0.x
- [GROOVY-12045] - Calling an enclosing-class instance method on a static nested class instance throws IllegalArgumentException instead of MissingMethodException
- [GROOVY-12046] - MissingMethodException reports the metaclass theClass (a supertype) instead of the receiver's runtime class, breaking the GroovyObject.invokeMethod MOP fallback
- [GROOVY-12058] - ClassNodeUtils.getPropNameForAccessor should use JavaBeans decapitalization to match runtime property naming *
- [GROOVY-12059] - groovy-contracts: support nested closures in contract annotations
- [GROOVY-12062] - OptimizingStatementWriter __$stMC slow branch resolves a try-block local as getProperty when the method has a non-empty finally (classic non-indy codegen) - regression in 5.0.x
- [GROOVY-12066] - @Invariant on a static nested class without an explicit constructor fails compilation with "BUG! exception in 'instruction selection' ... statement is null
- [GROOVY-12067] - IntRange.containsWithinBounds delegates to contains, breaking the continuous-bounds contract *
- [GROOVY-12071] - groovy-contracts: ContractClosureWriter strips generics from closure parameters
- [GROOVY-12072] - groovy-contracts: loop invariant doesn't run static import visitor
- [GROOVY-12073] - reject dot-dot segments in grape coordinate validation
- [GROOVY-12074] - decode yaml/toml/csv/markdown input streams as utf-8
- [GROOVY-12079] - groovy-contracts: @Ensures postcondition silently dropped for braceless if return (and under @TailRecursive)
- [GROOVY-12080] - RegexChecker crashes on inline pattern (~/.../) as .matcher() receiver
- [GROOVY-12082] - groovy-contracts: @Ensures postcondition silently dropped for method with empty body
- [GROOVY-12083] - groovy-contracts: only the first @Ensures on a method fires
- [GROOVY-12084] - groovy-contracts: @Synchronized method with @Ensures/@Invariant but no @Requires throws ClassCastException (SynchronizedStatement → BlockStatement)
- [GROOVY-12085] - SourceText slices UTF-16 with code-point AST columns, truncating source for supplementary characters *
- [GROOVY-12089] - Groovy 5 ClassNode.getGetterMethod() can clone a getter with a null exceptions array when @Entity and @Sortable are combined
- [GROOVY-12091] - Regression in Groovy 5: bounded generic trait property setter remains abstract in implementing class
- [GROOVY-12093] - Static method override on trait implementer ignored when called via this in trait body (cont'd)
- [GROOVY-12097] - a[index] = expr evaluates RHS before index, breaking left-to-right evaluation order *
- [GROOVY-12098] - Pre/post increment on array element double-evaluates the receiver
- [GROOVY-12099] - Elvis-assignment on array element evaluates receiver and index twice
- [GROOVY-12101] - return BigInteger for json integers beyond long range
- [GROOVY-12102] - escape namespace URI in XmlNodePrinter.printNamespace
- [GROOVY-12104] - Trait body with T.this.* qualifier produces VerifyError (4.x) / ClassCastException (5.x/6.x) — should be a compile error
- [GROOVY-12105] - Unqualified super.m(...) from a static trait method throws MissingMethodException — should be a compile error or walk the trait chain
- [GROOVY-12106] - STC cannot resolve inherited static trait method from sub-trait body
- [GROOVY-12107] - reject non-hex characters in decodeHex
- [GROOVY-12117] - Resolution of inherited static trait method from sub-trait body is transform-order dependent
- [GROOVY-12119] - JmxBuilder: connector environment map is discarded
- [GROOVY-12125] - deleteDir() should treat symbolic links as leaves
- [GROOVY-12134] - @Delegate regression: fails to skip a final method inherited from a precompiled superclass
- [GROOVY-12139] - Primitive array Varargs Java incompatibility (fix needed also for classic bytecode)
- [GROOVY-12142] - Metaspace memory leak with parallel deployments on Tomcat
- [GROOVY-12144] - AstNodeToScriptAdapter decompiler drops or corrupts several constructs when rendering AST back to source
- [GROOVY-12145] - JUnit 5 migration silently disabled ~195 test methods: base class removed but @Test not added
- [GROOVY-12146] - Regression of GROOVY-11715 - Unordered Annotation members
- [GROOVY-12148] - fix out-of-bounds read on dangling escape in decodeJsonString
- [GROOVY-12149] - Nondeterministic reflection order flows into generated bytecode, breaking reproducible builds
- [GROOVY-12154] - `@CompileStatic` lambda with a primitive-typed parameter targeting a generic functional interface fails at runtime with `LambdaConversionException`
- [GROOVY-12155] - decode process output streams using the native encoding
- [GROOVY-12163] - fix concurrent modification of ExpandoMetaClass mixinClasses
- [GROOVY-12166] - STC: `return field instanceof Subtype` narrows the field's type class-wide, causing `ClassCastException` -- Groovy 5 regression
- [GROOVY-12186] - reject lone low surrogate in StreamingMarkupWriter.write
- [GROOVY-12190] - @TypeChecked switch on enum: unqualified case constants pass type checking but throw MissingPropertyException at runtime
- [GROOVY-12203] - False positive "name clash" for a valid override when a `? super` wildcard uses a type that declares the same type variable name
- [GROOVY-12213] - avoid decoding the request URI in HttpBuilder.appendQuery
- [GROOVY-12219] - Lazy iterators that prefetch remove the wrong element in DefaultGroovyMethods
- [GROOVY-12225] - STC: property access to a record component fails for precompiled records
- [GROOVY-12228] - STC: multiple assignment ignores the declared type of the target variables
- [GROOVY-12229] - STC: cannot call the generated setter of a String property with a GString
- [GROOVY-12230] - STC: String/GString conditional not accepted where String is expected
- [GROOVY-12231] - validate the four hex digits of a json \u escape
- [GROOVY-12232] - `GroovyCastException: Cannot cast object PojoWrapper` when an as coercion is passed directly as an argument to an anonymous inner class constructor
- [GROOVY-12233] - StringEscapeUtils.unescapeJava mis-decodes and silently drops malformed \u escapes
- [GROOVY-12235] - Interface default method without dynamic calls references unemitted call-site helper under indy=false
- [GROOVY-12242] - instanceof pattern variable scope is not aligned with Java flow scoping (JEP 394) *
- [GROOVY-12245] - @AnnotationCollector(processor=…) value that isn't a constant produces GroovyBugError: unexpected NullPointerException
- [GROOVY-12247] - NPE "Cannot invoke MetaMethod.isAbstract() because method is null" on super call to inherited generic method with default parameter
- [GROOVY-12257] - Groovy 4 @Immutable bytecode fails on Groovy 5 because ObjectUtil was removed
- [GROOVY-12280] - AwaitableAdapterRegistry.awaitableCache pins the Groovy class loader via ClassValue associations on platform-class keys
- [GROOVY-12289] - Switch expressions with duplicate case labels compile under @TypeChecked but fail under @CompileStatic
- [GROOVY-12290] - Private field access from another class compiles under @TypeChecked but fails under @CompileStatic
- [GROOVY-12292] - Various combinations of type-checking and static-compilation do not correctly combine *
- [GROOVY-12295] - CsvSlurper: parsing fails with useHeader=false despite documented auto-generated column names
- [GROOVY-12296] - CsvBuilder: toCsv(data, type) emits columns in alphabetical rather than declaration order
- [GROOVY-12301] - STC does not resolve generic return type properly
- [GROOVY-12303] - ClassNodeResolver: NoClassDefFoundError during class-loader lookup aborts resolution
- [GROOVY-12305] - STC vs static compile: type-coercion in ternary expression is not handled properly in static compilation
- [GROOVY-12307] - Indy: MetaClass change during call-site linking can be lost
- [GROOVY-12308] - MetaClassImpl.addMetaBeanProperty (and addNewInstance/StaticMethod) should reject an initialized metaclass like addMetaMethod does
- [GROOVY-12309] - Closure calls with Object[] parameter under static compilation get the wrong argument
- [GROOVY-12320] - ChannelSelect.select() consumes from losing branches; add fair selection policy
- [GROOVY-12355] - STC infers BigDecimal for division of Number or wrapper Double/Float operands
- [GROOVY-12361] - CachedMethod DirectInvoker: trampoline for a hidden declaring class throws NoClassDefFoundError on first invoke
- [GROOVY-12363] - Anonymous inner class declared in a @CompileStatic method: super call fails with MissingMethodException (no MOP bridge generated)
- [GROOVY-12364] - Native image: dynamic call to a @CallerSensitive method (e.g. Logger.getLogger) is fatal under AOT link mode
- [GROOVY-12392] - NativeImageMetadataGenerator references deprecated-for-removal Java9
- [GROOVY-12393] - STC: logical-or guard on a closure or loop parameter infers the variable as void
- [GROOVY-12397] - VerifyError for a pattern variable bound in a later &&/|| operand (JEP 394 flow scoping)
- [GROOVY-12399] - Arrow switch statement without default throws IllegalStateException when no arm matches
- [GROOVY-12404] - GroovyScriptEngine resource loader leaks URLConnections and ignores a custom ResourceConnector
- [GROOVY-12410] - groovysh /! can lose a shell command's output because the output pump threads are never joined
- [GROOVY-12412] - Improve consistency of numerous Range indexing edge cases
- [GROOVY-12413] - TYPE_USE annotations on primitive record components and tuple-constructor parameters are duplicated or misapplied
- [GROOVY-12416] - SecureASTCustomizer: indirect import check does not box primitive receiver types
- [GROOVY-12418] - Static extension methods are never registered on Android (dumpAll method reference)
- [GROOVY-12419] - Reachability metadata omits ImmutableASTTransformation.checkPropNames used by enums and named-argument constructors
- [GROOVY-3782] - groovydoc doesn't understand @inheritDoc
- [GROOVY-5986] - GroovyDoc does not include doc-files
- [GROOVY-6491] - Conflicting module versions in OSGi context
- [GROOVY-6526] - AnnotationNode.isTargetAllowed returns true for any value
- [GROOVY-6581] - Custom propertyMissing/methodMissing for static inner classes
- [GROOVY-6844] - "Break label" instruction broken when combining nested loops with "old-school" labeled code blocks
- [GROOVY-7617] - Label is leaking scope when applied to a statement other than a block statement
- [GROOVY-7685] - Category overrides closure delegate
- [GROOVY-7768] - groovy.sql.Sql callWithAllRows returns blank result when passing params
- [GROOVY-7785] - Stack overflow when using too many chained method calls
- [GROOVY-7971] - @CS flow typing incorrectly casting to map at runtime
- [GROOVY-8025] - Using closures with annotations on Spock classes results in Groovydoc exception
- [GROOVY-8877] - No way to add a top-level Groovydoc comment a Groovy script
- [GROOVY-8976] - Groovydoc interprets /** in string as groovydoc comment
- [GROOVY-9057] - Groovydoc should set exit code on errors
- [GROOVY-9295] - Sql.checkForNamedParams false positives
- [GROOVY-9585] - CompilerConfiguration copy constructor does not copy compilation customizers *
- [GROOVY-9698] - StreamingSAXBuilder repeats xmlns declarations on inner elements
- [GROOVY-9701] - ExtractIndexAndSql does not recognize double-quoted SQL identifiers
- [GROOVY-9805] - Multiple assignment statements seperated by semicolons on a single line within a try catch block can lead to java.lang.VerifyError
- [GROOVY-9992] - Redos in groovy.sql.Sql
Dependency upgrade
- [GROOVY-11732] - Bump gradle to 9.1.0 (build dependency)
- [GROOVY-11759] - Bump jackson to 2.20.0
- [GROOVY-11763] - Bump asciidoctor gradle plugins to 4.0.5 (build dependency)
- [GROOVY-11765] - Bump spotbugs to 4.9.6
- [GROOVY-11766] - Bump checkstyle to 11.0.1 (build dependency)
- [GROOVY-11767] - Bump log4j2 to 2.25.2
- [GROOVY-11783] - Bump jna to 5.18.1
- [GROOVY-11784] - Bump asciidoctorj-pdf to 2.3.20
- [GROOVY-11788] - Bump JUnit to 6.0.3
- [GROOVY-11833] - Bump javaparser to 3.28.0
- [GROOVY-11834] - Bump asciidoctorj-pdf to 2.3.23
- [GROOVY-11835] - Bump cyclonedx-gradle-plugin to 3.0.2
- [GROOVY-11836] - Bump gradle to 9.2.1
- [GROOVY-11847] - Bump jackson to 2.21.0
- [GROOVY-11848] - Bump gradle to 9.3.1
- [GROOVY-11852] - Bump testng to 7.12.0
- [GROOVY-11867] - Bump checkstyle to 12.3.1 (build dependency)
- [GROOVY-11868] - Bump gradle to 9.4.0 (build)
- [GROOVY-11881] - Bump jline to 4.0.7
- [GROOVY-11883] - Bump jackson to 2.21.2
- [GROOVY-11897] - Bump ant version to 1.10.16
- [GROOVY-11917] - Bump ant version to 1.10.17
- [GROOVY-11918] - Bump to latest asciidoctorj versions
- [GROOVY-11948] - Bump jline to 4.0.12
- [GROOVY-11949] - Bump log4j2 to 2.24.4 (test dependency)
- [GROOVY-11960] - Bump org.jboss.bridger:bridger: 1.6.Final → 1.8
- [GROOVY-11961] - Bump org.apache.maven:maven-core: 3.9.14 → 3.9.15
- [GROOVY-11962] - Bump commons-io:commons-io: 2.21.0 → 2.22.0
- [GROOVY-11963] - Bump com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin: 0.53.0 → 0.54.0
- [GROOVY-11969] - Bump junit5 jupiter/platform to 5.14.4/1.14.4
- [GROOVY-11989] - Bump com.github.javaparser:javaparser-core: 3.28.0 → 3.28.1
- [GROOVY-11990] - Bump jackson to 2.21.3
- [GROOVY-11991] - Bump jline to 4.0.14
- [GROOVY-11992] - Bump org.apache.maven.resolver:maven-resolver-supplier-mvn4: 2.0.16 → 2.0.17
- [GROOVY-12001] - Bump jline to 4.1.0
- [GROOVY-12006] - Bump gradle to 9.5.1 (build)
- [GROOVY-12007] - Bump log4j2 version to 2.26.0 (test dependency)
- [GROOVY-12014] - Bump asm to 9.10
- [GROOVY-12047] - Bump asm to 9.10.1
- [GROOVY-12048] - Bump jline to 4.1.3
- [GROOVY-12049] - Bump maven-resolver-supplier-mvn4 to 2.0.18
- [GROOVY-12050] - Bump slf4j to 2.0.18
- [GROOVY-12051] - Bump jackson to 2.21.4
- [GROOVY-12056] - Bump javaparser to 3.28.2
- [GROOVY-12075] - Bump jackson/jackson-databind to 2.20.0
- [GROOVY-12076] - Bump logback to 1.5.34 (test dependency)
- [GROOVY-12077] - Bump JUnit to 6.1.0
- [GROOVY-12086] - Bump jna to 5.19.1
- [GROOVY-12087] - Bump reactor to 3.8.6
- [GROOVY-12088] - Bump com.github.jk1.dependency-license-report.gradle.plugin to 3.1.4
- [GROOVY-12090] - Bump spotbugs to 4.10.2
- [GROOVY-12094] - Bump jline to 4.2.1
- [GROOVY-12110] - Bump commonmark to 0.29.0
- [GROOVY-12114] - Bump logback to 1.5.37 (test dependency)
- [GROOVY-12170] - Bump JUnit to 6.1.2
- [GROOVY-12174] - Bump antlr to 4.13.2.8
- [GROOVY-12175] - Bump jackson to 2.22.1
- [GROOVY-12176] - Bump jline to 4.3.1
- [GROOVY-12177] - Bump ivy to 2.6.0
- [GROOVY-12178] - Bump maven-resolver-supplier-mvn4 to 2.0.20
- [GROOVY-12179] - Bump flatlaf to 3.7.2
- [GROOVY-12180] - Bump antlr to 4.13.2.9
- [GROOVY-12192] - Bump maven-resolver-supplier-mvn4 to 2.0.21
- [GROOVY-12193] - Bump logback to 1.6.1 (test dependency)
- [GROOVY-12194] - Bump log4j2 version to 2.26.1 (test dependency)
- [GROOVY-12195] - Bump spotbugs to 4.10.3 (build dependency)
- [GROOVY-12196] - Bump codenarc to 4.0.0 (build dependency)
- [GROOVY-12197] - Bump jarjar to 1.17.1 (build dependency)
- [GROOVY-12198] - Bump json-unit to 6.0.1 (test dependency)
- [GROOVY-12202] - Bump antlr to 4.13.2.10
- [GROOVY-12210] - Bump antlr to 4.13.2.11
- [GROOVY-12212] - Bump antlr to 4.13.2.12
- [GROOVY-12222] - Bump antlr to 4.13.2.13
- [GROOVY-12241] - Bump antlr to 4.13.2.14
- [GROOVY-12243] - Bump commonmark to 0.30.0
- [GROOVY-12246] - Bump JUnit to 6.1.3
- [GROOVY-12260] - Bump antlr to 4.13.2.15
- [GROOVY-12261] - Bump io.github.ben-manes.versions.gradle.plugin to 0.61.0
- [GROOVY-12262] - Bump logback to 1.6.3 (test dependency)
- [GROOVY-12286] - Bump jackson to 2.22.2
- [GROOVY-12291] - Bump reactor to 3.8.7
- [GROOVY-12298] - Bump maven-resolver-supplier-mvn4 to 2.0.22
- [GROOVY-12299] - Bump plexus-utils to 4.1.0
- [GROOVY-12302] - Bump spotbugs to 4.10.4
- [GROOVY-12321] - Bump antlr to 4.13.2.16
- [GROOVY-12336] - Bump jline to 4.4.1
- [GROOVY-12356] - Bump jline to 4.4.2
- [GROOVY-12367] - Bump slf4j to 2.0.19
- [GROOVY-12377] - Bump ant version to 1.10.18
- [GROOVY-12396] - Bump jline to 4.4.3
- [GROOVY-12421] - Bump jline to 4.4.5
- [GROOVY-12422] - Bump maven-resolver-supplier-mvn4 to 2.0.23
- [GROOVY-12423] - Bump asciidoctorj-pdf to 2.3.27
- [GROOVY-12424] - Bump versions gradle plugin to 0.64.0
Documentation
- [GROOVY-7525] - package.html not present for all packages
Improvement
- [GROOVY-10156] - Unreachable bytecode in switch statement
- [GROOVY-11682] - Support modular external links
- [GROOVY-11790] - java-aware compilation unit: pass along target bytecode configuration
- [GROOVY-11823] - Check whether inserted metaprogramming methods in a static nested class override methods in a superclass and fail, warn, or make it work
- [GROOVY-11838] - Make default annotation targets follow JLS 9.6.4.1 (exclude TYPE_USE and TYPE_PARAMETER)
- [GROOVY-11842] - Invokedynamic first invocation should not have a line with IndyInterface
- [GROOVY-11857] - encapsulate ForStatement without value variable
- [GROOVY-11871] - Support Maven Resolver based version of Grapes *
- [GROOVY-11884] - Close gaps in Groovy annotation validation *
- [GROOVY-11885] - groovy-contacts could support scripts
- [GROOVY-11886] - support JDK platform logging instead of System.err for errors and warnings
- [GROOVY-11890] - groovy-contracts could support "@Decreases"
- [GROOVY-11891] - Groovy could provide DGM/ADM isSorted variants
- [GROOVY-11892] - Enhance the groovy.extension.disable system property mechanism
- [GROOVY-11893] - Standardise hooks for Groovy pretty printing
- [GROOVY-11895] - Allow arguments to be set in groovyConsole
- [GROOVY-11901] - Renovate process handling methods
- [GROOVY-11902] - minor groovy-nio improvements
- [GROOVY-11905] - Optimize non-capturing lambdas
- [GROOVY-11906] - VMPlugin cleanup for Groovy 6
- [GROOVY-11908] - Support parameterized type checking extensions
- [GROOVY-11913] - Bring back SwingBuilder widgets list
- [GROOVY-11915] - GINQ: Add groupby...into with first-class GroupResult type
- [GROOVY-11919] - Provide set operators for GINQ, e.g. union, intersect
- [GROOVY-11920] - Include javax.swing.plaf.nimbus in Nimbus LAF check in groovy-swing
- [GROOVY-11921] - groovy-jmx: remove dead IIOP support, refresh docs
- [GROOVY-11922] - Jakarta EE 11 compatibility for groovy-servlet
- [GROOVY-11925] - Improve consistency of TOML functionality
- [GROOVY-11926] - Improve consistency of YAML functionality
- [GROOVY-11927] - Add toMap() and typed parsing support to XmlParser
- [GROOVY-11928] - Make MetaClassImpl.getProperties() respect @Internal
- [GROOVY-11932] - Allow theme switching light/dark/system in groovyConsole
- [GROOVY-11933] - Mesh GROOVY-11879 (async) and GROOVY-9381 (http build) glue via Flow.Publisher
- [GROOVY-11934] - replace old icons with svg and some additional cosmetics
- [GROOVY-11935] - Set invokedynamic call site target immediately to enable earlier JIT inlining
- [GROOVY-11936] - Add Map-based named-parameter overloads for call/callWithRows/callWithAllRows
- [GROOVY-11937] - Highlight `async`, `await` and `defer` in Groovy console
- [GROOVY-11938] - Support for @snippet in Groovydoc
- [GROOVY-11939] - Consolidate inline-tag processing in SimpleGroovyClassDoc
- [GROOVY-11941] - Groovydoc should support --add-stylesheet as per javadoc
- [GROOVY-11942] - generate class hierarchy pages (overview-tree.html, package-tree.html) in groovydoc
- [GROOVY-11943] - Add javadoc-style disable flags: -noindex, -nodeprecatedlist, -nohelp
- [GROOVY-11944] - implement getTagList() and add description() view for runtime Groovydoc
- [GROOVY-11945] - recognise @apiNote, @implSpec, @implNote block tags in groovydoc
- [GROOVY-11946] - support auto dark mode via prefers-color-scheme (CSS variable refactor) in groovydoc
- [GROOVY-11957] - Add DGM#grepping(Iterator)
- [GROOVY-11958] - Add SGM#findGroups/findAllGroups
- [GROOVY-11964] - Additional multi-assignment forms
- [GROOVY-11974] - stub generator could emit records into stubs when in native records mode
- [GROOVY-11976] - stub generation should better account for the shape that will exist after later transforms run when known
- [GROOVY-11978] - RootLoader returns duplicate resource URLs when the same jar appears on parent and child classpaths
- [GROOVY-11979] - Consolidate XML factory hardening and document secure-by-default parsing
- [GROOVY-11988] - Add support for {@inheritDoc} in external JDK classes
- [GROOVY-11993] - Support serializable method reference
- [GROOVY-11995] - groovyc ant task could support passing through system properties or jvmargs
- [GROOVY-11996] - Provide a groovy.truth.file.exists.enabled system property which when false reverts to Groovy 4 behavior
- [GROOVY-11997] - Add @ForkedJvm JUnit extension to groovy-test-junit6
- [GROOVY-11998] - Better support of intersection types
- [GROOVY-12002] - add MarkdownSlurper support to groovysh
- [GROOVY-12003] - Add /img command to groovysh for inline image and chart display
- [GROOVY-12004] - grape command line tool should accept maven/ivy shorthands
- [GROOVY-12005] - Harden Grape against cache corruption and CDN throttling
- [GROOVY-12010] - Graduate groovy-toml from incubating to stable
- [GROOVY-12011] - groovy-csv: clarify when dates can retain rich types vs when handled as Strings
- [GROOVY-12012] - groovy-yaml: clarify when dates can retain rich types vs when handled as Strings
- [GROOVY-12017] - Tuple equals should follow Groovy's List equals semantics
- [GROOVY-12018] - allow format to be case insensitive for groovysh: /print -s FORMAT
- [GROOVY-12025] - Provide a JavaShell compileAllTo method
- [GROOVY-12028] - Add JDK27 constants
- [GROOVY-12033] - groovy.concurrent.Actor: pre-GA hardening — Stop sentinel, error callback, bounded mailbox, per-actor pool
- [GROOVY-12034] - Apply "fat-free lambda" patterns to Groovy — DGM `*With` family + `curryWith` helper
- [GROOVY-12035] - Avoid emitting unreachable GOTO in if/else bytecode generation
- [GROOVY-12036] - GDK: cache Collectors instances in StreamGroovyMethods and ParallelCollectionExtensions
- [GROOVY-12052] - groovy-contracts @Ensures could support static methods
- [GROOVY-12053] - groovy-contracts loop @Invariants and @Decreases fail under @TypeChecked
- [GROOVY-12055] - Assess toLower/UpperCase calls which should use Locale.ROOT
- [GROOVY-12060] - groovy-contracts could support @Decreases at the method level
- [GROOVY-12061] - Develop a threat model for Groovy
- [GROOVY-12064] - Provide a maximum depth threshold for parsing deeply nested JSON documents
- [GROOVY-12069] - Make MethodHandles available for DGM
- [GROOVY-12070] - Groovy could provide DGM/ADM isSorted variants (int[] and long[] variants)
- [GROOVY-12078] - support old parameter values in @Ensures postconditions (incl. static methods)
- [GROOVY-12081] - RegexChecker doesn't support String.matches(Pattern|String)
- [GROOVY-12092] - Allow a "groovy.indy.callsite.cleaner.inline" flag to turn off the PIC-Cleaner thread
- [GROOVY-12096] - Replace qdox with javaparser
- [GROOVY-12100] - provide Closure variants for AGM primitive each
- [GROOVY-12103] - XML markup builders don't reject PI/comment terminators in all output paths
- [GROOVY-12108] - Provide a more informative error message when GROOVY_HOME is not set correctly
- [GROOVY-12109] - Harden Closure deserialization against owner/delegate reference cycle
- [GROOVY-12111] - expose Trait static members on the generated trait interface
- [GROOVY-12112] - Reject qualified Trait.m() to a @Virtual trait static with a clear compile error
- [GROOVY-12116] - Provide a small, read-only, fluent query API over the Groovy AST
- [GROOVY-12118] - Further harden sql injection protection *
- [GROOVY-12120] - FactorySupport: log a warning when an XML parser security feature cannot be set
- [GROOVY-12122] - Provide a Regex timeout facility
- [GROOVY-12124] - Modernize the TimeCategory date/time DSL: add a java.time flavor and a dequirked java.util.Date flavor
- [GROOVY-12127] - Improve benchmark framework: Runner calibration/Deterministic dispatch metrics/Cold instance-dispatch bench
- [GROOVY-12128] - loop contract checks fire at points that disagree with loop semantics
- [GROOVY-12129] - groovy-contracts: postcondition weaving mishandles implicit returns
- [GROOVY-12130] - groovy-contracts: inline postconditions read the wrong cached constant
- [GROOVY-12131] - OptimizerVisitor: detect constant nodes shared across classes
- [GROOVY-12132] - groovyc: print collected warnings on successful compilation (make -w effective)
- [GROOVY-12133] - Implement findBalancedGroups utility to support Regex Balanced Groups
- [GROOVY-12135] - groovy-contracts: Add a ThrowsIf annotation
- [GROOVY-12136] - groovy-contracts: allow @Requires to opt out of weaving the contract
- [GROOVY-12138] - emit invokedynamic call sites for property writes
- [GROOVY-12140] - box-identity divergence for primitive varargs with classic bytecode
- [GROOVY-12143] - GEP-27: lambda hoisting
- [GROOVY-12147] - Add locale-aware number, currency and percent formatting/parsing to the GDK
- [GROOVY-12150] - Decompiled AST view should show a closure's generated class name
- [GROOVY-12151] - hoist eligible closure bodies to a shared adapter @PackedClosures/flag (GEP-27 S1)
- [GROOVY-12153] - Fix AstNodeToScriptAdapter decompiler rendering fidelity for strings
- [GROOVY-12156] - chooseBestMethod returns candidates in identity-hash order, making static-compilation output path-dependent
- [GROOVY-12157] - Covariant bridge methods are emitted in hash order, not the order they are found
- [GROOVY-12158] - @AutoImplement generates methods in hash order, not the order they are found
- [GROOVY-12159] - Synthetic class-literal fields and accessors are emitted in hash order, not the order the literals were encountered
- [GROOVY-12160] - @AnnotationCollector emits collected annotation members in hash order when the collector is precompiled
- [GROOVY-12161] - Omit identity catch-all for try/catch without finally and slim exception bytecode
- [GROOVY-12162] - Harden and extend bytecode peephole optimization
- [GROOVY-12164] - Closure.call fast path misses closures with typed parameters (~6x slower via full metaclass dispatch)
- [GROOVY-12165] - 2-arg typed/untyped map iteration, guard fall-through at arity 2, ambiguous same-arity overloads, static decline
- [GROOVY-12168] - Improve exception handling consistency for numbers during JSON parsing
- [GROOVY-12169] - Improve syntax error messages and caret positions for missing ')', ']', and '}'
- [GROOVY-12171] - Improve GString syntax error when '$' is not followed by a valid interpolation
- [GROOVY-12173] - Left-factor parser rules to reduce lookahead on hot parse paths
- [GROOVY-12181] - Refactor async runtime and AST helpers introduced by GROOVY-9381
- [GROOVY-12182] - groovy-http-builder: confine requests (and redirects) to the base URI
- [GROOVY-12183] - Improve MarkdownSlurper resilience
- [GROOVY-12185] - Move classic call-site caching into optional groovy-callsite module *
- [GROOVY-12189] - JEP 181: replace bridge methods with nest-based access control (implementation tweak)
- [GROOVY-12191] - Scope indy SwitchPoint invalidation *
- [GROOVY-12199] - Replace ant-jarjar with com.gradleup.shadow for package relocation
- [GROOVY-12204] - Support check-only compilation (stop after a configurable compile phase)
- [GROOVY-12206] - Ingest type-use annotations when reading compiled classes
- [GROOVY-12207] - Consult package-info.class of dependencies during resolution
- [GROOVY-12208] - NullChecker: broaden null-guard recognition
- [GROOVY-12209] - NullChecker: track nullness through ?., ?:, and ternary results
- [GROOVY-12211] - Avoid full bytecode re-parse when completing NestMembers after class generation
- [GROOVY-12214] - STC: method reference should select the functional-interface overload over a Closure overload
- [GROOVY-12223] - Introduce hidden class support
- [GROOVY-12224] - Add a no-arg findingResults(Iterator) DGM method to avoid an NPE
- [GROOVY-12227] - GeneratedDispatcher: avoid runtime class definition so packed closures work in native images
- [GROOVY-12234] - Indy: AOT link mode so dynamic Groovy dispatch works in GraalVM native images
- [GROOVY-12236] - Allow @ASTTest to be disabled via a groovy.asttest.enable system property
- [GROOVY-12238] - SecureASTCustomizer does not check constructors, initializer blocks or field initializers
- [GROOVY-12240] - Initialize argument-less enum constants with a direct constructor call *
- [GROOVY-12244] - SecureASTCustomizer does not check authored code relocated into a synthetic method
- [GROOVY-12250] - NullChecker: narrow arguments of null-validator and assertion methods (requireNonNull, assertNotNull, assertThat(x).isNotNull())
- [GROOVY-12251] - NullChecker: check @NonNull fields are definitely initialized (strict mode)
- [GROOVY-12252] - NullChecker: honour @Nullable type arguments reaching results via generics (get(0), xs[0], head())
- [GROOVY-12254] - Make defer fully contextual: parse as a keyword only inside async closures
- [GROOVY-12255] - Compile switch expressions as first-class AST (no closure desugar) *
- [GROOVY-12256] - Add ABI marker annotation
- [GROOVY-12259] - Make category/bulk call-site invalidation O(live SwitchPoint domains) instead of O(loaded classes)
- [GROOVY-12263] - Invoke cached Closure doCall targets via MethodHandle
- [GROOVY-12264] - Optimize the unrelated-default-method scan during class generation
- [GROOVY-12265] - GrapeMaven: fail resolution on checksum mismatch
- [GROOVY-12266] - Grape: warn on plaintext HTTP resolver roots in @GrabResolver
- [GROOVY-12267] - JMX operation filter cleanup
- [GROOVY-12268] - resolveClass initializes classes named in the stream
- [GROOVY-12269] - improve special character escaping in GroovyScriptEngineFactory #getOutputStatement
- [GROOVY-12270] - remove legacy JMX connector authentication names
- [GROOVY-12271] - align groovydoc Snippet file resolution behavior with javadoc
- [GROOVY-12272] - JsonLexer re-validates the whole prefix per quote
- [GROOVY-12273] - ConfigObject.writeTo breaks its round-trip contract
- [GROOVY-12274] - HttpBuilder: drop default headers on a redirect to another origin
- [GROOVY-12275] - further TagRenderer hardening
- [GROOVY-12276] - further Closure hardening under readResolve
- [GROOVY-12277] - improve groovydoc encoding edge cases
- [GROOVY-12278] - improve attribute name rendering in templates
- [GROOVY-12279] - SecureASTCustomizer: apply import rules to a method pointer's target type
- [GROOVY-12281] - Investigate mitigating class-loader pinning by ClassInfo.globalClassValue under the default ClassValue implementation
- [GROOVY-12283] - SecureASTCustomizer: apply import rules to construction-coercion casts and subscripts
- [GROOVY-12284] - Specialize indy sameClasses guards for arity 1-4
- [GROOVY-12285] - STC: index extension methods by name and skip cloning non-generic parameters
- [GROOVY-12288] - Cache ClassWriter getCommonSuperClass lookups per class
- [GROOVY-12294] - STC: emit consistent category error for all use() overloads
- [GROOVY-12306] - Error tolerance is not applied to type checking errors and has no unlimited setting
- [GROOVY-12311] - Support check-only compilation (stop after CLASS_GENERATION instead of INSTRUCTION_SELECTION but before OUTPUT)
- [GROOVY-12312] - Add a compact, machine-readable diagnostic output format to groovyc
- [GROOVY-12314] - Align field-backed property access across compilation modes *
- [GROOVY-12316] - groovy.antlr4.cache.threshold silently disables pressure-based DFA clearing
- [GROOVY-12318] - bound the parser DFA cache by size
- [GROOVY-12319] - Java compatibility: remaining generic type syntax
- [GROOVY-12322] - Inline the nls parser rule
- [GROOVY-12323] - ChannelSelect: add claimable send offers (output guards)
- [GROOVY-12324] - ChannelSelect: add per-select preconditions so a guard can be masked off without renumbering branches
- [GROOVY-12325] - Speed up CachedMethod.invoke with a generated JIT-constant trampoline
- [GROOVY-12326] - ChannelSelect: guard an offer directly with receive(c).when(cond)
- [GROOVY-12327] - JsonSlurper: bound the cost of parsing a wide JSON object
- [GROOVY-12328] - GROOVY-12328: JsonSlurper: read a long string in linear time on the large-file parser
- [GROOVY-12329] - JsonSlurper: bound the length of a JSON number token *
- [GROOVY-12330] - Improve JsonOutput.prettyPrint for large documents
- [GROOVY-12331] - Improve XmlNodePrinter handling for large documents
- [GROOVY-12333] - findBalancedGroups: bound the cost of deeply nested input
- [GROOVY-12334] - constrain groovysh /slurp auto payload formats
- [GROOVY-12335] - limit umask for groovysh history and session state files
- [GROOVY-12337] - limit umask when using groovy -i
- [GROOVY-12338] - harden StreamingSAXBuilder comment/PI breakout validation *
- [GROOVY-12339] - Additional Closure serialization cycle checks
- [GROOVY-12341] - sync GroovyPosixCommands with the JLine 4.4.1
- [GROOVY-12342] - improve withBatch/addBatch doco re SQL injection
- [GROOVY-12343] - Provide AsyncChannel.after
- [GROOVY-12344] - Replace TemplateServlet backend cache class
- [GROOVY-12346] - Provide a GroovySocketServer constructor variant with an address
- [GROOVY-12347] - Improve escaping for DomToGroovy
- [GROOVY-12348] - Harden JMXBuilder configuration
- [GROOVY-12349] - sync GroovyPosixCommands with upstream changes
- [GROOVY-12350] - Handle ?? escapes in SQL InListExpander
- [GROOVY-12351] - @SafeRegex should handle regexes in nested and anonymous inner classes
- [GROOVY-12352] - improve consistency of JSON date parsing *
- [GROOVY-12353] - Improve remaining common syntax error messages (unclosed literals, unexpected characters, missing punctuation, reserved keywords)
- [GROOVY-12354] - Indy: investigate making the reflective cold tier opt-in (groovy.indy.cold.reflection) — it hides the real caller from loggers and StackWalker
- [GROOVY-12357] - YamlSlurper and TomlSlurper: offer the date handling JsonSlurper has (defaults unchanged)
- [GROOVY-12358] - YamlSlurper: document that YAML aliases and merge keys are not resolved
- [GROOVY-12359] - deleteDir: treat Windows directory junctions as leaves, as symbolic links already are
- [GROOVY-12360] - GroovyDocWriter: keep generated pages inside the destination directory
- [GROOVY-12362] - ReflectionUtils.getCallingClass and StackTraceUtils.sanitize should ignore GraalVM's com.oracle.svm frames
- [GROOVY-12365] - native: Ship Groovy's own reachability metadata in the groovy jar
- [GROOVY-12366] - native: add a native-image.properties file
- [GROOVY-12368] - groovy.ast=xml: give the AST dump the source file's permissions
- [GROOVY-12369] - Harden Grape uninstall
- [GROOVY-12370] - GroovyDocWriter: do not copy a symbolic link out of a resource directory
- [GROOVY-12372] - decodeBase64 rejects malformed padding
- [GROOVY-12373] - GroovyServlet: support opt-in verbose error responses
- [GROOVY-12374] - Launchers: match java classpath semantics — no implicit . when -cp is set *
- [GROOVY-12375] - ShortTypeHandling: castToClass should avoid class init
- [GROOVY-12376] - LookAndFeelHelper: detect non-metal classes rather than fail with an obscure error
- [GROOVY-12378] - @Log4j2: staticLocation option to emit compile-time caller locations via LogBuilder.withLocation
- [GROOVY-12379] - native probe: cover groovy-nio, groovy-xml and groovy-json
- [GROOVY-12380] - native: ship the async runtime's reachability metadata with groovy-concurrent-java for pure-Java users
- [GROOVY-12382] - VMPluginFactory: tolerate a runtime without Runtime.version()
- [GROOVY-12383] - VM plugin: fall back to Java 8 accessibility rules when the module system is absent
- [GROOVY-12384] - Direct invokers: check for Android before touching HiddenClassDefiner
- [GROOVY-12385] - ScopedLocal: ScopedValue detection must not assume Runtime.version()
- [GROOVY-12386] - groovy-json: keep System.Logger out of internal static initialisers
- [GROOVY-12387] - Indy: exception-handler combinator bypassed on ART
- [GROOVY-12388] - DgmConverter: avoid MethodType constants in the adapter initialisers
- [GROOVY-12389] - Java8 plugin: skip type-use annotations when the reflection API lacks AnnotatedType
- [GROOVY-12390] - GStringImpl: constant-value check pulls the compiler's ClassHelper into the runtime
- [GROOVY-12391] - grooid jar: java.beans.Transient is rewritten to a class openbeans never had
- [GROOVY-12394] - groovy-nio: ship WatchEvent$Modifier in the module's reachability metadata for Path introspection
- [GROOVY-12395] - IndyCatchCompat: obtain its handles without a by-name lookup so R8 needs no keep rule
- [GROOVY-12398] - Improve lexer and parser performance
- [GROOVY-12400] - Add an inline Antlr4 parser covering-set with XML AST dumps
- [GROOVY-12401] - Improve remaining parser diagnostics and authored AST source positions
- [GROOVY-12403] - Restore groovysh embedding extension points
- [GROOVY-12405] - No tableswitch/lookupswitch dispatch for switch statements
- [GROOVY-12406] - Duplicate case labels not detected in switch statements
- [GROOVY-12407] - Case label resolution differs between statement and expression switches
- [GROOVY-12408] - Compile implicit-return arrow switches as switch statements
- [GROOVY-4634] - Proper support for @Documented on annotations
- [GROOVY-5359] - static propertyMissing catches inherited static methods
- [GROOVY-5436] - add Sql.inList for collection expansion in SQL IN clauses
- [GROOVY-6016] - GroovyDoc support of @value tag
- [GROOVY-6908] - Groovy Ant task should inherit Ant properties when in "forked" mode
- [GROOVY-7463] - break out of labelled statement
- [GROOVY-7571] - XmlUtil should allow user to specify a character encoding when serializing
- [GROOVY-7633] - Add constructor with Map for SAXOptions to XmlSlurper
- [GROOVY-9192] - Implement optional parser error recovery for Parrot parser
- [GROOVY-9572] - groovydoc: some __$stMC field is inherited from base class
- [GROOVY-9848] - Change map membership (in) from value-truthy to key-based *
New Feature
- [GROOVY-11542] - JEP 467 compatibility (markdown documentation comments)
- [GROOVY-11808] - create a DGM#groupByMany extension method
- [GROOVY-11878] - Allow AST transforms to be applicable in more places, initially loop statements
- [GROOVY-11879] - A very simple DSL over the JDK's HTTP client
- [GROOVY-11887] - Scripting support for JUnit6 conditional execution
- [GROOVY-11894] - Provide a NullChecker for groovy-typecheckers
- [GROOVY-11896] - Support module import declarations
- [GROOVY-11909] - Add a @Modifies annotation to groovy-contracts
- [GROOVY-11910] - Add ModifiesChecker type checking extension to verify @Modifies frame conditions
- [GROOVY-11914] - Add PurityChecker type checking extension
- [GROOVY-11923] - Provide a groovy-csv optional module
- [GROOVY-11924] - Provide a minimal declarative http client for the new http builder module
- [GROOVY-11940] - Provide an optional groovy-markdown module with a slurper
- [GROOVY-11947] - Add timing utility methods (timed, timedNanos) and Timed record to groovy-jdk
- [GROOVY-11950] - Add -preLanguage Groovydoc option to syntax-highlight legacy <pre> blocks
- [GROOVY-11951] - Make DocGDK generation piggy back on new Groovydoc
- [GROOVY-11952] - Integrate GPars with Groovy
- [GROOVY-11953] - Publisher Mesh Logic for async with GPars
- [GROOVY-11970] - Provide support for compound assignment operator overloading (GEP-15)
- [GROOVY-11973] - Allow ASTTransformationCustomizer to support annotations with multiple AST transforms (e.g. @Sealed, @RecordBase) and @AnnotationCollector aliases (e.g. @AutoExternalize) via a new forAnnotation factory method
- [GROOVY-11977] - val type placeholder for final declarations
- [GROOVY-12013] - New optional type checking extension: CombinerChecker to verify associative combiners in injectParallel/sumParallel/Stream.reduce
- [GROOVY-12015] - Provide a nested copyWith capability
- [GROOVY-12016] - New GDK methods: zipWithNext and groupConsecutive
- [GROOVY-12021] - Add DO macro for monadic comprehensions over Optional/Stream/Awaitable and @Monadic types
- [GROOVY-12031] - Provide a DGM#takeIf method
- [GROOVY-12032] - Provide a DGM clamp method
- [GROOVY-12037] - GDK: add toMutableList/toImmutableList/toImmutableSet variants and deprecate toList(Stream) shim
- [GROOVY-12038] - Graduate groovy-contracts from incubating to stable
- [GROOVY-12115] - Reify a receiver's type argument as a Class parameter under @CompileStatic (@ClassTag)
- [GROOVY-12187] - Add SqlInjectionChecker type checker to detect quoted GString interpolation in SQL queries
- [GROOVY-5373] - Sql DataSet fails to work with non-literals in queries (enhancement required)
- [GROOVY-9381] - Add native async/await support
Question
- [GROOVY-11737] - Improve clarity of Groovy main method selection priority
Sub-task
- [GROOVY-11845] - array initializer for annotation default value
- [GROOVY-11866] - array initializer for annotation attribute value
- [GROOVY-12043] - Provide curryWith helpers
- [GROOVY-12044] - CurriedClosure per-element allocation
- [GROOVY-12054] - A preliminary set of "fat-free" DGM methods
- [GROOVY-12215] - Fat-free variants for collectMany, countBy, split, take/dropWhile, groupBy
- [GROOVY-12216] - Fat-free twins for the fold/reduce DGM methods (inject, injectAll)
- [GROOVY-12218] - Complete fat-free (functional-interface) twins for the array (`T[]`) forms of the GROOVY-12054 DGM methods
- [GROOVY-4737] - propertyMissing not called in anonymous or inner classes
- [GROOVY-4862] - propertyMissing / methodMissing called on outer instead of inner class
Task
- [GROOVY-10581] - Prepare for deprecation of security manager (JEP-411) *
- [GROOVY-11898] - provide test for OSGi
- [GROOVY-11911] - Deprecate callsite versions of BooleanClosureWrapper
- [GROOVY-11912] - Remove last remnants of JApplet which is gone in JDK26 *
- [GROOVY-11981] - Document XML secure-by-default breaking changes for 6.0.0 *
- [GROOVY-12008] - Sealed types: graduate from incubating status
- [GROOVY-12026] - Graduate JavaShell from incubating to stable
- [GROOVY-12027] - Align CompilerConfiguration with JDK17 minimum
- [GROOVY-12029] - Graduate Macro and related classes from incubating to stable
- [GROOVY-12030] - Graduate PropertyHandler from incubating to stable
- [GROOVY-12039] - Graduate RegexChecker and FormatStringChecker from incubating to stable
- [GROOVY-12042] - Graduate groovy-ginq from incubating to stable
- [GROOVY-12137] - experimental reflective cold tier for indy dispatch
- [GROOVY-12371] - SQL: bound the statement cache and make it thread-safe
Wish
- [GROOVY-8699] - Somehow reduce or optimize o.g.c.r calls in CompileStatic
- [GROOVY-9308] - [Parrot] support let or val keyword, aka "final var"
* potentially breaking change (read issue for details - even minor differences are sometimes flagged as potentially breaking changes)