import { CompletionItem, TextDocument, Position } from 'vscode' import { Completion } from './Completion' import * as vscode from 'vscode' import { completionRefreshDelay } from '../readConfig' import { tc } from '../helpers/TsComplier' import { Dict } from '../type' import { utils } from '../utils' export class DataPointCompletion extends Completion { public completionArr: CompletionItem[] = [] protected triggerRangeMatcher: RegExp = /{{.*?}}/ private filePath: string = '' private timerCache: number = 0 private completionMap!: { [key: string]: CompletionItem[] } private linePrefix?: string public validateContext(document: TextDocument, position: Position): boolean { let isValidate = utils.dataPointContextValidator(document, position) if (isValidate) { this.filePath = document.fileName this.linePrefix = utils.getLinePrefix(document, position) } return isValidate } public async getCompletionArr() { if (!this.linePrefix) return const now = Date.now() if (now - this.timerCache > completionRefreshDelay) { const vStateDict = await tc.getVStateDict(this.filePath) if (vStateDict) { this.completionMap = {} this.generateCompletionMap('', vStateDict) this.timerCache = now } } this.parseCompletionMap(this.linePrefix) return this.completionArr } protected getCompletionItem(label: string, desp: string): CompletionItem { const compleItem = new vscode.CompletionItem(label) compleItem.kind = vscode.CompletionItemKind.Variable compleItem.detail = desp compleItem.insertText = label return compleItem } private generateCompletionMap(context: string, vStateDict: Dict) { const completion: CompletionItem[] = [] const keys = Object.keys(vStateDict) keys.forEach((key) => { const value = vStateDict[key] if (typeof value === 'object') { completion.push(this.getCompletionItem(key, JSON.stringify(value, null, 1))) this.generateCompletionMap(context + key + '.', value) } else { completion.push(this.getCompletionItem(key, value)) } }) if (context === '') { this.completionMap['_empty'] = completion } else { this.completionMap[context] = completion } } private parseCompletionMap(linePrefix: string) { let completionArr: CompletionItem[] = [] if (linePrefix.includes('.')) { // 关系补全 const keys = Object.keys(this.completionMap) for (let i = 0; i < keys.length; i++) { const key = keys[i] if (linePrefix.endsWith(key)) { completionArr = this.completionMap[key] } } } else { // 非关系补全 completionArr = this.completionMap['_empty'] } this.completionArr = completionArr } }