Skip to content

Commit 076f30f

Browse files
committed
update
1 parent dbd82c9 commit 076f30f

File tree

4 files changed

+85
-65
lines changed

4 files changed

+85
-65
lines changed

vscode-lean4/src/extension.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { PreconditionCheckResult, SetupNotificationOptions } from './diagnostics
1010
import { AlwaysEnabledFeatures, Exports, Lean4EnabledFeatures } from './exports'
1111
import { InfoProvider } from './infoview'
1212
import { LeanClient } from './leanclient'
13+
import { setupClient } from './leanclientsetup'
1314
import { LoogleView } from './loogleview'
1415
import { ManualView } from './manualview'
1516
import { MoogleView } from './moogleview'
@@ -177,7 +178,7 @@ async function activateLean4Features(
177178
installer: LeanInstaller,
178179
elanCommandProvider: ElanCommandProvider,
179180
): Promise<Lean4EnabledFeatures> {
180-
const clientProvider = new LeanClientProvider(installer, installer.getOutputChannel())
181+
const clientProvider = new LeanClientProvider(installer, installer.getOutputChannel(), setupClient)
181182
elanCommandProvider.setClientProvider(clientProvider)
182183
context.subscriptions.push(clientProvider)
183184

vscode-lean4/src/leanclient.ts

+14-62
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,26 @@ import {
1414
WorkspaceFolder,
1515
} from 'vscode'
1616
import {
17+
BaseLanguageClient,
1718
DiagnosticSeverity,
1819
DidChangeTextDocumentParams,
1920
DidCloseTextDocumentParams,
2021
DocumentFilter,
2122
InitializeResult,
22-
LanguageClient,
2323
LanguageClientOptions,
2424
PublishDiagnosticsParams,
2525
RevealOutputChannelOn,
26-
ServerOptions,
2726
State,
2827
} from 'vscode-languageclient/node'
2928
import * as ls from 'vscode-languageserver-protocol'
3029

3130
import { LeanFileProgressParams, LeanFileProgressProcessingInfo, ServerStoppedReason } from '@leanprover/infoview-api'
32-
import {
33-
getElaborationDelay,
34-
getFallBackToStringOccurrenceHighlighting,
35-
serverArgs,
36-
serverLoggingEnabled,
37-
serverLoggingPath,
38-
shouldAutofocusOutput,
39-
} from './config'
31+
import { getElaborationDelay, getFallBackToStringOccurrenceHighlighting, shouldAutofocusOutput } from './config'
4032
import { logger } from './utils/logger'
4133
// @ts-ignore
4234
import path from 'path'
4335
import { SemVer } from 'semver'
44-
import { c2pConverter, p2cConverter, patchConverters, setDependencyBuildMode } from './utils/converters'
36+
import { c2pConverter, p2cConverter, setDependencyBuildMode } from './utils/converters'
4537
import { elanInstalledToolchains } from './utils/elan'
4638
import { ExtUri, parseExtUri, toExtUri } from './utils/exturi'
4739
import { leanRunner } from './utils/leanCmdRunner'
@@ -51,15 +43,14 @@ import {
5143
displayNotificationWithOptionalInput,
5244
displayNotificationWithOutput,
5345
} from './utils/notifs'
54-
import { willUseLakeServer } from './utils/projectInfo'
5546

5647
const escapeRegExp = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
5748

5849
export type ServerProgress = Map<ExtUri, LeanFileProgressProcessingInfo[]>
5950

6051
export class LeanClient implements Disposable {
6152
running: boolean
62-
private client: LanguageClient | undefined
53+
private client: BaseLanguageClient | undefined
6354
private outputChannel: OutputChannel
6455
folderUri: ExtUri
6556
private subscriptions: Disposable[] = []
@@ -107,7 +98,15 @@ export class LeanClient implements Disposable {
10798
private serverFailedEmitter = new EventEmitter<string>()
10899
serverFailed = this.serverFailedEmitter.event
109100

110-
constructor(folderUri: ExtUri, outputChannel: OutputChannel) {
101+
constructor(
102+
folderUri: ExtUri,
103+
outputChannel: OutputChannel,
104+
private setupClient: (
105+
toolchainOverride: string | undefined,
106+
clientOptions: LanguageClientOptions,
107+
folderUri: ExtUri,
108+
) => Promise<BaseLanguageClient>,
109+
) {
111110
this.outputChannel = outputChannel
112111
this.folderUri = folderUri
113112
this.subscriptions.push(new Disposable(() => this.staleDepNotifier?.dispose()))
@@ -254,7 +253,7 @@ export class LeanClient implements Disposable {
254253
const toolchainOverride: string | undefined =
255254
toolchainOverrideResult.kind === 'Override' ? toolchainOverrideResult.toolchain : undefined
256255

257-
this.client = await this.setupClient(toolchainOverride)
256+
this.client = await this.setupClient(toolchainOverride, this.obtainClientOptions(), this.folderUri)
258257

259258
let insideRestart = true
260259
try {
@@ -503,43 +502,6 @@ export class LeanClient implements Disposable {
503502
return this.running ? this.client?.initializeResult : undefined
504503
}
505504

506-
private async determineServerOptions(toolchainOverride: string | undefined): Promise<ServerOptions> {
507-
const env = Object.assign({}, process.env)
508-
if (serverLoggingEnabled()) {
509-
env.LEAN_SERVER_LOG_DIR = serverLoggingPath()
510-
}
511-
512-
const [serverExecutable, options] = await this.determineExecutable()
513-
if (toolchainOverride) {
514-
options.unshift('+' + toolchainOverride)
515-
}
516-
517-
const cwd = this.folderUri.scheme === 'file' ? this.folderUri.fsPath : undefined
518-
if (cwd) {
519-
// Add folder name to command-line so that it shows up in `ps aux`.
520-
options.push(cwd)
521-
} else {
522-
options.push('untitled')
523-
}
524-
525-
return {
526-
command: serverExecutable,
527-
args: options.concat(serverArgs()),
528-
options: {
529-
cwd,
530-
env,
531-
},
532-
}
533-
}
534-
535-
private async determineExecutable(): Promise<[string, string[]]> {
536-
if (await willUseLakeServer(this.folderUri)) {
537-
return ['lake', ['serve', '--']]
538-
} else {
539-
return ['lean', ['--server']]
540-
}
541-
}
542-
543505
private obtainClientOptions(): LanguageClientOptions {
544506
const documentSelector: DocumentFilter = {
545507
language: 'lean4',
@@ -668,14 +630,4 @@ export class LeanClient implements Disposable {
668630
},
669631
}
670632
}
671-
672-
private async setupClient(toolchainOverride: string | undefined): Promise<LanguageClient> {
673-
const serverOptions: ServerOptions = await this.determineServerOptions(toolchainOverride)
674-
const clientOptions: LanguageClientOptions = this.obtainClientOptions()
675-
676-
const client = new LanguageClient('lean4', 'Lean 4', serverOptions, clientOptions)
677-
678-
patchConverters(client.protocol2CodeConverter, client.code2ProtocolConverter)
679-
return client
680-
}
681633
}

vscode-lean4/src/leanclientsetup.ts

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient/node'
2+
import { serverArgs, serverLoggingEnabled, serverLoggingPath } from './config'
3+
import { patchConverters } from './utils/converters'
4+
import { ExtUri } from './utils/exturi'
5+
import { willUseLakeServer } from './utils/projectInfo'
6+
7+
async function determineExecutable(folderUri: ExtUri): Promise<[string, string[]]> {
8+
if (await willUseLakeServer(folderUri)) {
9+
return ['lake', ['serve', '--']]
10+
} else {
11+
return ['lean', ['--server']]
12+
}
13+
}
14+
15+
async function determineServerOptions(
16+
toolchainOverride: string | undefined,
17+
folderUri: ExtUri,
18+
): Promise<ServerOptions> {
19+
const env = Object.assign({}, process.env)
20+
if (serverLoggingEnabled()) {
21+
env.LEAN_SERVER_LOG_DIR = serverLoggingPath()
22+
}
23+
24+
const [serverExecutable, options] = await determineExecutable(folderUri)
25+
if (toolchainOverride) {
26+
options.unshift('+' + toolchainOverride)
27+
}
28+
29+
const cwd = folderUri.scheme === 'file' ? folderUri.fsPath : undefined
30+
if (cwd) {
31+
// Add folder name to command-line so that it shows up in `ps aux`.
32+
options.push(cwd)
33+
} else {
34+
options.push('untitled')
35+
}
36+
37+
return {
38+
command: serverExecutable,
39+
args: options.concat(serverArgs()),
40+
options: {
41+
cwd,
42+
env,
43+
},
44+
}
45+
}
46+
47+
export async function setupClient(
48+
toolchainOverride: string | undefined,
49+
clientOptions: LanguageClientOptions,
50+
folderUri: ExtUri,
51+
): Promise<LanguageClient> {
52+
const serverOptions: ServerOptions = await determineServerOptions(toolchainOverride, folderUri)
53+
54+
const client = new LanguageClient('lean4', 'Lean 4', serverOptions, clientOptions)
55+
56+
patchConverters(client.protocol2CodeConverter, client.code2ProtocolConverter)
57+
return client
58+
}

vscode-lean4/src/utils/clientProvider.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { LeanFileProgressProcessingInfo, ServerStoppedReason } from '@leanprover/infoview-api'
22
import path from 'path'
33
import { Disposable, EventEmitter, OutputChannel, commands, workspace } from 'vscode'
4+
import { BaseLanguageClient, LanguageClientOptions } from 'vscode-languageclient/node'
45
import { SetupDiagnostics, checkAll } from '../diagnostics/setupDiagnostics'
56
import { PreconditionCheckResult, SetupNotificationOptions } from '../diagnostics/setupNotifs'
67
import { LeanClient } from '../leanclient'
@@ -58,7 +59,15 @@ export class LeanClientProvider implements Disposable {
5859
private clientStoppedEmitter = new EventEmitter<[LeanClient, boolean, ServerStoppedReason]>()
5960
clientStopped = this.clientStoppedEmitter.event
6061

61-
constructor(installer: LeanInstaller, outputChannel: OutputChannel) {
62+
constructor(
63+
installer: LeanInstaller,
64+
outputChannel: OutputChannel,
65+
private setupClient: (
66+
toolchainOverride: string | undefined,
67+
clientOptions: LanguageClientOptions,
68+
folderUri: ExtUri,
69+
) => Promise<BaseLanguageClient>,
70+
) {
6271
this.outputChannel = outputChannel
6372
this.installer = installer
6473

@@ -269,7 +278,7 @@ export class LeanClientProvider implements Disposable {
269278
}
270279

271280
logger.log('[ClientProvider] Creating LeanClient for ' + folderUri.toString())
272-
client = new LeanClient(folderUri, this.outputChannel)
281+
client = new LeanClient(folderUri, this.outputChannel, this.setupClient)
273282
this.subscriptions.push(client)
274283
this.clients.set(key, client)
275284

0 commit comments

Comments
 (0)