Skip to content

Commit

Permalink
refactor: add full capabilities preset for FileCapabilities, FileRang…
Browse files Browse the repository at this point in the history
…eCapabilities, MirrorBehaviorCapabilities
  • Loading branch information
johnsoncodehk committed Jan 7, 2023
1 parent 5d313b0 commit 9b87b54
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 149 deletions.
25 changes: 4 additions & 21 deletions examples/svelte-language-core/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { decode } from '@jridgewell/sourcemap-codec';
import { VirtualFile, FileKind, LanguageModule } from '@volar/language-core';
import { VirtualFile, FileKind, LanguageModule, FileCapabilities, FileRangeCapabilities } from '@volar/language-core';
import { svelte2tsx } from 'svelte2tsx';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { URI } from 'vscode-uri';
Expand All @@ -14,14 +14,7 @@ export const languageModule: LanguageModule = {
snapshot,
kind: FileKind.TextFile,
embeddedFiles: getEmbeddeds(fileName, snapshot.getText(0, snapshot.getLength())),
capabilities: {
diagnostic: true,
foldingRange: true,
documentFormatting: true,
documentSymbol: true,
codeAction: true,
inlayHint: true,
},
capabilities: FileCapabilities.full,
mappings: [],
};
}
Expand Down Expand Up @@ -79,15 +72,7 @@ function getEmbeddeds(fileName: string, text: string) {
mappings.push({
sourceRange: [current.sourceOffset, current.sourceOffset + length],
generatedRange: [current.genOffset, current.genOffset + length],
data: {
hover: true,
references: true,
definition: true,
rename: true,
completion: true,
diagnostic: true,
semanticTokens: true,
},
data: FileRangeCapabilities.full,
});
}
}
Expand Down Expand Up @@ -120,11 +105,9 @@ function getEmbeddeds(fileName: string, text: string) {
},
kind: FileKind.TypeScriptHostFile,
capabilities: {
diagnostic: true,
...FileCapabilities.full,
foldingRange: false,
documentSymbol: false,
codeAction: true,
inlayHint: true,
documentFormatting: false,
},
mappings: mappings,
Expand Down
31 changes: 31 additions & 0 deletions packages/language-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,37 @@ export interface MirrorBehaviorCapabilities {
rename?: boolean,
}

export namespace FileCapabilities {
export const full: FileCapabilities = {
diagnostic: true,
foldingRange: true,
documentFormatting: true,
documentSymbol: true,
codeAction: true,
inlayHint: true,
};
}

export namespace FileRangeCapabilities {
export const full: FileRangeCapabilities = {
hover: true,
references: true,
definition: true,
rename: true,
completion: true,
diagnostic: true,
semanticTokens: true,
};
}

export namespace MirrorBehaviorCapabilities {
export const full: MirrorBehaviorCapabilities = {
references: true,
definition: true,
rename: true,
};
}

