import * as vscode from 'vscode' import { SubviewNameCompletion } from './completion/SubviewNameCompletion' import { PropsCompletion } from './completion/PropsCompletion' import { SubviewDefinition } from './definition/SubviewDefinition' import { SubviewHover } from './hover/SubviewHover' import { FindFiles } from './command/FindFiles' import { COMMAND, SELECTOR_HTML } from './consts' import { SubviewPropsCompletion } from './completion/SubviewPropsCompletion' import { Formatter } from './command/Formatter' import { EventNameCompletion } from './completion/EventNameCompletion' import { SubviewMethodCompletion } from './completion/SubviewMethodCompletion' import { EventResponseCompletion } from './completion/EventResponseCompletion' import { utils } from './utils' import { VAttrCompletion } from './completion/VAttrCompletion' import { isFormatOnSave } from './readConfig' import * as path from 'path' import * as fs from 'fs' import { tc } from './helpers/TsComplier' import { fm } from './helpers/FileManage' import { SubviewAttrHover } from './hover/SubviewAttrHover' import { con } from './client/Connector' import { SlotCompletion } from './completion/SlotCompletion' import { EventHandlerDefinition } from './definition/EventHandlerDefinition' import { DataPointCompletion } from './completion/DataPointCompletion' import { VStateDefinition } from './definition/VStateDefinition' import { VMethodDefinition } from './definition/vMethodDefinition' export function activate(context: vscode.ExtensionContext) { if (!fs.existsSync(path.join(fm.getRootPath() || '', './winged.js'))) return const svNameComplet = new SubviewNameCompletion() const svDefinition = new SubviewDefinition() const ehDefinition = new EventHandlerDefinition() const vsDefinition = new VStateDefinition() const vmDefinition = new VMethodDefinition() const svHover = new SubviewHover() const findFiles = new FindFiles({ command: COMMAND.FIND, text: '$(search) Winged Finder', color: '#E5C07B', }) const dpComplet = new DataPointCompletion() const propsComplet = new PropsCompletion() const svPropsComplet = new SubviewPropsCompletion() const formatter = new Formatter() const eventNameComplet = new EventNameCompletion() const svMethodComplet = new SubviewMethodCompletion() const eventResComplet = new EventResponseCompletion() const slotComplet = new SlotCompletion(svNameComplet) const attrComplet = new VAttrCompletion() const svAttrHover = new SubviewAttrHover() // 基础补全 const provider1 = vscode.languages.registerCompletionItemProvider(SELECTOR_HTML, { async provideCompletionItems(document, position) { // 数据绑定点补全 if (dpComplet.validateContext(document, position)) { if (propsComplet.validateContext(document, position)) { // props.xxx 补全 const linePrefix = utils.getLinePrefix(document, position) return await propsComplet.getPropsRelateCompletion(document.fileName, linePrefix) } // vState 补全 return await dpComplet.getCompletionArr() } if (svPropsComplet.validateContext(document, position)) { if (svPropsComplet.validateType === 'comp') { // 组件 attr 补全 return await svPropsComplet.getCompletionArr() } else if (svPropsComplet.validateType === 'other') { // 组件名称补全 return svNameComplet.filterWithCache(document.fileName) } } // 没有根节点时,补全 layout 组件 if (document.getText().trim().length === 0) { return svNameComplet.filterWithCache(document.fileName) } }, }, '.') // HTML<=>HTML 文件之间的跳转 const provider2 = vscode.languages.registerDefinitionProvider(SELECTOR_HTML, { async provideDefinition(document, position) { const word = utils.getWord(document, position) return await svDefinition.getHtmlLocation(word) }, }) // HTML => TS 文件之间的跳转,与 HTML 之间跳转并行注册(上下文校验顺序不可随意修改) const provider3 = vscode.languages.registerDefinitionProvider(SELECTOR_HTML, { async provideDefinition(document, position) { const word = utils.getWord(document, position) if (svDefinition.validateContext(word)) { // 子视图跳转 return await svDefinition.getTsLocation(word) } else if (vsDefinition.validateContext(document, position)) { // vState 跳转 return await vsDefinition.getLocation() } if (vmDefinition.validateContext(word, document, position)) { // vMethod 跳转 return await vmDefinition.getLocation() } if (ehDefinition.validateContext(word, document, position)) { // eventHandler 跳转 return await ehDefinition.getLocation() } }, }) // 单词悬停 const provider4 = vscode.languages.registerHoverProvider(SELECTOR_HTML, { async provideHover(document, position) { const word = utils.getWord(document, position) if (fm.validateCompName(word)) { return await svHover.getHover(word, svNameComplet.completionArr) } const res = tc.validateTagRange(document, position) if (res && res.type === 'comp') { if (fm.validateCompName(res.name)) { return await svAttrHover.getHover(word, res.name) } } return null }, }) // 命令: Winged: Find Related View Files const provider5 = vscode.commands.registerTextEditorCommand(COMMAND.FIND, (textEditor) => { findFiles.handleCommand(textEditor.document.fileName) }) // 命令: Winged: Formatter const provider7 = vscode.commands.registerTextEditorCommand(COMMAND.FORMAT, (textEditor, edit) => { const document = textEditor.document // try { // formatter.handleCommand(document, edit) // diagnostic.clearErr() // } catch (error) { // diagnostic.handleFormatErr(document, error) // } formatter.handleCommand(document, edit) }) // 关联补全,当键入':'时触发 const provider8 = vscode.languages.registerCompletionItemProvider( SELECTOR_HTML, { async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) { // eventName补全 if (eventNameComplet.validateContext(document, position)) { return await eventNameComplet.getCompletionArr(eventResComplet, document, position) } // method补全 if (svMethodComplet.validateContext(document, position)) { return await svMethodComplet.getCompletionArr(document, position) } // 事件响应补全 if (eventResComplet.validateContext(document, position)) { const linePrefix = utils.getLinePrefix(document, position) return await eventResComplet.getCompletionArr(linePrefix) } // Slot节点的属性补全 if (slotComplet.validateContext(document, position)) { return slotComplet.getCompletionArr() } }, }, ':' ) // 每次保存时触发诊断+格式化 const provider9 = vscode.workspace.onWillSaveTextDocument(() => { if (!isFormatOnSave) return vscode.commands.executeCommand(COMMAND.FORMAT) }) // @补全 => @bind|catch... const provider10 = vscode.languages.registerCompletionItemProvider( SELECTOR_HTML, { async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) { if (attrComplet.validateContext(document, position)) { if (attrComplet.validataType && attrComplet.validataType !== 'other') { return attrComplet.completionArr } } }, }, '@' ) con.connect() const provider11 = vscode.commands.registerCommand(COMMAND.RESTART, () => { con.reStart() }) // html寻找引用 依赖于 connect2cli const provider12 = vscode.languages.registerReferenceProvider(SELECTOR_HTML, { provideReferences(document, position) { const word = utils.getWord(document, position) if (svDefinition.validateContext(word)) { return svDefinition.getHtmlReference(word) } return [] } }) // 订阅 provider context.subscriptions.push( provider1, provider2, provider3, provider4, provider5, provider7, provider8, provider9, provider10, provider11, provider12 ) } // tslint:disable-next-line: no-empty export function deactivate() { }