Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
domdorn opened this issue Jan 18, 2025 · 2 comments
Labels
compiler crash fixed in Scala 3 This issue does not exist in the Scala 3 compiler (https://github.com/lampepfl/dotty/) should not compile
Milestone

Comments

@domdorn
Copy link

domdorn commented Jan 18, 2025

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
Copy link
Author

domdorn commented Jan 18, 2025

This is how it looks in my full project:

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

@SethTisue SethTisue added this to the Backlog milestone Feb 4, 2025
@SethTisue SethTisue added the fixed in Scala 3 This issue does not exist in the Scala 3 compiler (https://github.com/lampepfl/dotty/) label Feb 4, 2025
@SethTisue
Copy link
Member

SethTisue commented Feb 4, 2025

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.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler crash fixed in Scala 3 This issue does not exist in the Scala 3 compiler (https://github.com/lampepfl/dotty/) should not compile
Projects
None yet
Development

No branches or pull requests

2 participants