bug icon indicating copy to clipboard operation
bug copied to clipboard

java.lang.NullPointerException: Cannot invoke "scala.reflect.internal.Types$Type.params()" because the return value of "scala.reflect.internal.Trees$Tree.tpe()" is null

Open domdorn opened this issue 10 months ago • 2 comments

Reproduction steps

Scala version: 2.13.15; 2.13.16

package com.acme.someproject.somemicroservice.projections.impl

import scala.concurrent.Future

trait Handler[Envelope] {

  def process(envelope: Envelope): Future[Unit]

}

class CopyScenarioEventsProjectionHandler(
                                           managerServiceIn: ServiceA,
                                           assetServiceIn: ServiceB,
                                         ) {

}

trait ServiceA {

}


trait ServiceB {}

final case class OperationInfo(
                                correlationId: String,
                                source: String,
                                scenarioId: String
                              )



case class Tester[Envelope](handler: () => Handler[Envelope])

class CopyScenarioProjection(
  managerService: ServiceA,
  assetService: ServiceB,
)(maxGlobalOffset: Any, maxSeqNr: Any, from: Any) {

  def test(x: Any) = {
    Tester(() =>
      new CopyScenarioEventsProjectionHandler(managerService, assetService)(
        maxGlobalOffset,
        maxSeqNr,
        from
      )(OperationInfo("a", "b", "c")){
        // this breaks it!
        // in this sample, the compiler at least says "CopyScenarioEventsProjectionHandler does not take parameters"
        // in my original code, this message was not printed, just the exception was shown
      }
    )
  }

}

Problem

During a refactor yesterday, I changed the CopyScenarioEventsProjectionHandler but forgot to update the code calling it. The compiler died with the exception

[error] java.lang.NullPointerException: Cannot invoke "scala.reflect.internal.Types$Type.params()" because the return value of "scala.reflect.internal.Trees$Tree.tpe()" is null
[error] scala.tools.nsc.typechecker.Typers$Typer.decompose$1(Typers.scala:2263)
[error] scala.tools.nsc.typechecker.Typers$Typer.decompose$1(Typers.scala:2262)
[error] scala.tools.nsc.typechecker.Typers$Typer.analyzeSuperConstructor(Typers.scala:2278)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedDefDef(Typers.scala:2469)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6250)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:6422)
[error] scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:2133)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1971)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6251)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:6422)
[error] scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:2643)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:6262)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6298)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.doTypedFunction(Typers.scala:6433)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedFunction(Typers.scala:3203)
[error] scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typed1$121(Typers.scala:6226)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedFunction$1(Typers.scala:512)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedOutsidePatternMode$1(Typers.scala:6266)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6298)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:3565)
[error] scala.tools.nsc.typechecker.Typers$Typer.handlePolymorphicCall$1(Typers.scala:3990)
[error] scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:4009)
[error] scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:5285)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:5296)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6288)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.computeType(Typers.scala:6433)
[error] scala.tools.nsc.typechecker.Namers$Namer.assignTypeToTree(Namers.scala:1085)
[error] scala.tools.nsc.typechecker.Namers$Namer.methodSig(Namers.scala:1446)
[error] scala.tools.nsc.typechecker.Namers$Namer.memberSig(Namers.scala:1929)
[error] scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1880)
[error] scala.tools.nsc.typechecker.Namers$Namer$MonoTypeCompleter.completeImpl(Namers.scala:834)
[error] scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete(Namers.scala:2077)
[error] scala.tools.nsc.typechecker.Namers$LockingTypeCompleter.complete$(Namers.scala:2075)
[error] scala.tools.nsc.typechecker.Namers$TypeCompleterBase.complete(Namers.scala:2070)
[error] scala.reflect.internal.Symbols$Symbol.completeInfo(Symbols.scala:1583)
[error] scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1548)
[error] scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1747)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5916)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:6422)
[error] scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:2133)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedClassDef(Typers.scala:1971)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6251)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:6422)
[error] scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3547)
[error] scala.tools.nsc.typechecker.Typers$Typer.typedPackageDef$1(Typers.scala:5925)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:6254)
[error] scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:6344)
[error] scala.tools.nsc.typechecker.Analyzer$typerFactory$TyperPhase.apply(Analyzer.scala:126)
[error] scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:483)
[error] scala.tools.nsc.typechecker.Analyzer$typerFactory$TyperPhase.run(Analyzer.scala:113)
[error] scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1564)
[error] scala.tools.nsc.Global$Run.compileUnits(Global.scala:1548)
[error] scala.tools.nsc.Global$Run.compileSources(Global.scala:1540)
[error] scala.tools.nsc.Global$Run.compileFiles(Global.scala:1653)
[error] scala.tools.xsbt.CachedCompiler0.run(CompilerBridge.scala:176)
[error] scala.tools.xsbt.CachedCompiler0.run(CompilerBridge.scala:139)
[error] scala.tools.xsbt.CompilerBridge.run(CompilerBridge.scala:43)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:196)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:252)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:186)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:166)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:241)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:166)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:214)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:542)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:542)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$3(Incremental.scala:178)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$3$adapted(Incremental.scala:176)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:454)
[error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:117)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:265)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:409)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:496)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:396)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:204)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:542)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:496)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:433)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2419)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2369)
[error] sbt.internal.server.BspCompileTask$.$anonfun$compute$1(BspCompileTask.scala:41)
[error] sbt.internal.io.Retry$.apply(Retry.scala:47)
[error] sbt.internal.io.Retry$.apply(Retry.scala:29)
[error] sbt.internal.io.Retry$.apply(Retry.scala:24)
[error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:41)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2367)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:69)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:283)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
[error] sbt.Execute.work(Execute.scala:292)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:283)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:65)
[error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
[error] java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
[error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
[error] java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
[error] java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
[error] java.base/java.lang.Thread.run(Thread.java:1583)

I've deleted everything from my project to create this reproducer. Here now the compiler at least says

.CopyScenarioEventsProjectionHandler does not take parameters
[error]       new CopyScenarioEventsProjectionHandler(managerService, assetService)(
[error]           ^

which helps to solve the problem. However, in my original code base, this message is not shown, just the exception. Also IntelliJ is not recognizing the mistake.

Image

When this code is copied into scastie, the compilation just dies.

domdorn avatar Jan 18 '25 21:01 domdorn

This is how it looks in my full project:

Image as you can see, no error message is printed, just the exception is thrown.

domdorn avatar Jan 18 '25 21:01 domdorn

For fun, I minimized it:

class C1(x1: Any)
class C2(x2: Any) {
  new C1(x2)()() { }
}

At least, I think this is now minimal?

(This is the level of minimization that's typically necessary to provide before a volunteer might choose to tackle the issue.)

SethTisue avatar Feb 04 '25 04:02 SethTisue