scalameta / metals

Scala language server with rich IDE features 🚀
https://scalameta.org/metals/
Apache License 2.0
2.08k stars 330 forks source link

Presentation compiler crash for completions on complex types #5756

Closed kubukoz closed 11 months ago

kubukoz commented 11 months ago

Describe the bug

I suppose this could be a Scala bug more than a Metals bug, but reporting here as this is the first I'm seeing of it:

  1. Clone https://github.com/kubukoz/demos/tree/metals-issue-smithy4s-completions
  2. Import into Metals
  3. Update Demo.scala to
    
    package hello

import smithy4s.http4s.SimpleRestJsonBuilder import org.http4s.client.Client import cats.effect.IO import hello.WeatherService

object Demo { val b = SimpleRestJsonBuilder(WeatherServiceGen).client(??? : Client[IO])

b.@@ }

4. Ask for completions on `@@`
5. See no completions
6. See SEVERE log in `.metals/metals.log`:

Oct 17, 2023 12:37:26 AM scala.meta.internal.pc.CompilerAccess retryWithCleanCompiler INFO: compiler crashed due to an error in the Scala compiler, retrying with new compiler instance. Oct 17, 2023 12:37:26 AM scala.meta.internal.pc.CompilerAccess handleError SEVERE: A severe compiler error occurred, full details of the error can be found in the error report /.metals/.reports/metals-full/2023-10-17/r_compiler-error_00-37-26-271


<details>
<summary>Report file</summary>

scala.reflect.internal.FatalError: ?PrettyType? while compiling: file:///src/main/scala/hello/Demo.scala during phase: globalPhase=, enteringPhase=parser library version: version 2.13.12 compiler version: version 2.13.12 reconstructed args: -classpath /target/scala-2.13/resource_managed/main:/.bloop/root/bloop-bsp-clients-classes/classes-Metals-RT4ITcamTCu7pN04CWjBog==:/Library/Caches/bloop/semanticdb/com.sourcegraph.semanticdb-javac.0.9.5/semanticdb-javac-0.9.5.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/disneystreaming/smithy4s/smithy4s-core_2.13/0.18.2/smithy4s-core_2.13-0.18.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/disneystreaming/smithy4s/smithy4s-http4s_2.13/0.18.2/smithy4s-http4s_2.13-0.18.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-ember-server_2.13/0.23.23/http4s-ember-server_2.13-0.23.23.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.13/2.11.0/scala-collection-compat_2.13-2.11.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/disneystreaming/smithy4s/smithy4s-http4s-kernel_2.13/0.18.2/smithy4s-http4s-kernel_2.13-0.18.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/disneystreaming/smithy4s/smithy4s-json_2.13/0.18.2/smithy4s-json_2.13-0.18.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/disneystreaming/smithy4s/smithy4s-fs2_2.13/0.18.2/smithy4s-fs2_2.13-0.18.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-core_2.13/0.23.23/http4s-core_2.13-0.23.23.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-dsl_2.13/0.23.23/http4s-dsl_2.13-0.23.23.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-client_2.13/0.23.23/http4s-client_2.13-0.23.23.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-ember-core_2.13/0.23.23/http4s-ember-core_2.13-0.23.23.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-server_2.13/0.23.23/http4s-server_2.13-0.23.23.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/log4cats-slf4j_2.13/2.6.0/log4cats-slf4j_2.13-2.6.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/disneystreaming/smithy4s/smithy4s-cats_2.13/0.18.2/smithy4s-cats_2.13-0.18.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.13/2.23.5/jsoniter-scala-core_2.13-2.23.5.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/co/fs2/fs2-core_2.13/3.9.2/fs2-core_2.13-3.9.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/case-insensitive_2.13/1.4.0/case-insensitive_2.13-1.4.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.13/2.10.0/cats-core_2.13-2.10.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-effect-std_2.13/3.5.1/cats-effect-std_2.13-3.5.1.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-parse_2.13/0.3.10/cats-parse_2.13-0.3.10.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/http4s/http4s-crypto_2.13/0.2.4/http4s-crypto_2.13-0.2.4.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/co/fs2/fs2-io_2.13/3.7.0/fs2-io_2.13-3.7.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/comcast/ip4s-core_2.13/3.3.0/ip4s-core_2.13-3.3.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/literally_2.13/1.1.0/literally_2.13-1.1.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scodec/scodec-bits_2.13/1.1.37/scodec-bits_2.13-1.1.37.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/vault_2.13/3.5.0/vault_2.13-3.5.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/log4s/log4s_2.13/1.10.0/log4s_2.13-1.10.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/log4cats-core_2.13/2.6.0/log4cats-core_2.13-2.6.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/twitter/hpack/1.0.2/hpack-1.0.2.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-effect_2.13/3.5.1/cats-effect_2.13-3.5.1.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.13/2.10.0/cats-kernel_2.13-2.10.0.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-effect-kernel_2.13/3.5.1/cats-effect-kernel_2.13-3.5.1.jar:/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar -Xplugin-require:semanticdb -Xsource:3.0.0 -Yrangepos -Ymacro-expand:discard -Ycache-plugin-class-loader:last-modified -Ypresentation-any-thread

