Skip to content

java.lang.IllegalArgumentException: Cannot edit synthetic AST nodes with specific record constructor #3404

Closed

Description

@janedbal

Following record definition causes failure:

public record MyRequest(DateRange dateRange)
{

    public MyRequest(final String startDate)
    {
        this(new DateRange(startDate));
    }

    public record DateRange(String startDate) {}

}

Callstack:

error-prone version: 2.15.0
     BugPattern: UngroupedOverloads
     Stack Trace:
     java.lang.IllegalArgumentException: Cannot edit synthetic AST nodes
  	at com.google.errorprone.fixes.SuggestedFix$Builder.checkNotSyntheticConstructor(SuggestedFix.java:357)
  	at com.google.errorprone.fixes.SuggestedFix$Builder.replace(SuggestedFix.java:206)
  	at com.google.errorprone.bugpatterns.UngroupedOverloads.checkOverloads(UngroupedOverloads.java:154)
  	at com.google.errorprone.bugpatterns.UngroupedOverloads.lambda$matchClass$0(UngroupedOverloads.java:106)
  	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
  	at com.google.common.collect.CollectSpliterators$1.lambda$forEachRemaining$1(CollectSpliterators.java:127)
  	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
  	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
  	at com.google.common.collect.CollectSpliterators$1.forEachRemaining(CollectSpliterators.java:127)
  	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
  	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
  	at com.google.errorprone.bugpatterns.UngroupedOverloads.matchClass(UngroupedOverloads.java:108)
  	at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:449)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:547)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
  	at jdk.compiler/com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:152)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:560)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:614)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:58)
  	at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
  	at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:152)
  	at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1394)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1341)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:933)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
  	at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:136)
  	at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:182)
  	at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1209)
  	at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:198)
  	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
  	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
  	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
  	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
  	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
  	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
  	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
  	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
  	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
  	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
  	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
  	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
  	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
  	at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
  	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
  	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
  	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
  	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
  	at org.codehaus.classworlds.Launcher.main(Launcher.java:47)

Activity

  1. dhoepelman commented on Dec 29, 2022

    @dhoepelman

    A workaround (thanks @gijskant) is to (superfluously) define the canonical constructor:

    public record MyRequest(DateRange dateRange)
    {
        // Explicitly define constructor to work around https://github.com/google/error-prone/issues/3404
        public MyRequest(DateRange dateRange) {
          this.dateRange = dateRange;
        }
    
        public MyRequest(final String startDate) {
            this(new DateRange(startDate));
        }
    }
  2. added a commit that references this issue on Dec 29, 2022
    324af0b
  3. Stephan202 commented on Dec 29, 2022

    @Stephan202
    Contributor

    I filed PR #3632, which aims to address this issue. Reviews welcome :)

  4. added a commit that references this issue on Dec 31, 2022
    897aa79
  5. added 3 commits that reference this issue on Dec 31, 2022
    db35b6f
    65fc697
    4fa8720
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions