Skip to content

Commit

Permalink
feat: add reference and definition provider
Browse files Browse the repository at this point in the history
  • Loading branch information
zhaoge committed Sep 25, 2024
1 parent 8edce23 commit 03f26f7
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 11 deletions.
100 changes: 93 additions & 7 deletions src/languageFeatures.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import type { ParseError } from 'dt-sql-parser';
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';

import { BaseSQLWorker } from './baseSQLWorker';
import { debounce } from './common/utils';
import {
CancellationToken,
editor,
Uri,
IDisposable,
MarkerSeverity,
Range,
languages,
MarkerSeverity,
Position,
CancellationToken
Range,
Uri
} from './fillers/monaco-editor-core';
import { debounce } from './common/utils';
import { BaseSQLWorker } from './baseSQLWorker';
import type { ParseError } from 'dt-sql-parser';
import type { LanguageServiceDefaults } from './monaco.contribution';

export interface WorkerAccessor<T extends BaseSQLWorker> {
Expand Down Expand Up @@ -197,3 +201,85 @@ export class CompletionAdapter<T extends BaseSQLWorker>
});
}
}

export class DefinitionAdapter<T extends BaseSQLWorker> implements languages.DefinitionProvider {
constructor(private readonly _worker: WorkerAccessor<T>) {}
provideDefinition(
model: editor.IReadOnlyModel,
position: Position
): languages.ProviderResult<languages.Definition | languages.LocationLink[]> {
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());
})
.then((entities) => {
const word = model.getWordAtPosition(position);
let pos: WordPosition = {
line: -1,
startIndex: -1,
endIndex: -1,
startColumn: -1,
endColumn: -1
};
entities?.forEach((entity: EntityContext) => {
if (
entity.entityContextType.includes('Create') &&
word?.word &&
entity.text === word?.word
) {
pos = entity.position;
}
});
if (pos && pos.line !== -1) {
return {
uri: model.uri,
range: new monaco.Range(
pos?.line,
pos?.startColumn,
pos?.line,
pos?.endColumn
)
};
}
});
}
}

export class ReferenceAdapter<T extends BaseSQLWorker> implements languages.ReferenceProvider {
constructor(private readonly _worker: WorkerAccessor<T>) {}
provideReferences(
model: editor.IReadOnlyModel,
position: Position
): languages.ProviderResult<languages.Location[]> {
const resource = model.uri;
const lineContent = model.getLineContent(position.lineNumber);
if (!lineContent.startsWith('CREATE')) return null;
return this._worker(resource)
.then((worker) => {
return worker.getAllEntities(model.getValue());
})
.then((entities) => {
const word = model.getWordAtPosition(position);
const arr: languages.Location[] = [];
entities?.forEach((entity) => {
if (word?.word && entity.text === word?.word) {
let pos: WordPosition | null = null;
pos = entity.position;
arr.push({
uri: model.uri,
range: new monaco.Range(
pos?.line,
pos?.startColumn,
pos?.line,
pos?.endColumn
)
});
}
});
return arr.length ? arr : null;
});
}
}
20 changes: 16 additions & 4 deletions src/setupLanguageMode.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { WorkerManager } from './workerManager';
import { LanguageServiceDefaults } from './monaco.contribution';
import * as languageFeatures from './languageFeatures';
import { Uri, IDisposable, languages } from './fillers/monaco-editor-core';
import type { BaseSQLWorker } from './baseSQLWorker';
import { IDisposable, languages, Uri } from './fillers/monaco-editor-core';
import * as languageFeatures from './languageFeatures';
import { LanguageServiceDefaults } from './monaco.contribution';
import { WorkerManager } from './workerManager';

export function setupLanguageMode<T extends BaseSQLWorker>(
defaults: LanguageServiceDefaults
Expand Down Expand Up @@ -34,6 +34,18 @@ export function setupLanguageMode<T extends BaseSQLWorker>(
)
);
}
providers.push(
languages.registerDefinitionProvider(
languageId,
new languageFeatures.DefinitionAdapter(worker)
)
);
providers.push(
languages.registerReferenceProvider(
languageId,
new languageFeatures.ReferenceAdapter(worker)
)
);
}

registerProviders();
Expand Down

0 comments on commit 03f26f7

Please sign in to comment.