export enum FileKind {
TextFile = 0,
TypeScriptHostFile = 1,
Expand Down
60 changes: 10 additions & 50 deletions vue-language-tools/vue-language-core/src/generators/script.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getLength, Segment, toString } from '@volar/source-map';
import type { FileRangeCapabilities, MirrorBehaviorCapabilities } from '@volar/language-core';
import { FileRangeCapabilities, MirrorBehaviorCapabilities } from '@volar/language-core';
import type { TextRange } from '../types';
import * as SourceMaps from '@volar/source-map';
import { hyphenate } from '@vue/shared';
Expand Down Expand Up @@ -218,15 +218,7 @@ export function generate(
sfc[vueTag]!.content.substring(start, end),
vueTag,
start,
{
hover: true,
references: true,
definition: true,
rename: true,
diagnostic: true, // also working for setup() returns unused in template checking
completion: true,
semanticTokens: true,
},
FileRangeCapabilities.full, // diagnostic also working for setup() returns unused in template checking
]);
}
function addExtraReferenceVirtualCode(vueTag: 'script' | 'scriptSetup', start: number, end: number) {
Expand All @@ -253,15 +245,7 @@ export function generate(
sfc.scriptSetup.content.substring(0, scriptSetupRanges.importSectionEndOffset),
'scriptSetup',
0,
{
hover: true,
references: true,
definition: true,
diagnostic: true,
rename: true,
completion: true,
semanticTokens: true,
},
FileRangeCapabilities.full,
]);
}
function writeTemplateIfNoScriptSetup() {
Expand Down Expand Up @@ -291,15 +275,7 @@ export function generate(
sfc.scriptSetup.generic,
sfc.scriptSetup.name,
sfc.scriptSetup.genericOffset,
{
hover: true,
references: true,
definition: true,
rename: true,
diagnostic: true,
completion: true,
semanticTokens: true,
},
FileRangeCapabilities.full,
]);
codeGen.push(`>`);
}
Expand Down Expand Up @@ -579,16 +555,8 @@ export function generate(
sourceRange: [scriptStart, scriptEnd],
generatedRange: [templateStart, templateEnd],
data: [
{
definition: true,
references: true,
rename: true,
},
{
definition: true,
references: true,
rename: true,
},
MirrorBehaviorCapabilities.full,
MirrorBehaviorCapabilities.full,
],
});
}
Expand Down Expand Up @@ -753,7 +721,7 @@ export function generate(
ts,
code,
ts.createSourceFile('/a.txt', code, ts.ScriptTarget.ESNext),
(frag, fragOffset, isJustForErrorMapping) => {
(frag, fragOffset, onlyForErrorMapping) => {
if (fragOffset === undefined) {
codeGen.push(frag);
}
Expand All @@ -762,17 +730,9 @@ export function generate(
frag,
cssVar.style.name,
cssBind.start + fragOffset,
isJustForErrorMapping ? {
diagnostic: true,
} : {
hover: true,
references: true,
definition: true,
diagnostic: true,
rename: true,
completion: true,
semanticTokens: true,
},
onlyForErrorMapping
? { diagnostic: true }
: FileRangeCapabilities.full,
]);
}
},
Expand Down
14 changes: 3 additions & 11 deletions vue-language-tools/vue-language-core/src/generators/template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import { colletVars, walkInterpolationFragment } from '../utils/transform';
import * as minimatch from 'minimatch';

const capabilitiesSet = {
all: { hover: true, diagnostic: true, references: true, definition: true, rename: true, completion: true, semanticTokens: true } satisfies FileRangeCapabilities,
noDiagnostic: { hover: true, references: true, definition: true, rename: true, completion: true, semanticTokens: true } satisfies FileRangeCapabilities,
all: FileRangeCapabilities.full,
noDiagnostic: { ...FileRangeCapabilities.full, diagnostic: false } satisfies FileRangeCapabilities,
diagnosticOnly: { diagnostic: true } satisfies FileRangeCapabilities,
tagHover: { hover: true } satisfies FileRangeCapabilities,
event: { hover: true, diagnostic: true } satisfies FileRangeCapabilities,
Expand Down Expand Up @@ -1234,15 +1234,7 @@ export function generate(
content,
'template',
prop.arg.loc.start.offset + start,
{
hover: true,
references: true,
definition: true,
diagnostic: true,
rename: true,
completion: true,
semanticTokens: true,
},
capabilitiesSet.all,
]);
cssCodeGen.push(` }\n`);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { FileCapabilities, FileRangeCapabilities } from '@volar/language-core';
import { VueLanguagePlugin } from '../types';