last tree to typer: Select(This(object Demo), b) tree position: line 12 of file:///src/main/scala/hello/Demo.scala tree tpe: hello.Demo.b.type symbol: value b in object Demo symbol definition: val b: smithy4s.http4s.SimpleRestJsonBuilder.ClientBuilder[[F[, , , , _]]hello.WeatherServiceGen[F],[+A]cats.effect.IO[A]] (a MethodSymbol) symbol package: hello symbol owners: value b -> object Demo call site: in

== Source file context for tree position ==

 9   val b =
10     SimpleRestJsonBuilder(WeatherServiceGen).client(??? : Client[IO])
11 
12   b._CURSOR_
13 }
14 

occurred in the presentation compiler.

action parameters: offset: 242 uri: file:///src/main/scala/hello/Demo.scala text: package hello

import smithy4s.http4s.SimpleRestJsonBuilder import org.http4s.client.Client import cats.effect.IO import hello.WeatherService

object Demo { val b = SimpleRestJsonBuilder(WeatherServiceGen).client(??? : Client[IO])

b.@@ }

error stacktrace: scala.reflect.internal.Reporting.abort(Reporting.scala:70) scala.reflect.internal.Reporting.abort$(Reporting.scala:66) scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:28) scala.reflect.internal.Types.appliedType(Types.scala:4172) scala.reflect.internal.Types.appliedType$(Types.scala:4147) scala.reflect.internal.SymbolTable.appliedType(SymbolTable.scala:28) scala.reflect.internal.tpe.TypeMaps$SubstMap.apply(TypeMaps.scala:773) scala.reflect.internal.Types$PolyType.mapOver(Types.scala:3029) scala.reflect.internal.tpe.TypeMaps$SubstMap.apply(TypeMaps.scala:755) scala.reflect.internal.tpe.TypeMaps$SubstMap.apply(TypeMaps.scala:668) scala.reflect.internal.Types$TypeRef.mapOver(Types.scala:2368) scala.reflect.internal.tpe.TypeMaps$SubstMap.apply(TypeMaps.scala:755) scala.reflect.internal.Types$Type.subst(Types.scala:735) scala.reflect.internal.Types$Type.instantiateTypeParams(Types.scala:481) scala.reflect.internal.Types$TypeRef.seenFromOwnerInstantiated$1(Types.scala:2487) scala.reflect.internal.Types$TypeRef.relativize(Types.scala:2491) scala.reflect.internal.Types$AliasTypeRef.betaReduce(Types.scala:2287) scala.reflect.internal.Types$AliasTypeRef.betaReduce$(Types.scala:2287) scala.reflect.internal.Types$AliasArgsTypeRef.betaReduce(Types.scala:2727) scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2231) scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2231) scala.reflect.internal.Types$AliasArgsTypeRef.dealias(Types.scala:2727) scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2231) scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2231) scala.reflect.internal.Types$AliasArgsTypeRef.dealias(Types.scala:2727) scala.reflect.internal.Types$TypeRef.customToString(Types.scala:2699) scala.reflect.internal.Types$TypeRef.safeToString(Types.scala:2704) scala.reflect.internal.tpe.TypeToStrings.typeToString(TypeToStrings.scala:55) scala.reflect.internal.tpe.TypeToStrings.typeToString$(TypeToStrings.scala:34) scala.reflect.internal.SymbolTable.typeToString(SymbolTable.scala:28) scala.reflect.internal.Types$Type.toString(Types.scala:938) java.base/java.lang.String.valueOf(String.java:4220) java.base/java.lang.StringBuilder.append(StringBuilder.java:173) scala.collection.IterableOnceOps.addString(IterableOnce.scala:1249) scala.collection.IterableOnceOps.addString$(IterableOnce.scala:1241) scala.collection.AbstractIterable.addString(Iterable.scala:933) scala.collection.IterableOnceOps.mkString(IterableOnce.scala:1191) scala.collection.IterableOnceOps.mkString$(IterableOnce.scala:1189) scala.reflect.internal.Types$TypeRef.argsString(Types.scala:2638) scala.reflect.internal.Types$TypeRef.safeToString(Types.scala:2706) scala.reflect.internal.tpe.TypeToStrings.typeToString(TypeToStrings.scala:55) scala.reflect.internal.tpe.TypeToStrings.typeToString$(TypeToStrings.scala:34) scala.reflect.internal.SymbolTable.typeToString(SymbolTable.scala:28) scala.reflect.internal.Types$Type.toString(Types.scala:938) scala.reflect.internal.Types$Type.toLongString(Types.scala:948) scala.meta.internal.pc.Signatures$SignaturePrinter.printType(Signatures.scala:299) scala.meta.internal.pc.Signatures$SignaturePrinter.(Signatures.scala:291) scala.meta.internal.pc.completions.Completions.infoString(Completions.scala:262) scala.meta.internal.pc.completions.Completions.infoString$(Completions.scala:259) scala.meta.internal.pc.MetalsGlobal.infoString(MetalsGlobal.scala:33) scala.meta.internal.pc.completions.Completions.detailString(Completions.scala:295) scala.meta.internal.pc.completions.Completions.detailString$(Completions.scala:289) scala.meta.internal.pc.MetalsGlobal.detailString(MetalsGlobal.scala:33) scala.meta.internal.pc.CompletionProvider.$anonfun$completions$1(CompletionProvider.scala:83) scala.collection.Iterator$$anon$9.next(Iterator.scala:584) scala.collection.immutable.List.prependedAll(List.scala:156) scala.collection.immutable.List$.from(List.scala:684) scala.collection.immutable.List$.from(List.scala:681) scala.collection.SeqFactory$Delegate.from(Factory.scala:306) scala.collection.immutable.Seq$.from(Seq.scala:42) scala.collection.IterableOnceOps.toSeq(IterableOnce.scala:1326) scala.collection.IterableOnceOps.toSeq$(IterableOnce.scala:1326) scala.collection.AbstractIterator.toSeq(Iterator.scala:1300) scala.meta.internal.pc.CompletionProvider.completions(CompletionProvider.scala:266) scala.meta.internal.pc.ScalaPresentationCompiler.$anonfun$complete$1(ScalaPresentationCompiler.scala:163)



</details>

### Expected behavior

Completions are provided.

### Operating system

macOS

### Editor/Extension

VS Code

### Version of Metals

v1.0.1

### Extra context or search terms

- Related issue: https://github.com/scalameta/metals/issues/5755 (this issue is based on a version of the code of #5755 with an adjustment that actually helps Metals infer the type)
- If you insert the inferred type of `b` (even with Metals's quickfix), everything works. Just not having the explicit type seems to mess up things.
tgodzik commented 11 months ago

Thanks for reporting and taking the time to create a reproduction!