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

LSP unit testing of completions #1519

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

NWYLZW
Copy link
Contributor

@NWYLZW NWYLZW commented Oct 27, 2024

No description provided.

@@ -445,7 +445,11 @@ function TSHost(compilationSettings: CompilerOptions, initialFileNames: string[]
}

function TSService(projectURL = "./") {
const logger = console
const logger = {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we need to make vscode-jsonrpc work properly, we cannot print redundant logs in the output.

@@ -358,7 +358,7 @@ export function logTiming<R, A extends unknown[]>(name: string, fn: (...args: A)
const start = performance.now(),
result = fn(...args),
end = performance.now();
console.log(`${name.padStart(32)}${(end - start).toFixed(2).padStart(8)}ms`)
// console.log(`${name.padStart(32)}${(end - start).toFixed(2).padStart(8)}ms`)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps we can add a parameter or a global logger variable.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I think so. A reasonable approach might be to add an LSP command-line parameter something like --log server.log that redirects all logs to there, and the default behavior remains going to console or connection.console.

Actually, if we can use connection.console always, presumably that can be intercepted? That seems like a cleaner solution.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, having a universal behavior would indeed be better for interception. The problem here is that the required connection cannot be obtained.

This pull request will also address this problem.

@@ -113,6 +115,7 @@ const diagnosticsDelay = 16; // ms delay for primary updated file
const diagnosticsPropagationDelay = 100; // ms delay for other files

connection.onInitialize(async (params: InitializeParams) => {
connection.console.log(`Initializing civet server at ${new Date().toLocaleTimeString()}`);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All logs on the server should use the console on the connection as much as possible.

const baseDir = params.workspaceFolders?.[0]?.uri.toString()
if (!baseDir)
throw new Error("Could not initialize without workspace folders")
if (!params.rootUri) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although rootUri has been deprecated, it is not difficult for us to support it.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this for compatibility with tools other than VSCode (e.g. tester or Vim) that aren't updated to the new interface? Otherwise, I don't see why we'd want to support a deprecated interface.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the future, there may be a demand for Monaco applied in browsers. For example, directly integrating civet-related language services in it. However, the version of Monaco will be relatively outdated. Maintaining compatibility will be very valuable here.

We can build some better online playground. Honestly, I think civet's work on types is very constructive. However, I didn't feel this in civet's playground. I think this is very regrettable.

Also, regarding unit tests, it seems that workspaceFolders are not needed. Here, I think the cost is not high and it can be simply supported.

@edemaine edemaine changed the title Feat/unit test completions LSP unit testing of completions Oct 27, 2024

require := createRequire import.meta.url

__dirname := import.meta.url |> .slice 7 |> dirname
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather use url.fileURLToPath than .slice 7.

@@ -358,7 +358,7 @@ export function logTiming<R, A extends unknown[]>(name: string, fn: (...args: A)
const start = performance.now(),
result = fn(...args),
end = performance.now();
console.log(`${name.padStart(32)}${(end - start).toFixed(2).padStart(8)}ms`)
// console.log(`${name.padStart(32)}${(end - start).toFixed(2).padStart(8)}ms`)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I think so. A reasonable approach might be to add an LSP command-line parameter something like --log server.log that redirects all logs to there, and the default behavior remains going to console or connection.console.

Actually, if we can use connection.console always, presumably that can be intercepted? That seems like a cleaner solution.

const baseDir = params.workspaceFolders?.[0]?.uri.toString()
if (!baseDir)
throw new Error("Could not initialize without workspace folders")
if (!params.rootUri) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this for compatibility with tools other than VSCode (e.g. tester or Vim) that aren't updated to the new interface? Otherwise, I don't see why we'd want to support a deprecated interface.

@@ -288,7 +294,7 @@ connection.onCompletion(async ({ textDocument, position, context: _context }) =>
// Don't map for files that don't have a sourcemap (plain .ts for example)
if (sourcemapLines) {
position = forwardMap(sourcemapLines, position)
console.log('remapped')
// console.log('remapped')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's fine to delete these rather than comment them out. Or log them to connection, possibly gated by a --verbose setting if feeling ambitious.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, what you said is correct. I do want to add a --verbose parameter. The work here is just relatively simple brute-force commenting.

In the past two days, I mainly want to make the unit tests run. In the next work, I will improve what you said and what I am going to do.

@STRd6
Copy link
Contributor

STRd6 commented Oct 27, 2024

Thanks for digging into this, the LSP definitely needs all the help it can get! 👏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants