Skip to content

Commit

Permalink
feat(language-service): add support for inline values
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Aug 18, 2024
1 parent 947363d commit d14fb11
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 0 deletions.
4 changes: 4 additions & 0 deletions packages/language-core/lib/editorFeatures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ export function isMonikerEnabled(info: CodeInformation): boolean {
return !!info.semantic;
}

export function isInlineValueEnabled(info: CodeInformation): boolean {
return !!info.semantic;
}

export function isSemanticTokensEnabled(info: CodeInformation): boolean {
return typeof info.semantic === 'object'
? info.semantic.shouldHighlight?.() ?? true
Expand Down
18 changes: 18 additions & 0 deletions packages/language-server/lib/features/languageFeatures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,24 @@ export function register(
});
}

if (languageServicePlugins.some(({ capabilities }) => capabilities.inlineValueProvider)) {
serverCapabilities.inlineValueProvider = true;
server.connection.languages.inlineValue.on(async (params, token) => {
const uri = URI.parse(params.textDocument.uri);
return await worker(uri, token, languageService => {
return languageService.getInlineValue(uri, params.range, params.context, token);
});
});
if (initializeParams.capabilities.workspace?.inlineValue?.refreshSupport) {
refreshHandlers.push(() => {
server.connection.languages.inlineValue.refresh();
});
}
else {
console.warn('Inline value refresh is not supported by the client.');
}
}

if (languageServicePlugins.some(({ capabilities }) => capabilities.autoInsertionProvider)) {
const triggerCharacterToConfigurationSections = new Map<string, Set<string>>();
const tryAdd = (char: string, section?: string) => {
Expand Down
40 changes: 40 additions & 0 deletions packages/language-service/lib/features/provideInlineValue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { isInlineValueEnabled } from '@volar/language-core';
import type * as vscode from 'vscode-languageserver-protocol';
import { URI } from 'vscode-uri';
import type { LanguageServiceContext } from '../types';
import { NoneCancellationToken } from '../utils/cancellation';
import { getGeneratedRanges, getSourceRange, languageFeatureWorker } from '../utils/featureWorkers';

export function register(context: LanguageServiceContext) {

return (uri: URI, range: vscode.Range, ivContext: vscode.InlineValueContext, token = NoneCancellationToken) => {

return languageFeatureWorker(
context,
uri,
() => range,
docs => getGeneratedRanges(docs, range, isInlineValueEnabled),
(plugin, document, range) => {
if (token.isCancellationRequested) {
return;
}
return plugin[1].provideInlineValues?.(document, range, ivContext, token);
},
(items, docs) => {
if (!docs) {
return items;
}
return items
.map(item => {
const mappedRange = getSourceRange(docs, item.range, isInlineValueEnabled);
if (mappedRange) {
item.range = mappedRange;
return item;
}
})
.filter(item => !!item);
},
results => results.flat()
);
};
}
2 changes: 2 additions & 0 deletions packages/language-service/lib/languageService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import * as foldingRanges from './features/provideFoldingRanges';
import * as hover from './features/provideHover';
import * as inlayHints from './features/provideInlayHints';
import * as moniker from './features/provideMoniker';
import * as inlineValue from './features/provideInlineValue';
import * as linkedEditing from './features/provideLinkedEditingRanges';
import * as references from './features/provideReferences';
import * as rename from './features/provideRenameEdits';
Expand Down Expand Up @@ -239,6 +240,7 @@ function createLanguageServiceBase(
getDocumentDropEdits: documentDrop.register(context),
getInlayHints: inlayHints.register(context),
getMoniker: moniker.register(context),
getInlineValue: inlineValue.register(context),

resolveCodeAction: codeActionResolve.register(context),
resolveCompletionItem: completionResolve.register(context),
Expand Down
2 changes: 2 additions & 0 deletions packages/language-service/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ export interface LanguageServicePlugin<P = any> {
hoverProvider?: boolean;
documentHighlightProvider?: boolean;
monikerProvider?: boolean;
inlineValueProvider?: boolean;
workspaceSymbolProvider?: {
resolveProvider?: boolean;
};
Expand Down Expand Up @@ -185,6 +186,7 @@ export interface LanguageServicePluginInstance<P = any> {
provideReferences?(document: TextDocument, position: vscode.Position, context: vscode.ReferenceContext, token: vscode.CancellationToken): NullableProviderResult<vscode.Location[]>;
provideSelectionRanges?(document: TextDocument, positions: vscode.Position[], token: vscode.CancellationToken): NullableProviderResult<vscode.SelectionRange[]>;
provideInlayHints?(document: TextDocument, range: vscode.Range, token: vscode.CancellationToken): NullableProviderResult<vscode.InlayHint[]>;
provideInlineValues?(document: TextDocument, range: vscode.Range, context: vscode.InlineValueContext, token: vscode.CancellationToken): NullableProviderResult<vscode.InlineValue[]>;
provideCallHierarchyItems?(document: TextDocument, position: vscode.Position, token: vscode.CancellationToken): NullableProviderResult<vscode.CallHierarchyItem[]>;
provideCallHierarchyIncomingCalls?(item: vscode.CallHierarchyItem, token: vscode.CancellationToken): ProviderResult<vscode.CallHierarchyIncomingCall[]>;
provideCallHierarchyOutgoingCalls?(item: vscode.CallHierarchyItem, token: vscode.CancellationToken): ProviderResult<vscode.CallHierarchyOutgoingCall[]>;
Expand Down

0 comments on commit d14fb11

Please sign in to comment.