Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 32 additions & 6 deletions server/jsonServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,10 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
schema?: JSONSchema;
}


// Type for schema configuration with source tracking
type SchemaConfigurationWithSource = SchemaConfiguration & {
source: 'user' | 'default';
};

let jsonConfigurationSettings: JSONSchemaSettings[] | undefined = undefined;
let schemaAssociations: ISchemaAssociations | SchemaConfiguration[] | undefined = undefined;
Expand Down Expand Up @@ -313,42 +316,65 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
return [];
});

function updateConfiguration() {
function updateConfiguration() {
const languageSettings = {
validate: validateEnabled,
allowComments: true,
schemas: new Array<SchemaConfiguration>()
schemas: new Array<SchemaConfigurationWithSource>()
};

// Add default schemas (from catalog.json)
if (schemaAssociations) {
if (Array.isArray(schemaAssociations)) {
Array.prototype.push.apply(languageSettings.schemas, schemaAssociations);
Array.prototype.push.apply(languageSettings.schemas, schemaAssociations.map(s => ({ ...s, source: 'default' })));
} else {
for (const pattern in schemaAssociations) {
const association = schemaAssociations[pattern];
if (Array.isArray(association)) {
association.forEach(uri => {
languageSettings.schemas.push({ uri, fileMatch: [pattern] });
languageSettings.schemas.push({ uri, fileMatch: [pattern], source: 'default' });
});
}
}
}
}

// Add user schemas (from coc-settings.json)
if (jsonConfigurationSettings) {
jsonConfigurationSettings.forEach((schema, index) => {
let uri = schema.url;
if (!uri && schema.schema) {
uri = schema.schema.id || `vscode://schemas/custom/${index}`;
}
if (uri) {
languageSettings.schemas.push({ uri, fileMatch: schema.fileMatch, schema: schema.schema });
languageSettings.schemas.push({ uri, fileMatch: schema.fileMatch, schema: schema.schema, source: 'user' });
}
});
}

languageSettings.schemas = arbitrateSchemaConflicts(languageSettings.schemas);

languageService.configure(languageSettings);

diagnosticsSupport?.requestRefresh();
}

/**
* Simple schema conflict resolution: user schemas take precedence over default schemas
*/
function arbitrateSchemaConflicts(schemas: SchemaConfigurationWithSource[]): SchemaConfigurationWithSource[] {
const userSchemas = schemas.filter(s => s.source === 'user');
const defaultSchemas = schemas.filter(s => s.source === 'default');

// If user has specified schemas, use only those
if (userSchemas.length > 0) {
return userSchemas;
}

// Otherwise, use all default schemas
return defaultSchemas;
}

async function validateTextDocument(textDocument: TextDocument): Promise<Diagnostic[]> {
if (textDocument.getText().length === 0) {
return []; // ignore empty documents
Expand Down