Skip to content

NoSuchElementException when lifting a Type #10127

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

Closed
IndiscriminateCoding opened this issue Oct 30, 2020 · 7 comments · Fixed by #10851
Closed

NoSuchElementException when lifting a Type #10127

IndiscriminateCoding opened this issue Oct 30, 2020 · 7 comments · Fixed by #10851
Assignees
Milestone

Comments

@IndiscriminateCoding
Copy link

Minimized code

import scala.quoted._

object T {
  def impl[A](using t: Type[A])(using ctx: QuoteContext): Expr[Unit] = {
    Expr.summon[t.Underlying]
    '{}
  }
}

Output

[error] ## Exception when compiling 8 sources to /home/<redacted>/target/scala-3.0.0-M1/classes
[error] java.util.NoSuchElementException: None.get
[error] scala.None$.get(Option.scala:627)
[error] scala.None$.get(Option.scala:626)
[error] dotty.tools.dotc.core.StagingContext$.getQuoteTypeTags(StagingContext.scala:48)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transformSpliceType(PCPCheckAndHeal.scala:143)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:130)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$2(Trees.scala:1372)
[error] scala.collection.immutable.List.mapConserve(List.scala:472)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1372)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1275)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:121)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1273)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:121)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1273)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:121)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$2(Trees.scala:1372)
[error] scala.collection.immutable.List.mapConserve(List.scala:472)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1372)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1370)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1287)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:92)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:136)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:100)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.traverse$1(TreeMapWithImplicits.scala:53)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transformStats(TreeMapWithImplicits.scala:60)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:112)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1350)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:105)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$2(Trees.scala:1372)
[error] scala.collection.immutable.List.mapConserve(List.scala:472)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1372)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1370)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1357)
[error] dotty.tools.dotc.ast.TreeMapWithImplicits.transform(TreeMapWithImplicits.scala:105)
[error] dotty.tools.dotc.transform.TreeMapWithStages.mapOverTree$1(TreeMapWithStages.scala:85)
[error] dotty.tools.dotc.transform.TreeMapWithStages.transform(TreeMapWithStages.scala:148)
[error] dotty.tools.dotc.transform.PCPCheckAndHeal.transform(PCPCheckAndHeal.scala:67)
[error] dotty.tools.dotc.transform.Staging$$anon$2.transform(Staging.scala:80)
[error] dotty.tools.dotc.transform.MacroTransform.run(MacroTransform.scala:21)
[error] dotty.tools.dotc.transform.Staging.run(Staging.scala:76)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:296)
[error] scala.collection.immutable.List.map(List.scala:246)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:297)
[error] dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:185)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
[error] dotty.tools.dotc.Run.runPhases$5(Run.scala:195)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:203)
[error] dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:210)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:147)
[error] dotty.tools.dotc.Run.compile(Run.scala:129)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
[error] dotty.tools.dotc.Driver.process(Driver.scala:194)
[error] dotty.tools.dotc.Main.process(Main.scala)
[error] xsbt.CachedCompilerImpl.run(CachedCompilerImpl.java:69)
[error] xsbt.CompilerInterface.run(CompilerInterface.java:41)
[error] sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
[error] sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] java.lang.reflect.Method.invoke(Method.java:498)
[error] sbt.internal.inc.AnalyzingCompiler.invoke(AnalyzingCompiler.scala:330)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:113)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:186)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:241)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:176)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:157)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:232)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:157)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:204)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:571)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:571)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:174)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:172)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:459)
[error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
[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:261)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:414)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:499)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:401)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:166)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:571)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:489)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:419)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2143)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2100)
[error] sbt.internal.io.Retry$.apply(Retry.scala:40)
[error] sbt.internal.io.Retry$.apply(Retry.scala:23)
[error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2096)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] sbt.Execute.work(Execute.scala:291)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] java.lang.Thread.run(Thread.java:748)
[error]            
[error] stack trace is suppressed; run last Compile / compileIncremental for the full output
[error] (Compile / compileIncremental) java.util.NoSuchElementException: None.get
[error] Total time: 1 s, completed Oct 30, 2020 9:25:53 PM

Expectation

@nicolasstucki
Copy link
Contributor

Workaround and ideal code:

import scala.quoted._
object T {
  def impl[A: Type](using ctx: QuoteContext): Expr[Unit] = {
    Expr.summon[A]
    '{}
  }
}

@IndiscriminateCoding
Copy link
Author

@nicolasstucki while ideal, it is not always possible.
My actual use case involves existential type parameter, and the only workaround that I found involves local abstract type and asInstanceOf usage

@nicolasstucki
Copy link
Contributor

Could you provide an example?

@IndiscriminateCoding
Copy link
Author

@nicolasstucki something like that

import scala.quoted._

case class T(t: Type[_])

object T {
  def impl[A](t: T)(using ctx: QuoteContext): Expr[Unit] = {
    Expr.summon[t.t.Underlying]
    '{}
  }
}

@nicolasstucki
Copy link
Contributor

In those cases you can give it a name using a quote pattern

import scala.quoted._

case class T(t: Type[_ <: Any])

object T {
  def impl[A](t: T)(using Quotes): Expr[Unit] = {
    t.t match
      case '[x] =>
        Expr.summon[x]
    '{}
  }
}

nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Dec 18, 2020
The tags may be unavailablle due to the error.
@nicolasstucki nicolasstucki linked a pull request Dec 18, 2020 that will close this issue
@IndiscriminateCoding
Copy link
Author

IndiscriminateCoding commented Dec 19, 2020

@nicolasstucki while trying to adapt my code to your example I hit a "match may not be exhaustive" warning (and it actually doesn't matched at runtime).

import scala.quoted._

enum TT:
  case T(t: Type[_])

object T {
  def impl[A](t: TT)(using Quotes): Expr[Unit] = {
    t match // match may not be exhaustive
      case TT.T('[x]) =>
        Expr.summon[x]
    '{}
  }
}

Is it supposed to work without _ <: Any constraint? My code uses _ <: AnyKind

@IndiscriminateCoding
Copy link
Author

Is it supposed to work without _ <: Any constraint?

I checked and it seems it doesn't :(
Looks like unrelated bug so I've created a separate issue #10864

nicolasstucki added a commit that referenced this issue Jan 4, 2021
Fix #10127: Don't try to get tags after error
@Kordyjan Kordyjan added this to the 3.0.0 milestone Aug 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants