Resolve JSON pointers as links

This commit is contained in:
Remco Haszing 2021-08-25 17:39:53 +02:00
parent 13a21cba5d
commit 0da9f2cdfd
No known key found for this signature in database
GPG key ID: 40D9F5FE9155FD3C
5 changed files with 38 additions and 0 deletions

View file

@ -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

View file

@ -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.

View file

@ -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),
};
},
};
}

View file

@ -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),
);

View file

@ -25,6 +25,8 @@ export interface YAMLWorker {
resetSchema: (uri: string) => PromiseLike<boolean>;
findDocumentSymbols: (uri: string) => PromiseLike<ls.DocumentSymbol[]>;
findLinks: (uri: string) => PromiseLike<ls.DocumentLink[]>;
}
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));
},
};
}