diff --git a/README.md b/README.md index c591d47..69a3067 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ files: - Formatting using Prettier - Document Symbols - Automatically load remote schema files (by enabling DiagnosticsOptions.enableSchemaRequest) +- Links from JSON references. 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/webpack/src/index.ts b/examples/webpack/src/index.ts index 15fdd8d..e0711e0 100644 --- a/examples/webpack/src/index.ts +++ b/examples/webpack/src/index.ts @@ -125,6 +125,11 @@ array: enum: Mewtwo +# JSON referenses can be clicked for navigation +pointer: + $ref: '#/array' + + 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 33c61a0..aa66541 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -425,3 +425,26 @@ export function createDocumentFormattingEditProvider( }, }; } + +function toLink(link: ls.DocumentLink): languages.ILink { + return { + range: toRange(link.range), + tooltip: link.tooltip, + url: link.target, + }; +} + +export function createLinkProvider(getWorker: WorkerAccessor): languages.LinkProvider { + return { + async provideLinks(model) { + const resource = model.uri; + + const worker = await getWorker(resource); + const links = await worker.findLinks(String(resource)); + + return { + links: links.map(toLink), + }; + }, + }; +} diff --git a/src/yamlMode.ts b/src/yamlMode.ts index 5509e7e..901c111 100644 --- a/src/yamlMode.ts +++ b/src/yamlMode.ts @@ -6,6 +6,7 @@ import { createDocumentFormattingEditProvider, createDocumentSymbolProvider, createHoverProvider, + createLinkProvider, WorkerAccessor, } from './languageFeatures'; import { createWorkerManager } from './workerManager'; @@ -62,6 +63,7 @@ export function setupMode(defaults: languages.yaml.LanguageServiceDefaults): voi languageId, createDocumentFormattingEditProvider(worker), ), + languages.registerLinkProvider(languageId, createLinkProvider(worker)), createDiagnosticsAdapter(languageId, worker, defaults), languages.setLanguageConfiguration(languageId, richEditConfiguration), ); diff --git a/src/yamlWorker.ts b/src/yamlWorker.ts index bc5c6fb..56af838 100644 --- a/src/yamlWorker.ts +++ b/src/yamlWorker.ts @@ -25,6 +25,8 @@ export interface YAMLWorker { resetSchema: (uri: string) => PromiseLike; findDocumentSymbols: (uri: string) => PromiseLike; + + findLinks: (uri: string) => PromiseLike; } export function createYAMLWorker( @@ -89,6 +91,11 @@ export function createYAMLWorker( const symbols = languageService.findDocumentSymbols2(document, {}); return Promise.resolve(symbols); }, + + findLinks(uri) { + const document = getTextDocument(uri); + return Promise.resolve(languageService.findLinks(document)); + }, }; }