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

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)