From 540687d7a655bde4e19ecfd4299a706920bfc706 Mon Sep 17 00:00:00 2001 From: zhaoge <> Date: Tue, 12 Nov 2024 15:26:46 +0800 Subject: [PATCH] feat: support custom references and definitions setting --- src/languageFeatures.ts | 38 +++++++++++++++------ src/languages/flink/flink.contribution.ts | 6 ++-- src/languages/hive/hive.contribution.ts | 6 ++-- src/languages/impala/impala.contribution.ts | 6 ++-- src/languages/mysql/mysql.contribution.ts | 6 ++-- src/languages/pgsql/pgsql.contribution.ts | 6 ++-- src/languages/spark/spark.contribution.ts | 6 ++-- src/languages/trino/trino.contribution.ts | 6 ++-- src/monaco.contribution.ts | 23 ++++++++++--- src/setupLanguageFeatures.ts | 33 ++++++++++++++---- src/setupLanguageMode.ts | 37 ++++++++++++-------- 11 files changed, 124 insertions(+), 49 deletions(-) diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index 3a2f5d95..47f0f2fb 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -1,5 +1,7 @@ import type { ParseError } from 'dt-sql-parser'; -import { EntityContext } from 'dt-sql-parser/dist/parser/common/entityCollector'; +import { + EntityContext, +} from 'dt-sql-parser/dist/parser/common/entityCollector'; import { WordPosition } from 'dt-sql-parser/dist/parser/common/textAndWord'; import * as monaco from 'monaco-editor'; @@ -13,7 +15,7 @@ import { MarkerSeverity, Position, Range, - Uri + Uri, } from './fillers/monaco-editor-core'; import type { LanguageServiceDefaults } from './monaco.contribution'; @@ -203,17 +205,24 @@ export class CompletionAdapter } export class DefinitionAdapter implements languages.DefinitionProvider { - constructor(private readonly _worker: WorkerAccessor) {} + constructor( + private readonly _worker: WorkerAccessor, + private readonly _defaults: LanguageServiceDefaults) {} provideDefinition( model: editor.IReadOnlyModel, - position: Position + position: Position, + _token: CancellationToken ): languages.ProviderResult { const resource = model.uri; const lineContent = model.getLineContent(position.lineNumber); if (lineContent.startsWith('--')) return null; return this._worker(resource) .then((worker) => { - return worker.getAllEntities(model.getValue()); + let code = model?.getValue() || ''; + if (typeof this._defaults.preprocessCode === 'function') { + code = this._defaults.preprocessCode(code); + } + return worker.getAllEntities(code); }) .then((entities) => { const word = model.getWordAtPosition(position); @@ -249,17 +258,26 @@ export class DefinitionAdapter implements languages.Def } export class ReferenceAdapter implements languages.ReferenceProvider { - constructor(private readonly _worker: WorkerAccessor) {} + constructor( + private readonly _worker: WorkerAccessor, + private readonly _defaults: LanguageServiceDefaults + ) {} provideReferences( model: editor.IReadOnlyModel, - position: Position + position: Position, + _context: languages.ReferenceContext, + _token: CancellationToken ): languages.ProviderResult { const resource = model.uri; const lineContent = model.getLineContent(position.lineNumber); - if (!lineContent.startsWith('CREATE')) return null; + if (!lineContent.startsWith('CREATE')) return; return this._worker(resource) .then((worker) => { - return worker.getAllEntities(model.getValue()); + let code = model?.getValue() || ''; + if (typeof this._defaults.preprocessCode === 'function') { + code = this._defaults.preprocessCode(code); + } + return worker.getAllEntities(model?.getValue()); }) .then((entities) => { const word = model.getWordAtPosition(position); @@ -279,7 +297,7 @@ export class ReferenceAdapter implements languages.Refe }); } }); - return arr.length ? arr : null; + return arr; }); } } diff --git a/src/languages/flink/flink.contribution.ts b/src/languages/flink/flink.contribution.ts index 5efc8c86..fa1462fd 100644 --- a/src/languages/flink/flink.contribution.ts +++ b/src/languages/flink/flink.contribution.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.FLINK, @@ -16,5 +16,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.FLINK, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/languages/hive/hive.contribution.ts b/src/languages/hive/hive.contribution.ts index 1ec7650b..9becbd54 100644 --- a/src/languages/hive/hive.contribution.ts +++ b/src/languages/hive/hive.contribution.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.HIVE, @@ -16,5 +16,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.HIVE, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/languages/impala/impala.contribution.ts b/src/languages/impala/impala.contribution.ts index 35a6b6f0..6167a6de 100644 --- a/src/languages/impala/impala.contribution.ts +++ b/src/languages/impala/impala.contribution.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.IMPALA, @@ -16,5 +16,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.IMPALA, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/languages/mysql/mysql.contribution.ts b/src/languages/mysql/mysql.contribution.ts index bd4c8be1..964b2040 100644 --- a/src/languages/mysql/mysql.contribution.ts +++ b/src/languages/mysql/mysql.contribution.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.MYSQL, @@ -16,5 +16,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.MYSQL, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/languages/pgsql/pgsql.contribution.ts b/src/languages/pgsql/pgsql.contribution.ts index 6d6adc56..51e6b7ec 100644 --- a/src/languages/pgsql/pgsql.contribution.ts +++ b/src/languages/pgsql/pgsql.contribution.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.PG, @@ -16,5 +16,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.PG, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/languages/spark/spark.contribution.ts b/src/languages/spark/spark.contribution.ts index 18c67757..db0c112d 100644 --- a/src/languages/spark/spark.contribution.ts +++ b/src/languages/spark/spark.contribution.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.SPARK, @@ -16,5 +16,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.SPARK, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/languages/trino/trino.contribution.ts b/src/languages/trino/trino.contribution.ts index c8971197..a7aa8b42 100644 --- a/src/languages/trino/trino.contribution.ts +++ b/src/languages/trino/trino.contribution.ts @@ -1,6 +1,6 @@ import { registerLanguage } from '../../_.contribution'; -import { setupLanguageFeatures } from '../../setupLanguageFeatures'; import { LanguageIdEnum } from '../../common/constants'; +import { setupLanguageFeatures } from '../../setupLanguageFeatures'; registerLanguage({ id: LanguageIdEnum.TRINO, @@ -11,5 +11,7 @@ registerLanguage({ setupLanguageFeatures(LanguageIdEnum.TRINO, { completionItems: true, - diagnostics: true + diagnostics: true, + references: true, + definitions: true, }); diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index e655fc54..03cce1dd 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -1,5 +1,16 @@ -import { languages, Emitter, IEvent, editor, Position, IRange } from './fillers/monaco-editor-core'; -import { EntityContext, Suggestions } from 'dt-sql-parser'; +import { + EntityContext, + Suggestions, +} from 'dt-sql-parser'; + +import { + editor, + Emitter, + IEvent, + IRange, + languages, + Position, +} from './fillers/monaco-editor-core'; /** * A completion item. @@ -65,7 +76,7 @@ export interface ModeConfiguration { /** * Defines whether the built-in definitions provider is enabled. */ - // readonly definitions?: boolean; + readonly definitions?: boolean; /** * Defines whether the built-in rename provider is enabled. @@ -75,7 +86,7 @@ export interface ModeConfiguration { /** * Defines whether the built-in references provider is enabled. */ - // readonly references?: boolean; + readonly references?: boolean; } /** @@ -171,5 +182,7 @@ export const modeConfigurationDefault: Required = { completionService: defaultCompletionService, triggerCharacters: ['.', ' '] }, - diagnostics: true + diagnostics: true, + definitions: true, + references: true }; diff --git a/src/setupLanguageFeatures.ts b/src/setupLanguageFeatures.ts index bdaeb0f6..66bfdab2 100644 --- a/src/setupLanguageFeatures.ts +++ b/src/setupLanguageFeatures.ts @@ -1,13 +1,16 @@ +import { LanguageIdEnum } from './common/constants'; import { - PreprocessCode, + IDisposable, + languages, +} from './fillers/monaco-editor-core'; +import { + CompletionOptions, LanguageServiceDefaults, LanguageServiceDefaultsImpl, - modeConfigurationDefault, ModeConfiguration, - CompletionOptions + modeConfigurationDefault, + PreprocessCode, } from './monaco.contribution'; -import { languages, IDisposable } from './fillers/monaco-editor-core'; -import { LanguageIdEnum } from './common/constants'; export interface FeatureConfiguration { /** @@ -20,6 +23,14 @@ export interface FeatureConfiguration { * Defaults to true. */ diagnostics?: boolean; + /** + * Defines whether the built-in definitions provider is enabled. + */ + definitions?: boolean; + /** + * Defines whether the built-in references provider is enabled. + */ + references?: boolean; /** * Define a function to preprocess code. * By default, do not something. @@ -110,6 +121,14 @@ function processConfiguration( ? configuration.completionItems!.triggerCharacters : (defaults?.modeConfiguration.completionItems.triggerCharacters ?? modeConfigurationDefault.completionItems.triggerCharacters); + const references = + typeof configuration.references === 'boolean' + ? configuration.references + : (defaults?.modeConfiguration.references ?? modeConfigurationDefault.references); + const definitions = + typeof configuration.definitions === 'boolean' + ? configuration.definitions + : (defaults?.modeConfiguration.definitions ?? modeConfigurationDefault.definitions); return { diagnostics, @@ -117,6 +136,8 @@ function processConfiguration( enable: completionEnable, completionService, triggerCharacters - } + }, + references, + definitions, }; } diff --git a/src/setupLanguageMode.ts b/src/setupLanguageMode.ts index 24e5a7a0..77e96aa1 100644 --- a/src/setupLanguageMode.ts +++ b/src/setupLanguageMode.ts @@ -1,5 +1,9 @@ import type { BaseSQLWorker } from './baseSQLWorker'; -import { IDisposable, languages, Uri } from './fillers/monaco-editor-core'; +import { + IDisposable, + languages, + Uri, +} from './fillers/monaco-editor-core'; import * as languageFeatures from './languageFeatures'; import { LanguageServiceDefaults } from './monaco.contribution'; import { WorkerManager } from './workerManager'; @@ -19,7 +23,6 @@ export function setupLanguageMode( function registerProviders(): void { const { languageId, modeConfiguration } = defaults; - disposeAll(providers); if (modeConfiguration.diagnostics) { @@ -34,18 +37,24 @@ export function setupLanguageMode( ) ); } - providers.push( - languages.registerDefinitionProvider( - languageId, - new languageFeatures.DefinitionAdapter(worker) - ) - ); - providers.push( - languages.registerReferenceProvider( - languageId, - new languageFeatures.ReferenceAdapter(worker) - ) - ); + + if (modeConfiguration.references) { + providers.push( + languages.registerReferenceProvider( + languageId, + new languageFeatures.ReferenceAdapter(worker, defaults) + ) + ); + } + + if (modeConfiguration.definitions) { + providers.push( + languages.registerDefinitionProvider( + languageId, + new languageFeatures.DefinitionAdapter(worker, defaults) + ) + ); + } } registerProviders();