Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-7668

Better error-message for AST transformation when binary compatibility changes

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.4.5
    • 2.4.6
    • None
    • None
    • Grails 3.0.0 to 3.0.9

    Description

      When a dependency changes signature, and this dependency is used in an AST transformation, a compilation error can occur, but the error message is presented to the developer does not give any hint to, where the error was.

      In this case, the Reactor framework used in Grails 3.0.0 changed version (started using generics) to a never version in Grails 3.0.9. This caused the following compilation error:

      General error during class generation: java.lang.reflect.MalformedParameterizedTypeException
      ​
      java.lang.reflect.MalformedParameterizedTypeException
      	at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:58)
      	at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:51)
      	at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:92)
      	at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
      	at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
      	at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
      	at sun.reflect.generics.repository.MethodRepository.getReturnType(MethodRepository.java:68)
      	at java.lang.reflect.Method.getGenericReturnType(Method.java:255)
      	at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:364)
      	at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:265)
      	at org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1004)
      	at org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:999)
      	at org.codehaus.groovy.ast.ClassNode.getSuperClass(ClassNode.java:993)
      	at org.codehaus.groovy.ast.ClassNode.isDerivedFrom(ClassNode.java:936)
      	at org.codehaus.groovy.classgen.asm.InvocationWriter.castToNonPrimitiveIfNecessary(InvocationWriter.java:858)
      	at org.codehaus.groovy.classgen.asm.OperandStack.doConvertAndCast(OperandStack.java:347)
      	at org.codehaus.groovy.classgen.asm.OperandStack.doGroovyCast(OperandStack.java:282)
      	at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:400)
      	at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.eval(BinaryExpressionHelper.java:84)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitBinaryExpression(AsmClassGenerator.java:638)
      	at org.codehaus.groovy.ast.expr.BinaryExpression.visit(BinaryExpression.java:51)
      	at org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:607)
      	at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeExpressionStatement(OptimizingStatementWriter.java:349)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:620)
      	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
      	at org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:84)
      	at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:158)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:566)
      	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
      	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:104)
      	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:430)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:387)
      	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:126)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:507)
      	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1086)
      	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:53)
      	at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:233)
      	at org.codehaus.groovy.control.CompilationUnit$16.call(CompilationUnit.java:813)
      	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1055)
      	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
      	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
      	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
      	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:525)
      	at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:180)
      	at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:53)
      	at org.gradle.api.internal.tasks.compile.daemon.CompilerDaemonServer.execute(CompilerDaemonServer.java:53)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
      	at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
      	at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
      	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
      	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      	at java.lang.Thread.run(Thread.java:745)
      ​
      1 error
      

      If the compilation error was caught in `org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:364)` it would be possible to output what class and what the reason was for the error before re-throwing it.

      Attachments

        Activity

          People

            pascalschumacher Pascal Schumacher
            sbglasius Soeren Glasius
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: