bug
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
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.
When this code is copied into scastie, the compilation just dies.
This is how it looks in my full project:
as you can see, no error message is printed, just the exception is thrown.
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.)