[
https://issues.apache.org/jira/browse/GROOVY-12551?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18135989#comment-18135989
]
ASF GitHub Bot commented on GROOVY-12551:
-----------------------------------------
paulk-asert commented on PR #3080:
URL: https://github.com/apache/groovy/pull/3080#issuecomment-6553570280
Merged. Thanks!
> SC: a named argument of a constructor call gets no line number when the
> constructed class is already compiled
> -------------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-12551
> URL: https://issues.apache.org/jira/browse/GROOVY-12551
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 5.1.3
> Reporter: James Daugherty
> Assignee: Paul King
> Priority: Major
> Fix For: 7.0.0-alpha-1, 5.1.4, 6.0.1
>
>
> With static compilation, a constructor call with named arguments, {{new
> Ctx(name: name)}}, is expanded into a constructor call and one assignment per
> argument. The assignment gets a line number entry only when {{Ctx}} is
> compiled together with the caller. When {{Ctx}} is already compiled, the
> entry is missing, so the same source compiles to a different class file
> depending on what else is compiled, and a debugger cannot stop on that line.
> Groovy 4.0.33 writes the entry in both cases.
> {code:groovy}
> class Ctx {
> String name
> }
> @groovy.transform.CompileStatic
> class Svc {
> static Object use(int i, Ctx ctx) { ctx }
> Object make(String name) {
> use(
> 1,
> new Ctx(name: name) // no line number entry when Ctx is
> already compiled
> )
> }
> }
> {code}
> Reproduced with 5.1.3 and master. A reproducer with a groovyc script and an
> incremental Gradle build:
> https://github.com/jdaugherty/groovy-named-argument-line-numbers
> *Cause*
> {{ConstructorCallTransformer}} builds {{tmp.name = name}} for each named
> argument, transforms it, and only then sets the position of the map entry on
> the result. When {{Ctx}} is compiled, static type checking knows its setter,
> so {{BinaryExpressionTransformer}} rewrites the assignment into a setter call
> built from the untransformed expression, which has no position yet, and no
> line number is written. When {{Ctx}} is in the compilation unit, the
> assignment stays a binary expression, which writes the line of the position
> set afterwards.
> *Proposed fix*
> Write the line of the map entry before generating the code for its
> assignment, whatever expression the transformer returns.
> Found while making incremental builds of a Grails application produce the
> same classes as a full build; see also GROOVY-12550 and GROOVY-12544.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)