metals icon indicating copy to clipboard operation
metals copied to clipboard

Metals Crashes when using class exports in extensions

Open Swoorup opened this issue 3 years ago • 0 comments

Describe the bug

Metals appears to crash with the following stacktrace for the following code. I haven't tried to reproduce in a small case.

class RichInt(i: Int):
  def tee: Int = i

extension (i: Int)
  def richInt = RichInt(i)
  export richInt.*

10.tee
2022.09.07 04:43:22 INFO  time: compiled infrastructure-it in 2.16s
[Error - 4:43:22 AM] Request textDocument/foldingRange failed.
  Message: Internal error.
  Code: -32603 
java.util.concurrent.CompletionException: org.scalameta.invariants.InvariantFailedException: invariant failed:
when verifying stats.forall(((st: scala.meta.Stat) => scala.meta.internal.trees.`package`.XtensionTreesStat(st).isBlockStat.||(scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Stat](st)(scala.meta.Tree.classifiable[scala.meta.Stat]).is[Decl](scala.meta.Decl.ClassifierClass[scala.meta.Stat]))))
found that stats.forall(((st: scala.meta.Stat) => scala.meta.internal.trees.`package`.XtensionTreesStat(st).isBlockStat.||(scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Stat](st)(scala.meta.Tree.classifiable[scala.meta.Stat]).is[Decl](scala.meta.Decl.ClassifierClass[scala.meta.Stat])))) is false
where stats = List(private def apiExtensions = new BinanceApiExtensions[F](api.client, api.config.restBaseUrl, api.rateLimiters), export apiExtensions.*)
	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:332)
	at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:347)
	at java.base/java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:708)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
	at scala.meta.internal.metals.CancelTokens$.$anonfun$future$1(CancelTokens.scala:40)
	at scala.meta.internal.metals.CancelTokens$.$anonfun$future$1$adapted(CancelTokens.scala:38)
	at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:484)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: org.scalameta.invariants.InvariantFailedException: invariant failed:
when verifying stats.forall(((st: scala.meta.Stat) => scala.meta.internal.trees.`package`.XtensionTreesStat(st).isBlockStat.||(scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Stat](st)(scala.meta.Tree.classifiable[scala.meta.Stat]).is[Decl](scala.meta.Decl.ClassifierClass[scala.meta.Stat]))))
found that stats.forall(((st: scala.meta.Stat) => scala.meta.internal.trees.`package`.XtensionTreesStat(st).isBlockStat.||(scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Stat](st)(scala.meta.Tree.classifiable[scala.meta.Stat]).is[Decl](scala.meta.Decl.ClassifierClass[scala.meta.Stat])))) is false
where stats = List(private def apiExtensions = new BinanceApiExtensions[F](api.client, api.config.restBaseUrl, api.rateLimiters), export apiExtensions.*)
	at org.scalameta.invariants.InvariantFailedException$.raise(Exceptions.scala:19)
	at scala.meta.Term$Block$.internal$71(Trees.scala:114)
	at scala.meta.Term$Block$.apply(Trees.scala:112)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$extensionGroupDecl$5(ScalametaParser.scala:3428)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:301)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:342)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$extensionGroupDecl$1(ScalametaParser.scala:3428)
	at scala.meta.internal.parsers.ScalametaParser.autoEndPos(ScalametaParser.scala:344)
	at scala.meta.internal.parsers.ScalametaParser.autoEndPos(ScalametaParser.scala:346)
	at scala.meta.internal.parsers.ScalametaParser.extensionGroupDecl(ScalametaParser.scala:3393)
	at scala.meta.internal.parsers.ScalametaParser.defOrDclOrSecondaryCtor(ScalametaParser.scala:3229)
	at scala.meta.internal.parsers.ScalametaParser.nonLocalDefOrDcl(ScalametaParser.scala:3204)
	at scala.meta.internal.parsers.ScalametaParser$$anonfun$4.applyOrElse(ScalametaParser.scala:4128)
	at scala.meta.internal.parsers.ScalametaParser$$anonfun$4.applyOrElse(ScalametaParser.scala:4112)
	at scala.PartialFunction.$anonfun$runWith$1(PartialFunction.scala:231)
	at scala.PartialFunction.$anonfun$runWith$1$adapted(PartialFunction.scala:230)
	at scala.meta.internal.parsers.ScalametaParser.statSeqBuf(ScalametaParser.scala:4105)
	at scala.meta.internal.parsers.ScalametaParser.bracelessPackageStats$1(ScalametaParser.scala:4305)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$batchSource$12(ScalametaParser.scala:4318)
	at scala.meta.internal.parsers.ScalametaParser.autoEndPos(ScalametaParser.scala:344)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$batchSource$11(ScalametaParser.scala:4318)
	at scala.Option.map(Option.scala:242)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$batchSource$1(ScalametaParser.scala:4318)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:301)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:342)
	at scala.meta.internal.parsers.ScalametaParser.batchSource(ScalametaParser.scala:4275)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$source$1(ScalametaParser.scala:4268)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:301)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:342)
	at scala.meta.internal.parsers.ScalametaParser.source(ScalametaParser.scala:4268)
	at scala.meta.internal.parsers.ScalametaParser.entrypointSource(ScalametaParser.scala:4273)
	at scala.meta.internal.parsers.ScalametaParser.parseSourceImpl(ScalametaParser.scala:132)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$parseSource$1(ScalametaParser.scala:129)
	at scala.meta.internal.parsers.ScalametaParser.parseRuleAfterBOF(ScalametaParser.scala:56)
	at scala.meta.internal.parsers.ScalametaParser.parseRule(ScalametaParser.scala:51)
	at scala.meta.internal.parsers.ScalametaParser.parseSource(ScalametaParser.scala:129)
	at scala.meta.parsers.Parse$.$anonfun$parseSource$1(Parse.scala:29)
	at scala.meta.parsers.Parse$$anon$1.apply(Parse.scala:36)
	at scala.meta.parsers.Api$XtensionParseDialectInput.parse(Api.scala:25)
	at scala.meta.internal.parsing.Trees.$anonfun$parse$2(Trees.scala:129)
	at scala.Option.map(Option.scala:242)
	at scala.meta.internal.parsing.Trees.parse(Trees.scala:122)
	at scala.meta.internal.parsing.Trees.$anonfun$get$1(Trees.scala:34)
	at scala.Option.orElse(Option.scala:477)
	at scala.meta.internal.parsing.Trees.get(Trees.scala:34)
	at scala.meta.internal.parsing.FoldingRangeProvider.$anonfun$getRangedForScala$2(FoldingRangeProvider.scala:33)
	at scala.Option$WithFilter.flatMap(Option.scala:283)
	at scala.meta.internal.parsing.FoldingRangeProvider.getRangedForScala(FoldingRangeProvider.scala:31)
	at scala.meta.internal.metals.MetalsLanguageServer.$anonfun$foldingRange$2(MetalsLanguageServer.scala:1702)
	at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:467)

Expected behavior

Works and compiles fine

Operating system

macOS

Editor/Extension

VS Code

Version of Metals

0.11.8+81-94ced16c-SNAPSHOT

Extra context or search terms

No response

Swoorup avatar Sep 06 '22 19:09 Swoorup