const presetInitialIndentBrackets: Record<string, [string, string] | undefined> = {
Expand Down Expand Up @@ -29,28 +30,16 @@ const plugin: VueLanguagePlugin = () => {
const customBlock = sfc.customBlocks[index];

embeddedFile.capabilities = {
diagnostic: true,
foldingRange: true,
...FileCapabilities.full,
documentFormatting: {
initialIndentBracket: presetInitialIndentBrackets[customBlock.lang],
},
documentSymbol: true,
codeAction: true,
inlayHint: true,
};
embeddedFile.content.push([
customBlock.content,
customBlock.name,
0,
{
hover: true,
references: true,
definition: true,
diagnostic: true,
rename: true,
completion: true,
semanticTokens: true,
},
FileRangeCapabilities.full,
]);
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { FileCapabilities } from '@volar/language-core';
import { VueLanguagePlugin } from '../types';

const plugin: VueLanguagePlugin = () => {
Expand All @@ -23,12 +24,11 @@ const plugin: VueLanguagePlugin = () => {
const script = scriptMatch ? sfc.script : scriptSetupMatch ? sfc.scriptSetup : undefined;
if (script) {
embeddedFile.capabilities = {
...FileCapabilities.full,
diagnostic: false,
foldingRange: true,
documentFormatting: {
initialIndentBracket: ['{', '}'],
},
documentSymbol: true,
codeAction: false,
inlayHint: false,
};
Expand Down
17 changes: 3 additions & 14 deletions vue-language-tools/vue-language-core/src/plugins/vue-sfc-styles.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { FileCapabilities, FileRangeCapabilities } from '@volar/language-core';
import { VueLanguagePlugin } from '../types';

const presetInitialIndentBrackets: Record<string, [string, string] | undefined> = {
Expand Down Expand Up @@ -28,28 +29,16 @@ const plugin: VueLanguagePlugin = () => {
const style = sfc.styles[index];

embeddedFile.capabilities = {
diagnostic: true,
foldingRange: true,
...FileCapabilities.full,
documentFormatting: {
initialIndentBracket: presetInitialIndentBrackets[style.lang],
},
documentSymbol: true,
codeAction: true,
inlayHint: true,
};
embeddedFile.content.push([
style.content,
style.name,
0,
{
hover: true,
references: true,
definition: true,
diagnostic: true,
rename: true,
completion: true,
semanticTokens: true,
},
FileRangeCapabilities.full,
]);
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { FileCapabilities, FileRangeCapabilities } from '@volar/language-core';
import { VueLanguagePlugin } from '../types';

const presetInitialIndentBrackets: Record<string, [string, string] | undefined> = {
Expand All @@ -21,28 +22,16 @@ const plugin: VueLanguagePlugin = () => {
const match = embeddedFile.fileName.match(/^(.*)\.template\.([^.]+)$/);
if (match && sfc.template) {
embeddedFile.capabilities = {
diagnostic: true,
foldingRange: true,
...FileCapabilities.full,
documentFormatting: {
initialIndentBracket: presetInitialIndentBrackets[sfc.template.lang],
},
documentSymbol: true,
codeAction: true,
inlayHint: true,
};
embeddedFile.content.push([
sfc.template.content,
sfc.template.name,
0,
{
hover: true,
references: true,
definition: true,
diagnostic: true,
rename: true,
completion: true,
semanticTokens: true,
},
FileRangeCapabilities.full,
]);
}
},
Expand Down
9 changes: 3 additions & 6 deletions vue-language-tools/vue-language-core/src/plugins/vue-tsx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import * as templateGen from '../generators/template';
import { parseScriptRanges } from '../parsers/scriptRanges';
import { parseScriptSetupRanges } from '../parsers/scriptSetupRanges';
import { Sfc, VueLanguagePlugin } from '../types';
import { FileKind } from '@volar/language-core';
import { FileCapabilities, FileKind } from '@volar/language-core';
import { TextRange } from '../types';
import { parseCssClassNames } from '../utils/parseCssClassNames';
import { parseCssVars } from '../utils/parseCssVars';
Expand Down Expand Up @@ -43,12 +43,10 @@ const plugin: VueLanguagePlugin = ({ modules, vueCompilerOptions, compilerOption
if (suffix === '.' + _tsx.lang.value) {
embeddedFile.kind = FileKind.TypeScriptHostFile;
embeddedFile.capabilities = {
diagnostic: true,
...FileCapabilities.full,
foldingRange: false,
documentFormatting: false,
documentSymbol: false,
codeAction: true,
inlayHint: true,
};
const tsx = _tsx.tsxGen.value;
if (tsx) {
Expand All @@ -61,10 +59,9 @@ const plugin: VueLanguagePlugin = ({ modules, vueCompilerOptions, compilerOption

embeddedFile.parentFileName = fileName + '.template.' + sfc.template?.lang;
embeddedFile.capabilities = {
...FileCapabilities.full,
diagnostic: false,
foldingRange: false,
documentFormatting: true,
documentSymbol: true,
codeAction: false,
inlayHint: false,
};
Expand Down

0 comments on commit 9b87b54

Please sign in to comment.