UNPKG

qingkuai-language-service

Version:

The language service for qingkuai

357 lines (332 loc) 16.3 kB
import TS from 'typescript'; import { Options } from 'prettier'; import { Range, Position } from 'vscode-languageserver/node'; import { CompileResult as CompileResult$1, PositionFlagKeys, SlotInfo, ASTPositionWithFlag } from 'qingkuai/compiler'; import { SignatureHelp, Range as Range$1 } from 'vscode-languageserver-types'; type FixedArray<T, L extends number, R extends T[] = []> = R["length"] extends L ? R : FixedArray<T, L, [...R, T]>; type NumNum = FixedArray<number, 2>; type MaybePromise<T = any> = T | Promise<T>; type GetRangeFunc = (start: number, end?: number) => Range; type RealPath = string & { _: never; }; interface CustomFS { read: (path: string) => string; exist: (path: string) => boolean; } interface CustomPath { ext: (path: string) => string; dir: (path: string) => string; base: (path: string) => string; resolve: (...segments: string[]) => string; relative: (from: string, to: string) => string; } interface ExtensionConfiguration { typescriptDiagnosticsExplain: boolean; insertSpaceAroundInterpolation: boolean; additionalCodeLens: ("component" | "slot")[]; componentTagFormatPreference: "camel" | "kebab"; htmlHoverTip: ("tag" | "entity" | "attribute")[]; componentAttributeFormatPreference: "camel" | "kebab"; } type QingkuaiConfiguration = Partial<{ exposeDestructions: boolean; exposeDependencies: boolean; insertTipComments: boolean; resolveImportExtension: boolean; convenientDerivedDeclaration: boolean; reserveHtmlComments: "all" | "never" | "development" | "production"; }>; interface TSClientConfiguration { preference: TSUserPreferences; formatCodeSettings: TSFormatCodeSettings; } type PrettierConfiguration = Options & { qingkuai: Partial<{ spaceAroundInterpolation: boolean; componentTagFormatPreference: "camel" | "kebab"; componentAttributeFormatPreference: "camel" | "kebab"; }>; }; type CompileResult = CompileResult$1 & { uri: string; version: number; filePath: RealPath; getRange: GetRangeFunc; isSynchronized: boolean; builtInTypeDeclarationEndIndex: number; componentInfos: ComponentIdentifierInfo[]; scriptLanguageId: "typescript" | "javascript"; config: Partial<GetClientLanguageConfigResult>; getOffset: (position: Position) => number; getPosition: (offset: number) => Position; getInterIndex: (sourceIndex: number) => number; getSourceIndex: (interIndex: number, isEnd?: boolean) => number; isPositionFlagSet: (index: number, key: PositionFlagKeys) => boolean; }; type TSUserPreferences = TS.server.protocol.UserPreferences; type TSFormatCodeSettings = TS.server.protocol.FormatCodeSettings; interface TPICCommonRequestParams { fileName: RealPath; pos: number; } interface HoverTipResult { content: string; posRange: NumNum; } interface ComponentAttributeItem { kind: "Prop" | "Ref"; name: string; type: string; isEvent: boolean; stringCandidates: string[]; } interface RenameLocationItem { fileName: string; loc?: Range; range?: NumNum; prefix?: string; suffix?: string; } interface ComponentIdentifierInfo { name: string; imported: boolean; slotNams: string[]; relativePath: string; attributes: ComponentAttributeItem[]; } interface GetClientLanguageConfigResult { workspacePath: string; prettierConfig: PrettierConfiguration; typescriptConfig: TSClientConfiguration; extensionConfig: ExtensionConfiguration; } interface ResolveCompletionParams { pos: number; entryName: string; fileName: RealPath; source?: string; original?: TS.CompletionEntryData; } interface FindReferenceResultItem { fileName: string; range: Range; } interface FindDefinitionResultItem { fileName: string; targetRange: Range; targetSelectionRange: Range; } interface FindDefinitionResult { range: Range; definitions: FindDefinitionResultItem[]; } interface TSDiagnosticRelatedInformation { range: Range; message: string; filePath: RealPath; } interface GetDiagnosticResultItem { kind: number; code: number; range: Range; source: string; message: string; deprecated: boolean; unnecessary: boolean; relatedInformations: TSDiagnosticRelatedInformation[]; } type SignatureHelpParams = TPICCommonRequestParams & { isRetrigger: boolean; triggerCharacter?: "," | "(" | "<"; }; type GetCompletionsResultEntry = TS.CompletionEntry & { label: string; isColor: boolean; isDeprecated: boolean; detail: string | undefined; }; type GetCompletionsResult = Omit<TS.CompletionInfo, "entries"> & { entries: GetCompletionsResultEntry[]; }; interface TextEditWithPosRange { range: NumNum; newText: string; } interface AdapterCompileInfo { itos: number[]; content: string; slotInfo: SlotInfo; scriptKind: TS.ScriptKind; positions: ASTPositionWithFlag[]; } type ScriptCompletionDetail = Omit<TS.CompletionEntryDetails, "documentation" | "codeActions" | "displayParts"> & { detail: string; documentation?: string; codeActions?: (Omit<TS.CodeAction, "changes"> & { effects: TS.FileTextChanges[]; currentFileChanges: TextEditWithPosRange[]; })[]; }; interface CreateLsAdaptersOptions { ts: typeof TS; fs: CustomFS; path: CustomPath; typeDeclarationFilePath: string; getConfig: GetQingkuaiConfigFunc; getFullFileNames: GetFullFileNamesFunc; getUserPreferences: GetUserPreferencesFunc; getCompileInfo: GetAdapterCompileResultFunc; getLineAndCharacter: GetLineAndCharacterFunc; getFormattingOptions: GetFormattingOptionsFunc; getTsLanguageService: GetTsLanguageServiceFunc; getInterIndexByLineAndCharacter: GetInterIndexByLineAndCharacterFunc; } type GetLineAndCharacterFunc = (fileName: string, pos: number) => TS.LineAndCharacter | undefined; type GetInterIndexByLineAndCharacterFunc = (fileName: string, lineAndCharacter: TS.LineAndCharacter) => number; type GetFullFileNamesFunc = () => string[]; type GetUserPreferencesFunc = (fileName: string) => TS.UserPreferences; type GetCompileResultFunc = (path: string) => MaybePromise<CompileResult>; type GetFormattingOptionsFunc = (fileName: string) => TS.FormatCodeSettings; type GetAdapterCompileResultFunc = (fileName: string) => AdapterCompileInfo; type GetTsLanguageServiceFunc = (fileName: string) => TS.LanguageService | undefined; type GetQingkuaiConfigFunc = (fileName: RealPath) => QingkuaiConfiguration | undefined; declare function getKindName(node: TS.Node): string; declare function getLength(nodeOrText: TS.Node | string): number; declare function isInTopScope(node: TS.Node): boolean; declare function findAncestorUntil(node: TS.Node, kind: TS.SyntaxKind): TS.Node | undefined; declare function isEventType(type: TS.Type): boolean; declare function findVariableDeclarationOfReactFunc(node: TS.Node): TS.VariableDeclaration | null; declare function isDeclarationOfGlobalType(symbol: TS.Symbol | undefined): boolean; declare function walk(node: TS.Node | undefined, callback: (node: TS.Node) => void): void; declare function getNodeAt(node: TS.Node, pos: number): TS.Node | undefined; declare function isBuiltInGlobalDeclaration(node: TS.Identifier, typeChecker: TS.TypeChecker): boolean | undefined; declare function findNodeAtPosition(sourceFile: TS.SourceFile, position: number): TS.Node | undefined; declare const tsAst_d_findAncestorUntil: typeof findAncestorUntil; declare const tsAst_d_findNodeAtPosition: typeof findNodeAtPosition; declare const tsAst_d_findVariableDeclarationOfReactFunc: typeof findVariableDeclarationOfReactFunc; declare const tsAst_d_getKindName: typeof getKindName; declare const tsAst_d_getLength: typeof getLength; declare const tsAst_d_getNodeAt: typeof getNodeAt; declare const tsAst_d_isBuiltInGlobalDeclaration: typeof isBuiltInGlobalDeclaration; declare const tsAst_d_isDeclarationOfGlobalType: typeof isDeclarationOfGlobalType; declare const tsAst_d_isEventType: typeof isEventType; declare const tsAst_d_isInTopScope: typeof isInTopScope; declare const tsAst_d_walk: typeof walk; declare namespace tsAst_d { export { tsAst_d_findAncestorUntil as findAncestorUntil, tsAst_d_findNodeAtPosition as findNodeAtPosition, tsAst_d_findVariableDeclarationOfReactFunc as findVariableDeclarationOfReactFunc, tsAst_d_getKindName as getKindName, tsAst_d_getLength as getLength, tsAst_d_getNodeAt as getNodeAt, tsAst_d_isBuiltInGlobalDeclaration as isBuiltInGlobalDeclaration, tsAst_d_isDeclarationOfGlobalType as isDeclarationOfGlobalType, tsAst_d_isEventType as isEventType, tsAst_d_isInTopScope as isInTopScope, tsAst_d_walk as walk, }; } declare function proxyGetCompletionsAtPosition(languageService: TS.LanguageService): void; declare function proxyResolveModuleNameLiterals(languageServiceHost: TS.LanguageServiceHost, couldBeImpoted: (modulePath: string) => boolean): void; declare const proxies_d_proxyGetCompletionsAtPosition: typeof proxyGetCompletionsAtPosition; declare const proxies_d_proxyResolveModuleNameLiterals: typeof proxyResolveModuleNameLiterals; declare namespace proxies_d { export { proxies_d_proxyGetCompletionsAtPosition as proxyGetCompletionsAtPosition, proxies_d_proxyResolveModuleNameLiterals as proxyResolveModuleNameLiterals, }; } declare function ensureExport(languageService: TS.LanguageService, fileName: RealPath, content: string, typeDeclarationLen: number): { content: string; componentIdentifierInfos: ComponentIdentifierInfo[]; }; declare function getAndConvertHoverTip(languageService: TS.LanguageService, { fileName, pos }: TPICCommonRequestParams): HoverTipResult | null; declare function findAndConvertReferences(languageService: TS.LanguageService, getCompileRes: GetCompileResultFunc, { fileName, pos }: TPICCommonRequestParams): Promise<FindReferenceResultItem[] | null>; declare function getAndConvertDiagnostics(languageService: TS.LanguageService, fileName: RealPath, isSemanticProject: boolean): GetDiagnosticResultItem[]; declare function getAndConvertSignatureHelp(languageService: TS.LanguageService, lsParams: SignatureHelpParams): SignatureHelp | null; declare function findAndConvertImplementations(languageService: TS.LanguageService, { fileName, pos }: TPICCommonRequestParams): FindReferenceResultItem[] | null; declare function renameAndConvert(languageService: TS.LanguageService, { fileName, pos }: TPICCommonRequestParams): RenameLocationItem[] | null; declare function prepareRenameAndConvert(languageService: TS.LanguageService, { fileName, pos }: TPICCommonRequestParams): NumNum | null; declare const lineAndCharacter: { toSource(fileName: string, lineAndCharacter: TS.LineAndCharacter, isEnd?: boolean): TS.LineAndCharacter | undefined; toProtocolLocation(lineAndCharacter: TS.LineAndCharacter): TS.server.protocol.Location; }; declare const lsRange: { fromProtocolTextSpan(fileName: string, span: TS.server.protocol.TextSpan): Range$1 | undefined; fromTextSpan(fileName: string, span: TS.TextSpan): Range$1 | undefined; fromSourceStartAndEnd(fileName: string, sourceStart: number, sourceEnd: number): Range$1; }; declare const protocolLocation: { toSource(fileName: string, location: TS.server.protocol.Location, isEnd?: boolean): TS.server.protocol.Location | undefined; toLineAndCharacter(location: TS.server.protocol.Location): TS.LineAndCharacter; toSourceIndex(fileName: string, location: TS.server.protocol.Location): number; }; declare function getAndConvertDefinitions(languageService: TS.LanguageService, { fileName, pos }: TPICCommonRequestParams): FindDefinitionResult | null; declare function getAndConvertTypeDefinitions(languageService: TS.LanguageService, { fileName, pos }: TPICCommonRequestParams): FindDefinitionResultItem[] | null; declare function getAndConvertCompletionInfo(languageService: TS.LanguageService, params: TPICCommonRequestParams): GetCompletionsResult | null; declare function getAndConvertCompletionDetail(languageService: TS.LanguageService, lsParams: ResolveCompletionParams): ScriptCompletionDetail | null; declare const index_d_ensureExport: typeof ensureExport; declare const index_d_findAndConvertImplementations: typeof findAndConvertImplementations; declare const index_d_findAndConvertReferences: typeof findAndConvertReferences; declare const index_d_getAndConvertCompletionDetail: typeof getAndConvertCompletionDetail; declare const index_d_getAndConvertCompletionInfo: typeof getAndConvertCompletionInfo; declare const index_d_getAndConvertDefinitions: typeof getAndConvertDefinitions; declare const index_d_getAndConvertDiagnostics: typeof getAndConvertDiagnostics; declare const index_d_getAndConvertHoverTip: typeof getAndConvertHoverTip; declare const index_d_getAndConvertSignatureHelp: typeof getAndConvertSignatureHelp; declare const index_d_getAndConvertTypeDefinitions: typeof getAndConvertTypeDefinitions; declare const index_d_lineAndCharacter: typeof lineAndCharacter; declare const index_d_lsRange: typeof lsRange; declare const index_d_prepareRenameAndConvert: typeof prepareRenameAndConvert; declare const index_d_protocolLocation: typeof protocolLocation; declare const index_d_renameAndConvert: typeof renameAndConvert; declare namespace index_d { export { index_d_ensureExport as ensureExport, index_d_findAndConvertImplementations as findAndConvertImplementations, index_d_findAndConvertReferences as findAndConvertReferences, index_d_getAndConvertCompletionDetail as getAndConvertCompletionDetail, index_d_getAndConvertCompletionInfo as getAndConvertCompletionInfo, index_d_getAndConvertDefinitions as getAndConvertDefinitions, index_d_getAndConvertDiagnostics as getAndConvertDiagnostics, index_d_getAndConvertHoverTip as getAndConvertHoverTip, index_d_getAndConvertSignatureHelp as getAndConvertSignatureHelp, index_d_getAndConvertTypeDefinitions as getAndConvertTypeDefinitions, index_d_lineAndCharacter as lineAndCharacter, index_d_lsRange as lsRange, index_d_prepareRenameAndConvert as prepareRenameAndConvert, index_d_protocolLocation as protocolLocation, index_d_renameAndConvert as renameAndConvert, }; } declare function getRealPath(fileName: string): RealPath; declare function isPositionFlagSetBySourceIndex(fileName: string, sourceIndex: number, key: PositionFlagKeys): boolean; declare function isPositionFlagSetByInterIndex(fileName: string, interIndex: number, key: PositionFlagKeys, isEnd?: boolean): boolean; declare function isComponentIdentifier(fileName: RealPath, identifier: TS.Identifier, typeChecker: TS.TypeChecker): boolean; declare function recordRealPath(realFileName: string): void; declare function getSourceIndex(fileName: string, interIndex: number, isEnd?: boolean): number; declare const qingkuai_d_getRealPath: typeof getRealPath; declare const qingkuai_d_getSourceIndex: typeof getSourceIndex; declare const qingkuai_d_isComponentIdentifier: typeof isComponentIdentifier; declare const qingkuai_d_isPositionFlagSetByInterIndex: typeof isPositionFlagSetByInterIndex; declare const qingkuai_d_isPositionFlagSetBySourceIndex: typeof isPositionFlagSetBySourceIndex; declare const qingkuai_d_recordRealPath: typeof recordRealPath; declare namespace qingkuai_d { export { qingkuai_d_getRealPath as getRealPath, qingkuai_d_getSourceIndex as getSourceIndex, qingkuai_d_isComponentIdentifier as isComponentIdentifier, qingkuai_d_isPositionFlagSetByInterIndex as isPositionFlagSetByInterIndex, qingkuai_d_isPositionFlagSetBySourceIndex as isPositionFlagSetBySourceIndex, qingkuai_d_recordRealPath as recordRealPath, }; } declare let typeRefStatement: string; declare let typeDeclarationFilePath: string; declare let getCompileInfo: GetAdapterCompileResultFunc; declare const resolvedQingkuaiModule: Map<RealPath, Set<string>>; declare const qingkuaiDiagnostics: Map<RealPath, TS.Diagnostic[]>; declare const init: (options: CreateLsAdaptersOptions) => void; export { tsAst_d as astUtil, index_d as convertor, getCompileInfo, init, proxies_d as proxies, qingkuaiDiagnostics, qingkuai_d as qkContext, resolvedQingkuaiModule, typeDeclarationFilePath, typeRefStatement };