Browse Source

Merge pull request #105087 from HolonProduction/lsp-annotations

LSP: Extract annotations from `EditorHelp`
Thaddeus Crews 2 months ago
parent
commit
9b22b41531
1 changed files with 27 additions and 10 deletions
  1. 27 10
      modules/gdscript/language_server/gdscript_workspace.cpp

+ 27 - 10
modules/gdscript/language_server/gdscript_workspace.cpp

@@ -156,7 +156,12 @@ const LSP::DocumentSymbol *GDScriptWorkspace::get_native_symbol(const String &p_
 				}
 			}
 		}
-		class_name = ClassDB::get_parent_class(class_name);
+		// Might contain pseudo classes like @GDScript that only exist in documentation.
+		if (ClassDB::class_exists(class_name)) {
+			class_name = ClassDB::get_parent_class(class_name);
+		} else {
+			break;
+		}
 	}
 
 	return nullptr;
@@ -343,20 +348,32 @@ Error GDScriptWorkspace::initialize() {
 			class_symbol.children.push_back(symbol);
 		}
 
-		Vector<DocData::MethodDoc> methods_signals;
-		methods_signals.append_array(class_data.constructors);
-		methods_signals.append_array(class_data.methods);
-		methods_signals.append_array(class_data.operators);
-		const int signal_start_idx = methods_signals.size();
-		methods_signals.append_array(class_data.signals);
+		Vector<DocData::MethodDoc> method_likes;
+		method_likes.append_array(class_data.methods);
+		method_likes.append_array(class_data.annotations);
+		const int constructors_start_idx = method_likes.size();
+		method_likes.append_array(class_data.constructors);
+		const int operator_start_idx = method_likes.size();
+		method_likes.append_array(class_data.operators);
+		const int signal_start_idx = method_likes.size();
+		method_likes.append_array(class_data.signals);
 
-		for (int i = 0; i < methods_signals.size(); i++) {
-			const DocData::MethodDoc &data = methods_signals[i];
+		for (int i = 0; i < method_likes.size(); i++) {
+			const DocData::MethodDoc &data = method_likes[i];
 
 			LSP::DocumentSymbol symbol;
 			symbol.name = data.name;
 			symbol.native_class = class_name;
-			symbol.kind = i >= signal_start_idx ? LSP::SymbolKind::Event : LSP::SymbolKind::Method;
+
+			if (i >= signal_start_idx) {
+				symbol.kind = LSP::SymbolKind::Event;
+			} else if (i >= operator_start_idx) {
+				symbol.kind = LSP::SymbolKind::Operator;
+			} else if (i >= constructors_start_idx) {
+				symbol.kind = LSP::SymbolKind::Constructor;
+			} else {
+				symbol.kind = LSP::SymbolKind::Method;
+			}
 
 			String params = "";
 			bool arg_default_value_started = false;