From 786cdb5dbb4430e5c02ad7ef198d1a945a44506b Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Wed, 10 Nov 2021 22:26:36 +0100 Subject: [PATCH] Implement definition provider --- README.md | 1 + examples/demo/src/index.ts | 8 ++++++++ src/languageFeatures.ts | 20 ++++++++++++++++++++ src/yamlMode.ts | 2 ++ src/yamlWorker.ts | 7 +++++++ 5 files changed, 38 insertions(+) diff --git a/README.md b/README.md index 6fee0b3..5e14e8d 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ files: - Document Symbols - Automatically load remote schema files (by enabling DiagnosticsOptions.enableSchemaRequest) - Links from JSON references. +- Links and hover effects from YAML anchors. Schemas can also be provided by configuration. See [here](https://github.com/remcohaszing/monaco-yaml/blob/main/index.d.ts) for the API that the plugin diff --git a/examples/demo/src/index.ts b/examples/demo/src/index.ts index b5eee71..48e73e1 100644 --- a/examples/demo/src/index.ts +++ b/examples/demo/src/index.ts @@ -95,6 +95,14 @@ pointer: $ref: '#/array' +# This anchor can be referenced +anchorRef: &anchor can be clicked as well + + +# Press control while hovering over the anchor +anchorPointer: *anchor + + formatting: Formatting is supported too! Under the hood this is powered by Prettier. Just press Ctrl+Shift+I or right click and press Format to format this document. diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index ef086a5..02bd875 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -252,6 +252,26 @@ export function createCompletionItemProvider( }; } +// --- definition ------ + +export function createDefinitionProvider(getWorker: WorkerAccessor): languages.DefinitionProvider { + return { + async provideDefinition(model, position) { + const resource = model.uri; + + const worker = await getWorker(resource); + const definitions = await worker.doDefinition(String(resource), fromPosition(position)); + + return definitions?.map((definition) => ({ + originSelectionRange: definition.originSelectionRange, + range: toRange(definition.targetRange), + targetSelectionRange: definition.targetSelectionRange, + uri: Uri.parse(definition.targetUri), + })); + }, + }; +} + // --- hover ------ export function createHoverProvider(getWorker: WorkerAccessor): languages.HoverProvider { diff --git a/src/yamlMode.ts b/src/yamlMode.ts index 8f7817a..b045c46 100644 --- a/src/yamlMode.ts +++ b/src/yamlMode.ts @@ -3,6 +3,7 @@ import { languages } from 'monaco-editor/esm/vs/editor/editor.api'; import { languageId } from './constants'; import { createCompletionItemProvider, + createDefinitionProvider, createDiagnosticsAdapter, createDocumentFormattingEditProvider, createDocumentSymbolProvider, @@ -48,6 +49,7 @@ export function setupMode(defaults: languages.yaml.LanguageServiceDefaults): voi languages.registerCompletionItemProvider(languageId, createCompletionItemProvider(worker)); languages.registerHoverProvider(languageId, createHoverProvider(worker)); + languages.registerDefinitionProvider(languageId, createDefinitionProvider(worker)); languages.registerDocumentSymbolProvider(languageId, createDocumentSymbolProvider(worker)); languages.registerDocumentFormattingEditProvider( languageId, diff --git a/src/yamlWorker.ts b/src/yamlWorker.ts index 6ea751e..6ace52a 100644 --- a/src/yamlWorker.ts +++ b/src/yamlWorker.ts @@ -21,6 +21,8 @@ export interface YAMLWorker { doComplete: (uri: string, position: ls.Position) => Promisable; + doDefinition: (uri: string, position: ls.Position) => Promisable; + doHover: (uri: string, position: ls.Position) => Promisable; format: (uri: string, options: CustomFormatterOptions) => Promisable; @@ -64,6 +66,11 @@ export function createYAMLWorker( return languageService.doComplete(document, position, languageSettings.isKubernetes); }, + doDefinition(uri, position) { + const document = getTextDocument(uri); + return languageService.doDefinition(document, { position, textDocument: { uri } }); + }, + doHover(uri, position) { const document = getTextDocument(uri); return languageService.doHover(document, position);