Skip to content
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
Expand Up @@ -63,7 +63,8 @@ class StandaloneMcpService(
private val time: Time = Time.system

private val clientConfig: ClientConfiguration = ClientConfiguration(
MetalsServerConfig.default
MetalsServerConfig.default,
NoopFeatureFlagProvider,
)

private val mcpClient = new ConfiguredLanguageClient(
Expand Down
4 changes: 3 additions & 1 deletion metals-mcp/src/main/scala/scala/meta/metals/McpMain.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import scala.concurrent.ExecutionContext
import scala.concurrent.ExecutionContextExecutorService
import scala.util.control.NonFatal

import scala.meta.internal.infra.NoopFeatureFlagProvider
import scala.meta.internal.metals.BuildInfo
import scala.meta.internal.metals.ClientConfiguration
import scala.meta.internal.metals.MetalsServerConfig
Expand Down Expand Up @@ -329,7 +330,8 @@ object McpMain {
json.addProperty(k, v)
}
}
val clientConfiguration = ClientConfiguration(MetalsServerConfig.default)
val clientConfiguration =
ClientConfiguration(MetalsServerConfig.default, NoopFeatureFlagProvider)
UserConfiguration.fromJson(json, clientConfiguration)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package scala.meta.internal.metals

import scala.meta.infra.FeatureFlagProvider
import scala.meta.internal.infra.NoopFeatureFlagProvider
import scala.meta.internal.metals.Configs.DefinitionIndexStrategy
import scala.meta.internal.metals.Configs.GlobSyntaxConfig
import scala.meta.internal.metals.config.DoctorFormat
import scala.meta.internal.metals.config.StatusBarState
Expand All @@ -19,6 +22,7 @@ import org.eclipse.lsp4j.InitializeParams
final class ClientConfiguration(
val initialConfig: MetalsServerConfig,
initializeParams: Option[InitializeParams],
featureFlags: FeatureFlagProvider,
) {

private val clientCapabilities: Option[ClientCapabilities] =
Expand Down Expand Up @@ -67,6 +71,14 @@ final class ClientConfiguration(
.flatMap(GlobSyntaxConfig.fromString)
.getOrElse(initialConfig.globSyntax)

def definitionIndexStrategy(): DefinitionIndexStrategy =
DefinitionIndexStrategy
.fromConfigOrFeatureFlag(
initializationOptions.definitionIndexStrategy,
featureFlags,
)
.getOrElse(DefinitionIndexStrategy.default)

def renameFileThreshold(): Int =
initializationOptions.renameFileThreshold.getOrElse(
initialConfig.renameFileThreshold
Expand Down Expand Up @@ -238,18 +250,21 @@ final class ClientConfiguration(
}

object ClientConfiguration {
val default: ClientConfiguration = ClientConfiguration(MetalsServerConfig())
val default: ClientConfiguration =
ClientConfiguration(MetalsServerConfig(), NoopFeatureFlagProvider)

def apply(
initialConfig: MetalsServerConfig,
initializeParams: InitializeParams,
featureFlags: FeatureFlagProvider,
): ClientConfiguration = {
new ClientConfiguration(initialConfig, Some(initializeParams))
new ClientConfiguration(initialConfig, Some(initializeParams), featureFlags)
}

def apply(
initialConfig: MetalsServerConfig
initialConfig: MetalsServerConfig,
featureFlags: FeatureFlagProvider,
): ClientConfiguration = {
new ClientConfiguration(initialConfig, None)
new ClientConfiguration(initialConfig, None, featureFlags)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -389,8 +389,7 @@ object Configs {
// which fails on syntax errors. See plans/protopc.md for details.
def default: ProtoOutlineProviderConfig = v1
def fromConfigOrFeatureFlag(
value: Option[String],
featureFlags: FeatureFlagProvider,
value: Option[String]
): Either[String, ProtoOutlineProviderConfig] = {
value match {
case Some(ok @ ("v1" | "v2")) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ case class Indexer(indexProviders: IndexProviders, mbtBuild: () => MbtBuild)(
)
progress.message =
s"indexing ${buildTool.importedBuild.dependencyModules.getItems().size()} dependencies"
if (indexProviders.userConfig.definitionIndexStrategy.isClasspath) {
if (indexProviders.clientConfig.definitionIndexStrategy().isClasspath) {
usedJars ++= indexDependencyModules(
buildTool.importedBuild.dependencyModules,
progress,
Expand Down Expand Up @@ -546,7 +546,9 @@ case class Indexer(indexProviders: IndexProviders, mbtBuild: () => MbtBuild)(
if (!path.exists) {
scribe.warn(s"dependency missing at absolute path: $path")
} else if (path.isJar) {
if (!indexProviders.userConfig.definitionIndexStrategy.isClasspath) {
if (
!indexProviders.clientConfig.definitionIndexStrategy().isClasspath
) {
usedJars += path
if (addSourceJarSymbols(path)) cacheHits += 1
else cacheMisses += 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ import org.eclipse.{lsp4j => l}
* the output, you can enable this to strip them.
* @param doctorVisibilityProvider if the clients implements `metals/doctorVisibilityDidChange`
* @param bspStatusBarProvider if the client supports `metals/status` with "bsp" status type
* @param definitionIndexStrategy whether definitions from dependencies should index classfiles
* or source files.
*/
final case class InitializationOptions(
compilerOptions: CompilerInitializationOptions,
Expand Down Expand Up @@ -82,6 +84,7 @@ final case class InitializationOptions(
doctorVisibilityProvider: Option[Boolean],
bspStatusBarProvider: Option[String],
moduleStatusBarProvider: Option[String],
definitionIndexStrategy: Option[String],
) {
def doctorFormat: Option[DoctorFormat.DoctorFormat] =
doctorProvider.flatMap(DoctorFormat.fromString)
Expand Down Expand Up @@ -128,6 +131,7 @@ object InitializationOptions {
None,
None,
None,
None,
)

def from(
Expand Down Expand Up @@ -188,6 +192,8 @@ object InitializationOptions {
bspStatusBarProvider = jsonObj.getStringOption("bspStatusBarProvider"),
moduleStatusBarProvider =
jsonObj.getStringOption("moduleStatusBarProvider"),
definitionIndexStrategy =
jsonObj.getStringOption("definitionIndexStrategy"),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2397,7 +2397,7 @@ abstract class MetalsLspService(
},
toIndexSource = path => sourceMapper.mappedTo(path).getOrElse(path),
isClasspathDefinitionIndexEnabled = () =>
userConfig.definitionIndexStrategy.isClasspath,
clientConfig.definitionIndexStrategy().isClasspath,
mtags = () => mtags,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import scala.meta.internal.infra.NoopFeatureFlagProvider
import scala.meta.internal.metals.Configs.AdditionalPcChecksConfig
import scala.meta.internal.metals.Configs.BatchSemanticdbConfig
import scala.meta.internal.metals.Configs.CompilerProgressConfig
import scala.meta.internal.metals.Configs.DefinitionIndexStrategy
import scala.meta.internal.metals.Configs.DefinitionProviderConfig
import scala.meta.internal.metals.Configs.FallbackClasspathConfig
import scala.meta.internal.metals.Configs.FallbackSourcepathConfig
Expand Down Expand Up @@ -99,8 +98,6 @@ case class UserConfiguration(
WorkspaceSymbolProviderConfig.default,
definitionProviders: DefinitionProviderConfig =
DefinitionProviderConfig.default,
definitionIndexStrategy: DefinitionIndexStrategy =
DefinitionIndexStrategy.default,
protoOutlineProvider: ProtoOutlineProviderConfig =
ProtoOutlineProviderConfig.default,
javaSymbolLoader: JavaSymbolLoaderConfig = JavaSymbolLoaderConfig.default,
Expand Down Expand Up @@ -275,12 +272,6 @@ case class UserConfiguration(
definitionProviders.values.asJava,
)
),
Some(
(
"definitionIndexStrategy",
definitionIndexStrategy.value,
)
),
Some(
(
"protoOutlineProvider",
Expand Down Expand Up @@ -1358,14 +1349,6 @@ object UserConfiguration {
featureFlags,
),
).getOrElse(WorkspaceSymbolProviderConfig.default)
val definitionIndexStrategy = getParsedKey(
"definition-index-strategy",
value =>
DefinitionIndexStrategy.fromConfigOrFeatureFlag(
value,
featureFlags,
),
).getOrElse(DefinitionIndexStrategy.default)
val definitionProviders = getParsedArrayKey(
"definition-providers",
values =>
Expand All @@ -1378,8 +1361,7 @@ object UserConfiguration {
"proto-outline-provider",
value =>
ProtoOutlineProviderConfig.fromConfigOrFeatureFlag(
value,
featureFlags,
value
),
).getOrElse(ProtoOutlineProviderConfig.default)
val javaSymbolLoader = getParsedKey(
Expand Down Expand Up @@ -1521,7 +1503,6 @@ object UserConfiguration {
useSourcePath,
workspaceSymbolProvider,
definitionProviders,
definitionIndexStrategy,
protoOutlineProvider,
javaSymbolLoader,
javaTurbineRecompileDelay,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ class WorkspaceLspService(
ClientConfiguration(
serverInputs.initialServerConfig,
initializeParams,
featureFlags,
)

private val languageClient = {
Expand Down
1 change: 0 additions & 1 deletion tests/unit/src/main/scala/tests/BaseLspSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ abstract class BaseLspSuite(
buildChangedAction = BuildChangedAction.prompt,
fallbackScalaVersion = Some(BuildInfo.scalaVersion),
presentationCompilerDiagnostics = false,
definitionIndexStrategy = Configs.DefinitionIndexStrategy.classpath,

// Legacy settings that are enabled for tests only. We should eventually
// update the tests to use the new defaults.
Expand Down
9 changes: 6 additions & 3 deletions tests/unit/src/test/scala/tests/CompletionLspSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package tests
import scala.concurrent.Future

import scala.meta.internal.metals.Configs.DefinitionIndexStrategy
import scala.meta.internal.metals.UserConfiguration
import scala.meta.internal.metals.InitializationOptions
import scala.meta.internal.metals.{BuildInfo => V}

import munit.Location
Expand All @@ -12,8 +12,11 @@ class CompletionLspSuite extends BaseCompletionLspSuite("completion") {

override def munitIgnore: Boolean = isWindows

override def userConfig: UserConfiguration = super.userConfig
.copy(definitionIndexStrategy = DefinitionIndexStrategy.sources)
override def initializationOptions: Option[InitializationOptions] = Some(
InitializationOptions.Default.copy(
definitionIndexStrategy = Some(DefinitionIndexStrategy.sources.value)
)
)

test("basic-213") {
basicTest(V.scala213)
Expand Down
1 change: 0 additions & 1 deletion tests/unit/src/test/scala/tests/ManualSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class ManualSuite extends BaseManualSuite {
workspaceSymbolProvider = WorkspaceSymbolProviderConfig.mbt,
javaSymbolLoader = JavaSymbolLoaderConfig.turbineClasspath,
presentationCompilerDiagnostics = true,
definitionIndexStrategy = DefinitionIndexStrategy.classpath,
fallbackSourcepath = FallbackSourcepathConfig.allSources,
compilerProgress = CompilerProgressConfig.enabled,
referenceProvider = ReferenceProviderConfig.mbt,
Expand Down
8 changes: 6 additions & 2 deletions tests/unit/src/test/scala/tests/UserConfigurationSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import java.util.Properties

import scala.meta.infra.FeatureFlag
import scala.meta.infra.FeatureFlagProvider
import scala.meta.internal.infra.NoopFeatureFlagProvider
import scala.meta.internal.metals.AutoImportBuildKind
import scala.meta.internal.metals.BloopJvmProperties
import scala.meta.internal.metals.ClientConfiguration
Expand Down Expand Up @@ -494,7 +495,6 @@ class UserConfigurationSuite extends BaseSuite {
"mbt",
"protobuf"
],
"definitionIndexStrategy": "classpath",
"protoOutlineProvider": "v1",
"javaSymbolLoader": "turbine-classpath",
"javaTurbineRecompileDelay": "100 milliseconds",
Expand Down Expand Up @@ -533,7 +533,11 @@ class UserConfigurationSuite extends BaseSuite {
Map("testExplorerProvider" -> true).asJava.toJsonObject
)

val clientConfig = ClientConfiguration(MetalsServerConfig.default, params)
val clientConfig = ClientConfiguration(
MetalsServerConfig.default,
params,
NoopFeatureFlagProvider,
)

val roundtrip = UserConfiguration
.fromJson(
Expand Down
Loading