-
Notifications
You must be signed in to change notification settings - Fork 763
userpreferences parsing/ls config handing #1729
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
Conversation
What is needed? I would think we would just ask for the setting blocks we are interested in and watch them, from the server side (no extension code needed). |
|
Our The other extension changes include to make configuration happen on initialization |
|
I feel confused. The LSP config spec is exactly the same as asking VS Code for a setting out of JSON. Putting more code in the client is just going to make that same code repeat across editors... |
internal/lsp/server.go
Outdated
| if err != nil { | ||
| return err | ||
| } | ||
| s.session.Configure(userPreferences) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't we also need to register with the client here to be able to actually get config change notifications? Just like we do in WatchFiles.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Re: this + the comment above (link), I didn't fully implement this function because I wanted to figure out what we're going to process in the extension first and I wasn't sure the range of how much info that the client can pass to the server (will it always pass the entire new config upon changes? or only the differences?)
|
|
||
| // currently, the only request that may be sent by the server during a client request is one `config` request | ||
| // !!! remove if `config` is handled in initialization and there are no other server-initiated requests | ||
| if resp.Kind == lsproto.MessageKindRequest { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do think we should move this handling to initialization. Or are going to need to handle other requests as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure what we will need in the future
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you could imagine the fourslash client handling diagnostics refresh requests and potentially even watch requests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we're going to port the fourslash/server tests, then those probably will have to be handled?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR implements user preferences support throughout the codebase to unblock future work, focusing on fourslash test capabilities and inlay hints configuration from VS Code. The implementation adds user preferences handling to the session lifecycle, language service, and LSP server with initial support for parsing inlay hints settings from VS Code client configuration.
- Adds user preferences threading through session, snapshot, and language service layers
- Implements VS Code configuration parsing for inlay hints preferences
- Extends fourslash testing framework to support user preferences configuration
Reviewed Changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| internal/project/snapshot.go | Adds user preferences field and getter method to snapshot |
| internal/project/session.go | Implements user preferences configuration and change tracking in session |
| internal/project/api.go | Updates API calls to include user preferences parameter |
| internal/lsp/server.go | Adds configuration request handling and inlay hints parsing from VS Code |
| internal/ls/types.go | Extends UserPreferences with inlay hints fields and copy methods |
| internal/ls/languageservice.go | Adds user preferences parameter to language service constructor |
| internal/fourslash/fourslash.go | Implements user preferences configuration support for testing |
| internal/fourslash/tests/autoImportCompletion_test.go | Adds test case for user preferences functionality |
| internal/api/api.go | Updates language service instantiation to include user preferences |
…o userpreferences
…o userpreferences
| registerRequestHandler(handlers, lsproto.ShutdownInfo, (*Server).handleShutdown) | ||
| registerNotificationHandler(handlers, lsproto.ExitInfo, (*Server).handleExit) | ||
|
|
||
| registerNotificationHandler(handlers, lsproto.WorkspaceDidChangeConfigurationInfo, (*Server).handleDidChangeWorkspaceConfiguration) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This handler is set up, but I don't think the PR sets up the watch capability yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you planning to do this now, or in the future?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Future
| result, err := s.sendRequest(ctx, lsproto.MethodWorkspaceConfiguration, &lsproto.ConfigurationParams{ | ||
| Items: []*lsproto.ConfigurationItem{ | ||
| { | ||
| Section: ptrTo("typescript"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately there is also javascript and js/ts scopes we might need.
I think we're going to have to make user prefs have both variants and then return one or the other depending on the situation...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not blocking for this PR, but needs to be done eventually.
internal/project/session.go
Outdated
| } | ||
|
|
||
| func (s *Session) UserPreferences() *ls.UserPreferences { | ||
| return s.userPreferences |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be protected by a mutex (you can reuse s.pendingConfigChangesMu, maybe with a rename and change to a RWMutex)
s.compilerOptionsForInferredProjects would be in the same boat except that it’s literally never read 🤔
internal/project/snapshot.go
Outdated
| // It should only be set the value in the next snapshot should be changed. If nil, the | ||
| // value from the previous snapshot will be copied to the new snapshot. | ||
| compilerOptionsForInferredProjects *core.CompilerOptions | ||
| newConfig *ls.UserPreferences |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don’t love the mix of terminology. Can we either standardize everything to use LSP terminology (workspace configuration) or say, once the “workspace configuration” has been filtered and parsed into stuff the language service cares about, we refer to that bit consistently as user preferences?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would prefer the latter, as in "try to resolve settings to a clearer set of shared options and use that".
|
This sort of blocks fixing #1914; would be really good to get some form of this in so we can start improving other stuff in the meantime, I think. |
…o userpreferences
|
Im currently fixing merge conflicts with this, and I should be able to address a lot of the formatting issues immediately after this is in. Before I left I was fixing a server crash that happened with |
| case "format": | ||
| // !!! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this challenging to fill out? This is where we are wanting it next, I believe.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm working on it at the moment, I didn't want to bog this PR down farther
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's not an insignificant add, I'll need to do pretty much the handling in the same places as i did for userpreferences-- pretty much do another version of everything except the actual server/client request, and I would like to get this PR in to finalize the server/client request and the general userPreferences lifecycle handling in snapshot/session at least. It'll be a lot easier to add on other kinds of settings (like format) if I'm not worried about needing to change those things
jakebailey
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tried on my machine, and I see it making the client request and it seems to be okay. Good to get started in any case (but what I'm reading here seems fine)
* Port 'go to type definition' tests (microsoft#1883) * Fix panic in `getTokenAtPosition` for JSDoc type assertions (microsoft#1846) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> Co-authored-by: andrewbranch <[email protected]> Co-authored-by: Andrew Branch <[email protected]> * Don’t look in JSExportAssignment and CommonJSExport for nodes (microsoft#1886) * Fix link in native preview platform packages (microsoft#1838) * fix(1880): No error message for JSDoc type parsing (microsoft#1881) * Add vscode editor issue template (microsoft#1893) Co-authored-by: Ryan Cavanaugh <[email protected]> * Add "Report Issue" button to TSGO status bar commands (microsoft#1889) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: DanielRosenwasser <[email protected]> Co-authored-by: Daniel Rosenwasser <[email protected]> * fix(1898): adjust location handling in find-refs (microsoft#1901) * Fix panic of empty string in type reference directive (microsoft#1908) * Consistently error on full circle of circular import aliases (microsoft#1904) * Fix panic in textDocument/onTypeFormatting when tokenAtPosition is nil (microsoft#1845) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Update submodule (microsoft#1913) * Disable create-cache.yml in forks (microsoft#1912) * Forbid platform specific package uses in agnostic files (microsoft#1911) * Fix JSDoc comment formatting with tab indentation (microsoft#1900) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Clear local baseline dir in hereby test (microsoft#1921) * Unskip passing fourslash test (microsoft#1922) * Support auto-import completion fourslash tests, fix bugs (microsoft#1917) * Fix JSX indentation in JavaScript output (microsoft#1792) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Implement printAllHelp to fix `tsgo --all` producing no output (microsoft#1843) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Bump the github-actions group across 1 directory with 2 updates (microsoft#1909) Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jake Bailey <[email protected]> * Ensure os package is forbidden in lint (microsoft#1924) * Speed up levenshteinWithMax by reusing buffers (microsoft#1823) * Fix incorrect formatting for comments inside multi-line argument lists and method chains (microsoft#1929) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Handle nil end position in getMappedLocation (microsoft#1920) * Fix formatter adding extra space at end of line without trailing newline (microsoft#1933) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Fix vscode issue template (microsoft#1934) * userpreferences parsing/ls config handing (microsoft#1729) * Plumb through TokenFlagsSingleQuote; use for auto import quote detection (microsoft#1937) * Invalidate caches on batches of 1000+ watch changes (microsoft#1869) * Create clickable links in quick info from @link JSDoc tags (microsoft#1935) * Don't report errors on `{@link foo.bar}` references (microsoft#1941) * Fix crash in `invocationErrorRecovery` function (microsoft#1944) * Fix leading source file comment emit bugs (microsoft#1945) * Implement selection ranges (microsoft#1939) * Fix porting bug in isArgumentAndStartLineOverlapsExpressionBeingCalled (microsoft#1948) * Add Range to Hover (microsoft#1489) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: DanielRosenwasser <[email protected]> Co-authored-by: Jake Bailey <[email protected]> * Properly handle hovering on `this` (microsoft#1953) * Bump the github-actions group across 1 directory with 2 updates (microsoft#1959) Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixed document highlight for reference directive (microsoft#1951) * Several fixes to JS typing of functions and methods (microsoft#1960) * Update submodule, port 6.0 options defaults (microsoft#1961) * Reapply microsoft#1951 and microsoft#1960 after bad merge (microsoft#1964) Co-authored-by: Anders Hejlsberg <[email protected]> Co-authored-by: John Favret <[email protected]> * Update submodule with ES5 removals (microsoft#1963) * Actually transform KindCommonJSExport in declaration emit (microsoft#1962) * Quick Info fixes (microsoft#1971) * Fix various named enum types (microsoft#1973) * Move change tracker, converters, utils to separate packages (microsoft#1977) * Consistent rules for mixing `@type`, `@param`, `@return`, `@template` (microsoft#1979) * Check for identifier before obtaining text of name (microsoft#1984) * Respect client capabilities for diagnostics (microsoft#1980) * Store explicitly declared members ahead of inherited members (microsoft#1987) * Add --checkers to control number of checkers per Program (microsoft#1985) * Export all types referenced through other exported APIs, enforce (microsoft#1978) * Switch custom runners from mariner-2.0 to azure-linux-3 (microsoft#1989) * Use `LocationLink` in go to definition (microsoft#1884) * Use a different set of commands to detect fourslash test updates (microsoft#1923) * Skip erasableSyntaxOnly checks for JavaScript files (microsoft#1956) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Update submodule for new cherry-picks (microsoft#1996) * Port TypeScript PR #62604: Propagate variance reliability (microsoft#1916) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: RyanCavanaugh <[email protected]> Co-authored-by: Jake Bailey <[email protected]> * Only export `@typedef` type aliases in modules (microsoft#1999) * Bump github/codeql-action from 4.31.0 to 4.31.2 in the github-actions group across 1 directory (microsoft#2005) Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Hoist @typedef and @import tags to containing scopes that permit them (microsoft#2003) * Remove concept of "unsupported extensions", clean up test skips (microsoft#2004) * Update golangci-lint, fix issues, modernize (microsoft#1981) * Implement more handling of client capabilities (microsoft#1998) * Add docs to signature help (microsoft#2009) Co-authored-by: Copilot <[email protected]> * Fix unused identifier diags, LSP tag diags (microsoft#2007) * fix(2015): abstract property created, overshadowing override (microsoft#2016) * Always check refCount after acquiring lock (microsoft#1986) * Delete resolver unit tests (microsoft#2008) * Fix missing parent for `Expression` in `TypeParameterDeclaration` (microsoft#2017) * Add missing nil check in `getCompletionItemActions` (microsoft#2018) * Fix crash in find-all-refs on `exports.xxx` in .js file (microsoft#2023) * Properly include JSX attributes in find-all-references (microsoft#2025) * Fix crash by removing `getNameFromImportDeclaration` in favor of `Node.Name()` (microsoft#2027) * Fix losing options from command line in watch mode (microsoft#2024) * Add issue investigator agent (microsoft#2030) * Switch 1ESPT pipelines to 1ESPT-AzureLinux3 (microsoft#2031) * Port inlay hints (microsoft#1705) * Split "use strict" into separate transformer, fix bugs with prologues (microsoft#2028) Co-authored-by: Sheetal Nandi <[email protected]> * Use a more cross-architecture-friendly devcontainer image. (microsoft#2034) * Fix nil pointer dereference in range formatting (microsoft#1993) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: DanielRosenwasser <[email protected]> Co-authored-by: jakebailey <[email protected]> Co-authored-by: Daniel Rosenwasser <[email protected]> Co-authored-by: Copilot <[email protected]> * Port missing `checkJs` logic (microsoft#2046) * Ignore reparsed nodes when determining external module indicator (microsoft#2044) * Fix various fuzzer-caught crashes in the parser (microsoft#2038) * Fix moduleDetection for node18, fix __esModule in detect=force (microsoft#2045) * Fix panic in syncmap on loading nil (microsoft#2056) * Use accessors on `Node` instead of casts and field accesses (microsoft#2052) * Add locks on concurrent alias following checker accesses under incremental mode (microsoft#2051) * Don't add `export` modifier to `JSTypeAliasDeclaration` from `@callback` (microsoft#2063) * Introduce GetECMALineOfPosition to avoid unused rune counting (microsoft#2065) * Don't add `export` modifier to `KindCommonJSExport` reparsed nodes (microsoft#2066) * Fix panic in inlay hints for tuple types (microsoft#2040) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Accurately recognize fourslash test as submodule (microsoft#2068) * Implement auto-import code actions, port tests and fix some bugs (microsoft#2053) * Port tsc --init (microsoft#2033) * Make CheckerPool iteration concurrent by default (microsoft#2070) * Use Microsoft build of Go in CI (microsoft#2069) * Detect Windows junctions with GetFileAttributesEx (microsoft#2013) * Fix CI cache workflow (microsoft#2071) * Use information from contextual type in hovers/quick info (microsoft#2073) * fix(2074): No quick info on function and other similar tokens (microsoft#2078) * Unify locks used on checkers between exclusive pool borrows and EmitResolver scopes (microsoft#2080) * Port non-baseline diagnostics tests (microsoft#2079) * Use SkipTrivia instead of GetRangeOfTokenAtPosition where possible (microsoft#2089) * Move unreachable checks to checker, allowing more AST reuse (microsoft#2067) * Fix scanning of valid surrogate pairs (microsoft#2032) * Fix misplaced parentheses in `Checker.isIndirectCall` (microsoft#2093) * Various agent mode updates (microsoft#2094) * Handle configuration changes in LSP for 'typescript.*' options. (microsoft#2088) * Fix nil pointer dereference in getAdjustedLocation for type-only exports (microsoft#2090) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Fix nil pointer dereference in code actions when diagnostic code is nil (microsoft#2091) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]> * Fully resolve LSP client caps to non-pointers, pass by context (microsoft#2095) * Fix hover on `module.exports` (microsoft#2098) * Accept and document jsdoc diffs, round 1 (microsoft#1426) Co-authored-by: Copilot <[email protected]> Co-authored-by: Jake Bailey <[email protected]> * Port baseline diagnostics tests (microsoft#2097) * Clean up disk space in CI before running (microsoft#2103) Co-authored-by: Copilot <[email protected]> * Add GOBIN to PATH in CI (microsoft#2105) * Make client requests type safe, unmarshal (microsoft#2099) * Display inherited JSDoc documentation in quick info (microsoft#2111) * Sort failingTests and manualTests in en-US (microsoft#2113) * fix(2047): Incomplete declaration emit of callback tag with no return tag (microsoft#2100) * Fix canHaveSyntheticDefault (microsoft#2101) * Misc fixes (microsoft#2112) * chore: fix incorrect function name in comment (microsoft#2109) Signed-off-by: weifangc <[email protected]> * Fix typedef binding with CJS `exports=` (microsoft#826) * Provide Program diagnostics as push diags in tsconfig.json (microsoft#2118) Co-authored-by: Copilot <[email protected]> * Update dependencies (microsoft#2116) * Remove copilot-setup-steps env var (microsoft#2124) * Fix panic on negative parameterIndex in type predicate flow analysis (microsoft#2122) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: RyanCavanaugh <[email protected]> Co-authored-by: Ryan Cavanaugh <[email protected]> * Port tests for go to implementation and diff definitions tests (microsoft#2130) * Partially fix multi-checker diagnostics consistency (microsoft#2134) * Implement reportStyleChecksAsWarnings (microsoft#2132) * Include docs on resolved client caps (microsoft#2135) * Fix dynamic import grammar check (microsoft#2138) * Refine LSP with our own types, generate more stuff (microsoft#2141) * Display all symbol meanings in quick info (microsoft#2144) * Multiproject requests like find all refs, rename and workspace symbols (microsoft#1991) * Add stringer-alike String methods to non-string LSP enums (microsoft#2148) * Enable localization (microsoft#2123) * Port workspace symbols tests (microsoft#2146) * Update readme, issue template (microsoft#2140) * Ignore config port (microsoft#1755) * fix(2157): jsdocfunction param is inferred as implicit any when directly assigned to module.exports (microsoft#2158) * fixes after merge * some more fixes * more errors * builds * fmt * fix nil pointer deref * fix error messages --------- Signed-off-by: dependabot[bot] <[email protected]> Signed-off-by: weifangc <[email protected]> Co-authored-by: Gabriela Araujo Britto <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: jakebailey <[email protected]> Co-authored-by: andrewbranch <[email protected]> Co-authored-by: Andrew Branch <[email protected]> Co-authored-by: Andrew Branch <[email protected]> Co-authored-by: Oleksandr T. <[email protected]> Co-authored-by: Matt Bierner <[email protected]> Co-authored-by: Ryan Cavanaugh <[email protected]> Co-authored-by: DanielRosenwasser <[email protected]> Co-authored-by: Daniel Rosenwasser <[email protected]> Co-authored-by: Twacqwq <[email protected]> Co-authored-by: Anders Hejlsberg <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Isabel Duan <[email protected]> Co-authored-by: John Favret <[email protected]> Co-authored-by: Wesley Wigham <[email protected]> Co-authored-by: RyanCavanaugh <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: xu0o0 <[email protected]> Co-authored-by: Sheetal Nandi <[email protected]> Co-authored-by: Nathan Shively-Sanders <[email protected]> Co-authored-by: weifangc <[email protected]> Co-authored-by: Ryan Cavanaugh <[email protected]> Co-authored-by: Nathan Whitaker <[email protected]>
typescript.preferences, or a flat json like typescript-language-servertodo:
javascriptformat