Skip to content

Commit

Permalink
refactor(language-core): more meaningful CodeInformation interface (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk authored Nov 28, 2023
1 parent 5b3f92b commit 7b2eff1
Show file tree
Hide file tree
Showing 36 changed files with 249 additions and 201 deletions.
1 change: 1 addition & 0 deletions packages/language-core/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './lib/editorFeatures';
export * from './lib/fileProvider';
export * from './lib/linkedCodeMap';
export * from './lib/types';
Expand Down
115 changes: 115 additions & 0 deletions packages/language-core/lib/editorFeatures.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import type { CodeInformation } from './types';

export function isHoverEnabled(info: CodeInformation): boolean {
return info.semantic;
}

export function isSemanticTokensEnabled(info: CodeInformation): boolean {
return info.semantic;
}

export function isInlayHintsEnabled(info: CodeInformation): boolean {
return info.semantic;
}

export function isCodeLensEnabled(info: CodeInformation): boolean {
return info.semantic;
}

export function isCallHierarchyEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isRenameEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isDefinitionEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isTypeDefinitionEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isReferencesEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isImplementationEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isHighlightEnabled(info: CodeInformation): boolean {
return !!info.navigation;
}

export function isSymbolsEnabled(info: CodeInformation): boolean {
return info.structure;
}

export function isFoldingRangesEnabled(info: CodeInformation): boolean {
return info.structure;
}

export function isSelectionRangesEnabled(info: CodeInformation): boolean {
return info.structure;
}

export function isLinkedEditingEnabled(info: CodeInformation): boolean {
return info.structure;
}

export function isColorEnabled(info: CodeInformation): boolean {
return info.structure;
}

export function isDocumentLinkEnabled(info: CodeInformation): boolean {
return info.structure;
}

export function isDiagnosticsEnabled(info: CodeInformation): boolean {
return !!info.verification;
}

export function isCodeActionsEnabled(info: CodeInformation): boolean {
return !!info.verification;
}

export function isFormattingEnabled(info: CodeInformation): boolean {
return info.format;
}

export function isCompletionEnabled(info: CodeInformation): boolean {
return !!info.completion;
}

export function isAutoInsertEnabled(info: CodeInformation): boolean {
return !!info.completion;
}

export function isSignatureHelpEnabled(info: CodeInformation): boolean {
return !!info.completion;
}

// should...

export function shouldReportDiagnostics(info: CodeInformation): boolean {
return typeof info.verification === 'object'
? info.verification.shouldReport?.() ?? true
: info.verification;
}

// resolve...

export function resolveRenameNewName(newName: string, info: CodeInformation): string {
return typeof info.navigation === 'object'
? info.navigation.resolveRenameNewName?.(newName) ?? newName
: newName;
}

export function resolveRenameEditText(text: string, info: CodeInformation): string {
return typeof info.navigation === 'object'
? info.navigation.resolveRenameEditText?.(text) ?? text
: text;
}
2 changes: 1 addition & 1 deletion packages/language-core/lib/fileProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function createFileProvider(languages: Language[], caseSensitive: boolean
},
getMirrorMap(file: VirtualFile) {
if (!virtualFileToLinkedCodeMap.has(file.snapshot)) {
virtualFileToLinkedCodeMap.set(file.snapshot, file.linkedCodeMappings ? new LinkedCodeMap(file.linkedCodeMappings) : undefined);
virtualFileToLinkedCodeMap.set(file.snapshot, file.linkedNavigationMappings ? new LinkedCodeMap(file.linkedNavigationMappings) : undefined);
}
return virtualFileToLinkedCodeMap.get(file.snapshot);
},
Expand Down
7 changes: 3 additions & 4 deletions packages/language-core/lib/linkedCodeMap.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { SourceMap } from '@volar/source-map';
import type { LinkedCodeTrigger } from './types';

export class LinkedCodeMap extends SourceMap<[LinkedCodeTrigger, LinkedCodeTrigger]> {
export class LinkedCodeMap extends SourceMap {
*toLinkedOffsets(start: number) {
for (const mapped of this.getGeneratedOffsets(start)) {
yield [mapped[0], mapped[1].data[1]] as const;
yield mapped[0];
}
for (const mapped of this.getSourceOffsets(start)) {
yield [mapped[0], mapped[1].data[0]] as const;
yield mapped[0];
}
}
}
52 changes: 18 additions & 34 deletions packages/language-core/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,47 +13,31 @@ export interface VirtualFile extends BaseFile {
scriptKind: ts.ScriptKind;
};
codegenStacks?: Stack[];
linkedCodeMappings?: Mapping<[LinkedCodeTrigger, LinkedCodeTrigger]>[];
}

export interface LinkedCodeTrigger {
reference?: boolean;
rename?: boolean;
definition?: boolean;
highlight?: boolean;
linkedNavigationMappings?: Mapping[];
}

export interface CodeInformation {
diagnostics?: boolean | {
shouldReport(): boolean;
/** virtual code is expected to support verification */
verification: boolean | {
shouldReport?(): boolean;
};
renameEdits?: boolean | {
shouldRename: boolean;
shouldEdit: boolean;
resolveNewName?(newName: string): string;
resolveEditText?(newText: string): string;
};
formattingEdits?: boolean;
completionItems?: boolean | {
/** virtual code is expected to support assisted completion */
completion: boolean | {
isAdditional?: boolean;
onlyImport?: boolean;
};
definitions?: boolean;
references?: boolean;
foldingRanges?: boolean;
inlayHints?: boolean;
codeActions?: boolean;
symbols?: boolean;
selectionRanges?: boolean;
linkedEditingRanges?: boolean;
colors?: boolean;
autoInserts?: boolean;
codeLenses?: boolean;
highlights?: boolean;
links?: boolean;
semanticTokens?: boolean;
hover?: boolean;
signatureHelps?: boolean;
/** virtual code is expected correctly reflect semantic of the source code */
semantic: boolean;
/** virtual code is expected correctly reflect reference relationships of the source code */
navigation: boolean | {
shouldRename?(): boolean;
resolveRenameNewName?(newName: string): string;
resolveRenameEditText?(newText: string): string;
};
/** virtual code is expected correctly reflect the structural information of the source code */
structure: boolean;
/** virtual code is expected correctly reflect the format information of the source code */
format: boolean;
}

export interface BaseFile {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { languageFeatureWorker } from '../utils/featureWorkers';
import type * as vscode from 'vscode-languageserver-protocol';
import { notEmpty } from '../utils/common';
import { NoneCancellationToken } from '../utils/cancellation';
import { isColorEnabled } from '@volar/language-core';

export function register(context: ServiceContext) {

Expand All @@ -13,7 +14,7 @@ export function register(context: ServiceContext) {
uri,
() => range,
function* (map) {
for (const mappedRange of map.toGeneratedRanges(range, data => data.colors ?? true)) {
for (const mappedRange of map.toGeneratedRanges(range, isColorEnabled)) {
yield mappedRange;
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { isColorEnabled } from '@volar/language-core';
import type * as vscode from 'vscode-languageserver-protocol';
import type { ServiceContext } from '../types';
import { NoneCancellationToken } from '../utils/cancellation';
Expand All @@ -11,7 +12,7 @@ export function register(context: ServiceContext) {
return documentFeatureWorker(
context,
uri,
map => map.map.codeMappings.some(mapping => mapping.data.colors ?? true),
map => map.map.codeMappings.some(mapping => isColorEnabled(mapping.data)),
(service, document) => {
if (token.isCancellationRequested) {
return;
Expand All @@ -24,7 +25,7 @@ export function register(context: ServiceContext) {
}
return data
.map<vscode.ColorInformation | undefined>(color => {
const range = map.toSourceRange(color.range, data => data.colors ?? true);
const range = map.toSourceRange(color.range, isColorEnabled);
if (range) {
return {
range,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type * as vscode from 'vscode-languageserver-protocol';
import { isInsideRange, notEmpty } from '../utils/common';
import { NoneCancellationToken } from '../utils/cancellation';
import { transformDocumentSymbol } from '../utils/transform';
import { isSymbolsEnabled } from '@volar/language-core';

export function register(context: ServiceContext) {

Expand All @@ -12,7 +13,7 @@ export function register(context: ServiceContext) {
return documentFeatureWorker(
context,
uri,
map => map.map.codeMappings.some(mapping => mapping.data.symbols ?? true),
map => map.map.codeMappings.some(mapping => isSymbolsEnabled(mapping.data)),
async (service, document) => {
if (token.isCancellationRequested) {
return;
Expand All @@ -26,7 +27,7 @@ export function register(context: ServiceContext) {
return data
.map(symbol => transformDocumentSymbol(
symbol,
range => map.toSourceRange(range, data => data.symbols ?? true),
range => map.toSourceRange(range, isSymbolsEnabled),
))
.filter(notEmpty);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { NoneCancellationToken } from '../utils/cancellation';

import type * as _ from 'vscode-languageserver-protocol';
import { transformFoldingRanges } from '../utils/transform';
import { isFoldingRangesEnabled } from '@volar/language-core';

export function register(context: ServiceContext) {

Expand All @@ -12,7 +13,7 @@ export function register(context: ServiceContext) {
return documentFeatureWorker(
context,
uri,
map => map.map.codeMappings.some(mapping => mapping.data.foldingRanges ?? true),
map => map.map.codeMappings.some(mapping => isFoldingRangesEnabled(mapping.data)),
(service, document) => {
if (token.isCancellationRequested) {
return;
Expand All @@ -25,7 +26,7 @@ export function register(context: ServiceContext) {
}
return transformFoldingRanges(
data,
range => map.toSourceRange(range, data => data.foldingRanges ?? true)
range => map.toSourceRange(range, isFoldingRangesEnabled)
);
},
arr => arr.flat(),
Expand Down
4 changes: 2 additions & 2 deletions packages/language-service/lib/documentFeatures/format.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SourceMap, VirtualFile, forEachEmbeddedFile, resolveCommonLanguageId, updateVirtualFileMaps } from '@volar/language-core';
import { SourceMap, VirtualFile, forEachEmbeddedFile, isFormattingEnabled, resolveCommonLanguageId, updateVirtualFileMaps } from '@volar/language-core';
import type * as vscode from 'vscode-languageserver-protocol';
import { TextDocument } from 'vscode-languageserver-textdocument';
import type { ServiceContext, Service } from '../types';
Expand Down Expand Up @@ -62,7 +62,7 @@ export function register(context: ServiceContext) {

for (const file of embeddedFiles) {

if (!file.mappings.some(mapping => mapping.data.formattingEdits ?? true))
if (!file.mappings.some(mapping => isFormattingEnabled(mapping.data)))
continue;

const isCodeBlock = file.mappings.length === 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { languageFeatureWorker } from '../utils/featureWorkers';
import type * as vscode from 'vscode-languageserver-protocol';
import { notEmpty } from '../utils/common';
import { NoneCancellationToken } from '../utils/cancellation';
import { isLinkedEditingEnabled } from '@volar/language-core';

export function register(context: ServiceContext) {

Expand All @@ -13,10 +14,7 @@ export function register(context: ServiceContext) {
uri,
() => position,
function* (map) {
for (const pos of map.toGeneratedPositions(
position,
data => data.linkedEditingRanges ?? true
)) {
for (const pos of map.toGeneratedPositions(position, isLinkedEditingEnabled)) {
yield pos;
}
},
Expand All @@ -33,10 +31,9 @@ export function register(context: ServiceContext) {
}
return {
wordPattern: ranges.wordPattern,
ranges: ranges.ranges.map(range => map.toSourceRange(
range,
data => data.linkedEditingRanges ?? true
)).filter(notEmpty),
ranges: ranges.ranges
.map(range => map.toSourceRange(range, isLinkedEditingEnabled))
.filter(notEmpty),
};
},
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { NoneCancellationToken } from '../utils/cancellation';
import { isInsideRange, notEmpty } from '../utils/common';
import { languageFeatureWorker } from '../utils/featureWorkers';
import { transformSelectionRanges } from '../utils/transform';
import { isSelectionRangesEnabled } from '@volar/language-core';

export function register(context: ServiceContext) {

Expand All @@ -14,13 +15,11 @@ export function register(context: ServiceContext) {
uri,
() => positions,
function* (map) {
if (map.map.codeMappings.some(mapping => mapping.data.selectionRanges)) {
const result = positions
.map(position => map.toGeneratedPosition(position, data => data.selectionRanges ?? true))
.filter(notEmpty);
if (result.length) {
yield result;
}
const result = positions
.map(position => map.toGeneratedPosition(position, isSelectionRangesEnabled))
.filter(notEmpty);
if (result.length) {
yield result;
}
},
(service, document, positions) => {
Expand All @@ -36,7 +35,7 @@ export function register(context: ServiceContext) {
}
return transformSelectionRanges(
data,
range => map.toSourceRange(range, data => data.selectionRanges ?? true)
range => map.toSourceRange(range, isSelectionRangesEnabled)
);
},
results => {
Expand Down
Loading

0 comments on commit 7b2eff1

Please sign in to comment.