Browse Source

lsp: Send godot class tree to clients

Geequlim 5 năm trước cách đây
mục cha
commit
1ab34bc3c2

+ 16 - 0
modules/gdscript/language_server/gdscript_language_protocol.cpp

@@ -134,6 +134,22 @@ Dictionary GDScriptLanguageProtocol::initialize(const Dictionary &p_params) {
 }
 
 void GDScriptLanguageProtocol::initialized(const Variant &p_params) {
+
+	lsp::GodotCapabilities capabilities;
+
+	DocData *doc = EditorHelp::get_doc_data();
+	for (Map<String, DocData::ClassDoc>::Element *E = doc->class_list.front(); E; E = E->next()) {
+
+		lsp::GodotNativeClassInfo gdclass;
+		gdclass.name = E->get().name;
+		gdclass.class_doc = &(E->get());
+		if (ClassDB::ClassInfo *ptr = ClassDB::classes.getptr(StringName(E->get().name))) {
+			gdclass.class_info = ptr;
+		}
+		capabilities.native_classes.push_back(gdclass);
+	}
+
+	notify_client("gdscript/capabilities", capabilities.to_json());
 }
 
 void GDScriptLanguageProtocol::poll() {

+ 36 - 1
modules/gdscript/language_server/lsp.hpp

@@ -31,7 +31,9 @@
 #ifndef GODOT_LSP_H
 #define GODOT_LSP_H
 
-#include "core/variant.h"
+#include "core/class_db.h"
+#include "core/list.h"
+#include "editor/doc/doc_data.h"
 
 namespace lsp {
 
@@ -1567,6 +1569,39 @@ struct InitializeResult {
 	}
 };
 
+struct GodotNativeClassInfo {
+
+	String name;
+	const DocData::ClassDoc *class_doc = NULL;
+	const ClassDB::ClassInfo *class_info = NULL;
+
+	Dictionary to_json() {
+		Dictionary dict;
+		dict["name"] = name;
+		dict["inherits"] = class_doc->inherits;
+		return dict;
+	}
+};
+
+/** Features not included in the standart lsp specifications */
+struct GodotCapabilities {
+
+	/**
+	 * Native class list
+	*/
+	List<GodotNativeClassInfo> native_classes;
+
+	Dictionary to_json() {
+		Dictionary dict;
+		Array classes;
+		for (List<GodotNativeClassInfo>::Element *E = native_classes.front(); E; E = E->next()) {
+			classes.push_back(E->get().to_json());
+		}
+		dict["native_classes"] = classes;
+		return dict;
+	}
+};
+
 /** Format BBCode documentation from DocData to markdown */
 static String marked_documentation(const String &p_bbcode) {