From f3c3173f1ea0c5adc86ea6bd45fee3261955bb15 Mon Sep 17 00:00:00 2001 From: saxumcordis Date: Mon, 24 Mar 2025 20:45:14 +0300 Subject: [PATCH 1/2] Feat: option to ignore modeline schema --- README.md | 1 + src/languageserver/handlers/settingsHandlers.ts | 2 ++ src/languageservice/services/yamlSchemaService.ts | 7 +++++-- src/languageservice/yamlLanguageService.ts | 7 ++++++- src/yamlSettings.ts | 2 ++ 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6d6c052a8..3d772ded3 100755 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ The following settings are supported: - `yaml.schemas`: Helps you associate schemas with files in a glob pattern - `yaml.schemaStore.enable`: When set to true the YAML language server will pull in all available schemas from [JSON Schema Store](https://www.schemastore.org/json/) - `yaml.schemaStore.url`: URL of a schema store catalog to use when downloading schemas. +- `yaml.shouldIgnoreModelineSchema`: Enable/disable ignore of # yaml-language-server: $schema:path - `yaml.customTags`: Array of custom tags that the parser will validate against. It has two ways to be used. Either an item in the array is a custom tag such as "!Ref" and it will automatically map !Ref to scalar or you can specify the type of the object !Ref should be e.g. "!Ref sequence". The type of object can be either scalar (for strings and booleans), sequence (for arrays), map (for objects). - `yaml.maxItemsComputed`: The maximum number of outline symbols and folding regions computed (limited for performance reasons). - `[yaml].editor.tabSize`: the number of spaces to use when autocompleting. Takes priority over editor.tabSize. diff --git a/src/languageserver/handlers/settingsHandlers.ts b/src/languageserver/handlers/settingsHandlers.ts index fff3e1b4a..433719408 100644 --- a/src/languageserver/handlers/settingsHandlers.ts +++ b/src/languageserver/handlers/settingsHandlers.ts @@ -93,6 +93,8 @@ export class SettingsHandler { } this.yamlSettings.yamlVersion = settings.yaml.yamlVersion ?? '1.2'; + this.yamlSettings.shouldIgnoreModelineSchema = settings.yaml.shouldIgnoreModelineSchema ?? false; + if (settings.yaml.format) { this.yamlSettings.yamlFormatterSettings = { proseWrap: settings.yaml.format.proseWrap || 'preserve', diff --git a/src/languageservice/services/yamlSchemaService.ts b/src/languageservice/services/yamlSchemaService.ts index b8f4b2f8b..155d9a4a2 100644 --- a/src/languageservice/services/yamlSchemaService.ts +++ b/src/languageservice/services/yamlSchemaService.ts @@ -108,6 +108,7 @@ export class YAMLSchemaService extends JSONSchemaService { private filePatternAssociations: JSONSchemaService.FilePatternAssociation[]; private contextService: WorkspaceContextService; private requestService: SchemaRequestService; + private shouldIgnoreModelineSchema: boolean | undefined; public schemaPriorityMapping: Map>; private schemaUriToNameAndDescription = new Map(); @@ -115,12 +116,14 @@ export class YAMLSchemaService extends JSONSchemaService { constructor( requestService: SchemaRequestService, contextService?: WorkspaceContextService, - promiseConstructor?: PromiseConstructor + promiseConstructor?: PromiseConstructor, + shouldIgnoreModelineSchema?: boolean ) { super(requestService, contextService, promiseConstructor); this.customSchemaProvider = undefined; this.requestService = requestService; this.schemaPriorityMapping = new Map(); + this.shouldIgnoreModelineSchema = shouldIgnoreModelineSchema; } registerCustomSchemaProvider(customSchemaProvider: CustomSchemaProvider): void { @@ -412,7 +415,7 @@ export class YAMLSchemaService extends JSONSchemaService { return Promise.resolve(null); }; - const modelineSchema = resolveModelineSchema(); + const modelineSchema = !this.shouldIgnoreModelineSchema && resolveModelineSchema(); if (modelineSchema) { return resolveSchemaForResource([modelineSchema]); } diff --git a/src/languageservice/yamlLanguageService.ts b/src/languageservice/yamlLanguageService.ts index b76688db1..1b345bfb9 100644 --- a/src/languageservice/yamlLanguageService.ts +++ b/src/languageservice/yamlLanguageService.ts @@ -189,7 +189,12 @@ export function getLanguageService(params: { yamlSettings?: SettingsState; clientCapabilities?: ClientCapabilities; }): LanguageService { - const schemaService = new YAMLSchemaService(params.schemaRequestService, params.workspaceContext); + const schemaService = new YAMLSchemaService( + params.schemaRequestService, + params.workspaceContext, + undefined, + params.yamlSettings.shouldIgnoreModelineSchema + ); const completer = new YamlCompletion(schemaService, params.clientCapabilities, yamlDocumentsCache, params.telemetry); const hover = new YAMLHover(schemaService, params.telemetry); const yamlDocumentSymbols = new YAMLDocumentSymbols(schemaService, params.telemetry); diff --git a/src/yamlSettings.ts b/src/yamlSettings.ts index fc0260342..82567eac8 100644 --- a/src/yamlSettings.ts +++ b/src/yamlSettings.ts @@ -32,6 +32,7 @@ export interface Settings { keyOrdering: boolean; maxItemsComputed: number; yamlVersion: YamlVersion; + shouldIgnoreModelineSchema: boolean; }; http: { proxy: string; @@ -111,6 +112,7 @@ export class SettingsState { useSchemaSelectionRequests = false; hasWsChangeWatchedFileDynamicRegistration = false; fileExtensions: string[] = ['.yml', '.yaml']; + shouldIgnoreModelineSchema = false; } export class TextDocumentTestManager extends TextDocuments { From cabb35948146e9d6663203c0b8ce5473adb1e4a6 Mon Sep 17 00:00:00 2001 From: saxumcordis Date: Mon, 24 Mar 2025 20:54:43 +0300 Subject: [PATCH 2/2] fix & test --- src/languageservice/yamlLanguageService.ts | 2 +- test/yamlSchemaService.test.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/languageservice/yamlLanguageService.ts b/src/languageservice/yamlLanguageService.ts index 1b345bfb9..d3b629af1 100644 --- a/src/languageservice/yamlLanguageService.ts +++ b/src/languageservice/yamlLanguageService.ts @@ -193,7 +193,7 @@ export function getLanguageService(params: { params.schemaRequestService, params.workspaceContext, undefined, - params.yamlSettings.shouldIgnoreModelineSchema + params.yamlSettings?.shouldIgnoreModelineSchema ); const completer = new YamlCompletion(schemaService, params.clientCapabilities, yamlDocumentsCache, params.telemetry); const hover = new YAMLHover(schemaService, params.telemetry); diff --git a/test/yamlSchemaService.test.ts b/test/yamlSchemaService.test.ts index a98fb8791..4699e54ca 100644 --- a/test/yamlSchemaService.test.ts +++ b/test/yamlSchemaService.test.ts @@ -140,5 +140,16 @@ describe('YAML Schema Service', () => { expect(requestServiceMock).calledOnceWith('https://json-schema.org/draft-07/schema#'); }); + + it('should ignore modeline schema', () => { + const documentContent = `foo:\n bar\n#first comment\n# yaml-language-server: $schema=https://json-schema.org/draft-07/schema#\naa:bbb\n`; + const content = `${documentContent}`; + const yamlDock = parse(content); + + const service = new SchemaService.YAMLSchemaService(requestServiceMock, undefined, undefined, true); + service.getSchemaForResource('', yamlDock.documents[0]); + + expect(requestServiceMock).callCount(0) + }); }); });