From 47647a05aebfbb7cf2fc7792631c7760fa6f610a Mon Sep 17 00:00:00 2001 From: geequlim Date: Fri, 4 Oct 2019 19:22:02 +0800 Subject: [PATCH] [WIP] Add NativeDocumentManager to show native symbol informations --- src/godot-tools.ts | 2 +- src/lsp/GDScriptLanguageClient.ts | 13 ++++--- src/lsp/MessageIO.ts | 3 +- src/lsp/NativeDocumentManager.ts | 65 +++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 src/lsp/NativeDocumentManager.ts diff --git a/src/godot-tools.ts b/src/godot-tools.ts index 790fa52..39f0056 100644 --- a/src/godot-tools.ts +++ b/src/godot-tools.ts @@ -17,7 +17,7 @@ export class GodotTools { constructor(p_context: vscode.ExtensionContext) { this.context = p_context; - this.client = new GDScriptLanguageClient(); + this.client = new GDScriptLanguageClient(p_context); this.client.watch_status(this.on_client_status_changed.bind(this)); this.connection_status = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right); } diff --git a/src/lsp/GDScriptLanguageClient.ts b/src/lsp/GDScriptLanguageClient.ts index ae1d55e..3df2d6f 100644 --- a/src/lsp/GDScriptLanguageClient.ts +++ b/src/lsp/GDScriptLanguageClient.ts @@ -1,11 +1,10 @@ import * as vscode from 'vscode'; -import { LanguageClient, LanguageClientOptions, ServerOptions, RequestMessage, NotificationMessage } from "vscode-languageclient"; +import { LanguageClient, LanguageClientOptions, ServerOptions, RequestMessage } from "vscode-languageclient"; import { is_debug_mode, get_configuration } from "../utils"; -import { MessageIO, MessageIOReader, MessageIOWriter } from "./MessageIO"; -import { ResponseMessage } from "vscode-jsonrpc/lib/messages"; +import { MessageIO, MessageIOReader, MessageIOWriter, Message } from "./MessageIO"; import logger from "../loggger"; import { EventEmitter } from "events"; -type Message = RequestMessage | ResponseMessage | NotificationMessage; +import NativeDocumentManager from './NativeDocumentManager'; function getClientOptions(): LanguageClientOptions { return { @@ -44,11 +43,13 @@ export default class GDScriptLanguageClient extends LanguageClient { public io: MessageIO = io; + private context: vscode.ExtensionContext; private _started : boolean = false; private _status : ClientStatus; private _status_changed_callbacks: ((v : ClientStatus)=>void)[] = []; private _initialize_request: Message = null; private message_handler: MessageHandler = null; + private native_doc_manager: NativeDocumentManager = null; public get started() : boolean { return this._started; } public get status() : ClientStatus { return this._status; } @@ -67,14 +68,16 @@ export default class GDScriptLanguageClient extends LanguageClient { } } - constructor() { + constructor(context: vscode.ExtensionContext) { super(`GDScriptLanguageClient`, serverOptions, getClientOptions()); + this.context = context; this.status = ClientStatus.PENDING; this.message_handler = new MessageHandler(); this.io.on('disconnected', this.on_disconnected.bind(this)); this.io.on('connected', this.on_connected.bind(this)); this.io.on('message', this.on_message.bind(this)); this.io.on('send_message', this.on_send_message.bind(this)); + this.native_doc_manager = new NativeDocumentManager(this.io); } connect_to_server() { diff --git a/src/lsp/MessageIO.ts b/src/lsp/MessageIO.ts index c26ccdd..c8bdca1 100644 --- a/src/lsp/MessageIO.ts +++ b/src/lsp/MessageIO.ts @@ -3,7 +3,8 @@ import { EventEmitter } from "events"; import * as WebSocket from 'ws'; import MessageBuffer from "./MessageBuffer"; import { AbstractMessageWriter, MessageWriter } from "vscode-jsonrpc/lib/messageWriter"; -import { Message } from "vscode-jsonrpc"; +import { RequestMessage, ResponseMessage, NotificationMessage } from "vscode-jsonrpc/lib/messages"; +export type Message = RequestMessage | ResponseMessage | NotificationMessage; export class MessageIO extends EventEmitter { diff --git a/src/lsp/NativeDocumentManager.ts b/src/lsp/NativeDocumentManager.ts new file mode 100644 index 0000000..794c1ce --- /dev/null +++ b/src/lsp/NativeDocumentManager.ts @@ -0,0 +1,65 @@ +import * as vscode from 'vscode'; +import { EventEmitter } from "events"; +import { MessageIO } from "./MessageIO"; +import { NotificationMessage } from "vscode-jsonrpc"; +import { DocumentSymbol } from "vscode"; +const METHOD_ID = 'gdscript/show_native_symbol'; + +class GodotNativeSymbol extends DocumentSymbol { + documentation: string; + native_class: string; +}; + +export default class NativeDocumentManager extends EventEmitter { + + constructor(io: MessageIO) { + super(); + io.on("message", (message: NotificationMessage)=>{ + if (message.method == METHOD_ID) { + this.show_native_symbol(message.params); + } + }); + } + + + private show_native_symbol(symbol: GodotNativeSymbol) { + // 创建webview + const panel = vscode.window.createWebviewPanel( + 'doc', + symbol.name, + vscode.ViewColumn.Nine, + { + enableScripts: false, // 启用JS,默认禁用 + retainContextWhenHidden: false, // webview被隐藏时保持状态,避免被重置 + } + ); + panel.title = symbol.name; + panel.webview.html = this.make_html_content(symbol); + } + + private make_html_content(symbol: GodotNativeSymbol): string { + return `${this.make_symbol_document(symbol)}`; + } + + private make_symbol_document(symbol: GodotNativeSymbol): string { + let doc = ''; + function line(text: string) { + doc += text + '\n'; + }; + + switch (symbol.kind) { + case vscode.SymbolKind.Class: { + line(`

${symbol.detail}

`); + line(`

Description

`) + line(`

${this.parse_markdown(symbol.documentation)}

`); + } break; + default: + break; + } + return doc; + } + + private parse_markdown(markdown: string): string { + return markdown; + } +}