Open
Description
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.