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

improvement: don't fail on shortType #7148

Merged
merged 2 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package scala.meta.internal.metals

import scala.meta.internal.mtags.CommonMtagsEnrichments._
import scala.meta.internal.pc.CompilerThrowable
import scala.meta.pc.VirtualFileParams

case class PcQueryContext(
params: Option[VirtualFileParams],
additionalReportingData: () => String
)(implicit rc: ReportContext) {
def report(name: String, e: Throwable, additionalInfo: String): Unit = {
val error = CompilerThrowable.trimStackTrace(e)
val report =
Report(
name,
s"""|occurred in the presentation compiler.
|
|$additionalInfo
|
|action parameters:
|${params.map(_.printed()).getOrElse("<NONE>")}
|
|presentation compiler configuration:
|${additionalReportingData()}
|
|""".stripMargin,
error,
path = params.map(_.uri())
)
rc.unsanitized.create(report)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,9 @@ import java.util.logging.Logger
import scala.concurrent.ExecutionContextExecutor
import scala.util.control.NonFatal

import scala.meta.internal.metals.Report
import scala.meta.internal.metals.ReportContext
import scala.meta.internal.mtags.CommonMtagsEnrichments._
import scala.meta.internal.metals.PcQueryContext
import scala.meta.pc.CancelToken
import scala.meta.pc.PresentationCompilerConfig
import scala.meta.pc.VirtualFileParams

/**
* Manages the lifecycle and multi-threaded access to the presentation compiler.
Expand All @@ -28,17 +25,8 @@ abstract class CompilerAccess[Reporter, Compiler](
config: PresentationCompilerConfig,
sh: Option[ScheduledExecutorService],
newCompiler: () => CompilerWrapper[Reporter, Compiler],
shouldResetJobQueue: Boolean,
additionalReportingData: () => String
)(implicit ec: ExecutionContextExecutor, rc: ReportContext) {

def this(
config: PresentationCompilerConfig,
sh: Option[ScheduledExecutorService],
newCompiler: () => CompilerWrapper[Reporter, Compiler],
shouldResetJobQueue: Boolean
)(implicit ec: ExecutionContextExecutor, rc: ReportContext) =
this(config, sh, newCompiler, shouldResetJobQueue, () => "")
shouldResetJobQueue: Boolean
)(implicit ec: ExecutionContextExecutor) {

private val logger: Logger =
Logger.getLogger(classOf[CompilerAccess[_, _]].getName)
Expand Down Expand Up @@ -90,16 +78,18 @@ abstract class CompilerAccess[Reporter, Compiler](
/**
* Asynchronously execute a function on the compiler thread with `Thread.interrupt()` cancellation.
*/
def withInterruptableCompiler[T](params: Option[VirtualFileParams])(
def withInterruptableCompiler[T](
default: T,
token: CancelToken
)(thunk: CompilerWrapper[Reporter, Compiler] => T): CompletableFuture[T] = {
)(
thunk: CompilerWrapper[Reporter, Compiler] => T
)(implicit queryInfo: PcQueryContext): CompletableFuture[T] = {
val isFinished = new AtomicBoolean(false)
var queueThread = Option.empty[Thread]
val result = onCompilerJobQueue(
() => {
queueThread = Some(Thread.currentThread())
try withSharedCompiler(params)(default)(thunk)
try withSharedCompiler(default)(thunk)
finally isFinished.set(true)
},
token
Expand Down Expand Up @@ -133,13 +123,13 @@ abstract class CompilerAccess[Reporter, Compiler](
* Note that the function is still cancellable.
*/
def withNonInterruptableCompiler[T](
params: Option[VirtualFileParams]
)(
default: T,
token: CancelToken
)(thunk: CompilerWrapper[Reporter, Compiler] => T): CompletableFuture[T] = {
)(
thunk: CompilerWrapper[Reporter, Compiler] => T
)(implicit queryInfo: PcQueryContext): CompletableFuture[T] = {
onCompilerJobQueue(
() => withSharedCompiler(params)(default)(thunk),
() => withSharedCompiler(default)(thunk),
token
)
}
Expand All @@ -149,9 +139,11 @@ abstract class CompilerAccess[Reporter, Compiler](
*
* May potentially run in parallel with other requests, use carefully.
*/
def withSharedCompiler[T](params: Option[VirtualFileParams])(
def withSharedCompiler[T](
default: T
)(thunk: CompilerWrapper[Reporter, Compiler] => T): T = {
)(
thunk: CompilerWrapper[Reporter, Compiler] => T
)(implicit queryInfo: PcQueryContext): T = {
try {
thunk(loadCompiler())
} catch {
Expand All @@ -160,14 +152,14 @@ abstract class CompilerAccess[Reporter, Compiler](
case other: Throwable =>
handleSharedCompilerException(other)
.map { message =>
retryWithCleanCompiler(params)(
retryWithCleanCompiler(
thunk,
default,
message
)
}
.getOrElse {
handleError(other, params)
handleError(other)
default
}
}
Expand All @@ -178,12 +170,10 @@ abstract class CompilerAccess[Reporter, Compiler](
protected def ignoreException(t: Throwable): Boolean

private def retryWithCleanCompiler[T](
params: Option[VirtualFileParams]
)(
thunk: CompilerWrapper[Reporter, Compiler] => T,
default: T,
cause: String
): T = {
)(implicit queryInfo: PcQueryContext): T = {
shutdownCurrentCompiler()
logger.log(
Level.INFO,
Expand All @@ -194,41 +184,15 @@ abstract class CompilerAccess[Reporter, Compiler](
case InterruptException() =>
default
case NonFatal(e) =>
handleError(e, params)
handleError(e)
default
}
}

private def handleError(
e: Throwable,
params: Option[VirtualFileParams]
): Unit = {
val error = CompilerThrowable.trimStackTrace(e)
val report =
Report(
"compiler-error",
s"""|occurred in the presentation compiler.
|
|presentation compiler configuration:
|${additionalReportingData()}
|
|action parameters:
|${params.map(_.printed()).getOrElse("<NONE>")}
|""".stripMargin,
error,
path = params.map(_.uri())
)
val pathToReport =
rc.unsanitized.create(report)
pathToReport match {
case Some(path) =>
logger.log(
Level.SEVERE,
s"A severe compiler error occurred, full details of the error can be found in the error report $path"
)
case _ =>
logger.log(Level.SEVERE, error.getMessage, error)
}
e: Throwable
)(implicit queryInfo: PcQueryContext): Unit = {
queryInfo.report("compiler-error", e, "")
shutdownCurrentCompiler()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scala.meta.internal.pc
import scala.collection.mutable

import scala.meta.internal.jdk.CollectionConverters._
import scala.meta.internal.metals.PcQueryContext
import scala.meta.pc.AutoImportsResult
import scala.meta.pc.OffsetParams

Expand All @@ -12,7 +13,7 @@ final class AutoImportsProvider(
val compiler: MetalsGlobal,
name: String,
params: OffsetParams
) {
)(implicit queryInfo: PcQueryContext) {
import compiler._

def autoImports(): List[AutoImportsResult] = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import scala.annotation.tailrec
import scala.collection.mutable

import scala.meta.internal.jdk.CollectionConverters._
import scala.meta.internal.metals.PcQueryContext
import scala.meta.internal.mtags.MtagsEnrichments._
import scala.meta.pc.OffsetParams
import scala.meta.pc.SymbolSearch
Expand All @@ -21,7 +22,7 @@ import org.eclipse.{lsp4j => l}
class CompletionProvider(
val compiler: MetalsGlobal,
params: OffsetParams
) {
)(implicit val queryInfo: PcQueryContext) {
import compiler._

private def cursorName: String = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package scala.meta.internal.pc

import scala.meta.internal.metals.PcQueryContext
import scala.meta.internal.mtags.MtagsEnrichments._
import scala.meta.pc.OffsetParams
import scala.meta.pc.RangeParams
Expand All @@ -10,7 +11,8 @@ final class ExtractMethodProvider(
val compiler: MetalsGlobal,
range: RangeParams,
extractionPos: OffsetParams
) extends ExtractMethodUtils {
)(implicit queryInfo: PcQueryContext)
extends ExtractMethodUtils {
import compiler._
def extractMethod: List[l.TextEdit] = {
val text = range.text()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scala.meta.internal.pc
import scala.reflect.internal.util.Position
import scala.reflect.internal.{Flags => gf}

import scala.meta.internal.metals.PcQueryContext
import scala.meta.internal.metals.Report
import scala.meta.internal.metals.ReportContext
import scala.meta.internal.mtags.MtagsEnrichments._
Expand All @@ -15,9 +16,7 @@ class HoverProvider(
val compiler: MetalsGlobal,
params: OffsetParams,
contentType: ContentType
)(implicit
reportContext: ReportContext
) {
)(implicit reportContext: ReportContext, queryInfo: PcQueryContext) {
import compiler._

def hover(): Option[HoverSignature] = params match {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package scala.meta.internal.pc

import scala.annotation.tailrec

import scala.meta.internal.metals.PcQueryContext
import scala.meta.pc.OffsetParams

import org.eclipse.lsp4j.TextEdit
Expand All @@ -22,7 +23,7 @@ import org.eclipse.lsp4j.TextEdit
final class InferredMethodProvider(
val compiler: MetalsGlobal,
params: OffsetParams
) {
)(implicit queryInfo: PcQueryContext) {
import compiler._
val unit: RichCompilationUnit = addCompilationUnit(
code = params.text(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package scala.meta.internal.pc

import scala.meta._
import scala.meta.internal.metals.PcQueryContext
import scala.meta.internal.mtags.MtagsEnrichments._
import scala.meta.pc.OffsetParams
import scala.meta.tokens.{Token => T}
Expand All @@ -27,7 +28,7 @@ import org.eclipse.{lsp4j => l}
final class InferredTypeProvider(
val compiler: MetalsGlobal,
params: OffsetParams
) {
)(implicit queryInfo: PcQueryContext) {
import compiler._

case class AdjustTypeOpts(
Expand Down
Loading
Loading