diff options
Diffstat (limited to 'modules/gdscript/language_server')
6 files changed, 84 insertions, 102 deletions
| diff --git a/modules/gdscript/language_server/gdscript_extend_parser.cpp b/modules/gdscript/language_server/gdscript_extend_parser.cpp index 5516f59fe9..d3c5fed95a 100644 --- a/modules/gdscript/language_server/gdscript_extend_parser.cpp +++ b/modules/gdscript/language_server/gdscript_extend_parser.cpp @@ -89,16 +89,16 @@ void ExtendGDScriptParser::update_symbols() {  		for (int i = 0; i < class_symbol.children.size(); i++) {  			const lsp::DocumentSymbol &symbol = class_symbol.children[i]; -			members.set(symbol.name, &symbol); +			members.insert(symbol.name, &symbol);  			// cache level one inner classes  			if (symbol.kind == lsp::SymbolKind::Class) {  				ClassMembers inner_class;  				for (int j = 0; j < symbol.children.size(); j++) {  					const lsp::DocumentSymbol &s = symbol.children[j]; -					inner_class.set(s.name, &s); +					inner_class.insert(s.name, &s);  				} -				inner_classes.set(symbol.name, inner_class); +				inner_classes.insert(symbol.name, inner_class);  			}  		}  	} @@ -216,8 +216,8 @@ void ExtendGDScriptParser::parse_class_symbol(const GDScriptParser::ClassNode *p  					if (res.is_valid() && !res->get_path().is_empty()) {  						value_text = "preload(\"" + res->get_path() + "\")";  						if (symbol.documentation.is_empty()) { -							if (Map<String, ExtendGDScriptParser *>::Element *S = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(res->get_path())) { -								symbol.documentation = S->get()->class_symbol.documentation; +							if (HashMap<String, ExtendGDScriptParser *>::Iterator S = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(res->get_path())) { +								symbol.documentation = S->value->class_symbol.documentation;  							}  						}  					} else { @@ -661,30 +661,22 @@ const List<lsp::DocumentLink> &ExtendGDScriptParser::get_document_links() const  const Array &ExtendGDScriptParser::get_member_completions() {  	if (member_completions.is_empty()) { -		const String *name = members.next(nullptr); -		while (name) { -			const lsp::DocumentSymbol *symbol = members.get(*name); +		for (const KeyValue<String, const lsp::DocumentSymbol *> &E : members) { +			const lsp::DocumentSymbol *symbol = E.value;  			lsp::CompletionItem item = symbol->make_completion_item(); -			item.data = JOIN_SYMBOLS(path, *name); +			item.data = JOIN_SYMBOLS(path, E.key);  			member_completions.push_back(item.to_json()); - -			name = members.next(name);  		} -		const String *_class = inner_classes.next(nullptr); -		while (_class) { -			const ClassMembers *inner_class = inner_classes.getptr(*_class); -			const String *member_name = inner_class->next(nullptr); -			while (member_name) { -				const lsp::DocumentSymbol *symbol = inner_class->get(*member_name); +		for (const KeyValue<String, ClassMembers> &E : inner_classes) { +			const ClassMembers *inner_class = &E.value; + +			for (const KeyValue<String, const lsp::DocumentSymbol *> &F : *inner_class) { +				const lsp::DocumentSymbol *symbol = F.value;  				lsp::CompletionItem item = symbol->make_completion_item(); -				item.data = JOIN_SYMBOLS(path, JOIN_SYMBOLS(*_class, *member_name)); +				item.data = JOIN_SYMBOLS(path, JOIN_SYMBOLS(E.key, F.key));  				member_completions.push_back(item.to_json()); - -				member_name = inner_class->next(member_name);  			} - -			_class = inner_classes.next(_class);  		}  	} diff --git a/modules/gdscript/language_server/gdscript_language_protocol.cpp b/modules/gdscript/language_server/gdscript_language_protocol.cpp index cdddab319d..7460f8edff 100644 --- a/modules/gdscript/language_server/gdscript_language_protocol.cpp +++ b/modules/gdscript/language_server/gdscript_language_protocol.cpp @@ -126,7 +126,7 @@ Error GDScriptLanguageProtocol::on_client_connected() {  	ERR_FAIL_COND_V_MSG(clients.size() >= LSP_MAX_CLIENTS, FAILED, "Max client limits reached");  	Ref<LSPeer> peer = memnew(LSPeer);  	peer->connection = tcp_peer; -	clients.set(next_client_id, peer); +	clients.insert(next_client_id, peer);  	next_client_id++;  	EditorNode::get_log()->add_message("[LSP] Connection Taken", EditorLog::MSG_TYPE_EDITOR);  	return OK; @@ -229,28 +229,33 @@ void GDScriptLanguageProtocol::poll() {  	if (server->is_connection_available()) {  		on_client_connected();  	} -	const int *id = nullptr; -	while ((id = clients.next(id))) { -		Ref<LSPeer> peer = clients.get(*id); + +	HashMap<int, Ref<LSPeer>>::Iterator E = clients.begin(); +	while (E != clients.end()) { +		Ref<LSPeer> peer = E->value;  		StreamPeerTCP::Status status = peer->connection->get_status();  		if (status == StreamPeerTCP::STATUS_NONE || status == StreamPeerTCP::STATUS_ERROR) { -			on_client_disconnected(*id); -			id = nullptr; +			on_client_disconnected(E->key); +			E = clients.begin(); +			continue;  		} else {  			if (peer->connection->get_available_bytes() > 0) { -				latest_client_id = *id; +				latest_client_id = E->key;  				Error err = peer->handle_data();  				if (err != OK && err != ERR_BUSY) { -					on_client_disconnected(*id); -					id = nullptr; +					on_client_disconnected(E->key); +					E = clients.begin(); +					continue;  				}  			}  			Error err = peer->send_data();  			if (err != OK && err != ERR_BUSY) { -				on_client_disconnected(*id); -				id = nullptr; +				on_client_disconnected(E->key); +				E = clients.begin(); +				continue;  			}  		} +		++E;  	}  } @@ -259,9 +264,8 @@ Error GDScriptLanguageProtocol::start(int p_port, const IPAddress &p_bind_ip) {  }  void GDScriptLanguageProtocol::stop() { -	const int *id = nullptr; -	while ((id = clients.next(id))) { -		Ref<LSPeer> peer = clients.get(*id); +	for (const KeyValue<int, Ref<LSPeer>> &E : clients) { +		Ref<LSPeer> peer = clients.get(E.key);  		peer->connection->disconnect_from_host();  	} diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp index c42bd58aeb..d763701911 100644 --- a/modules/gdscript/language_server/gdscript_text_document.cpp +++ b/modules/gdscript/language_server/gdscript_text_document.cpp @@ -109,23 +109,15 @@ void GDScriptTextDocument::notify_client_show_symbol(const lsp::DocumentSymbol *  void GDScriptTextDocument::initialize() {  	if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) { -		const HashMap<StringName, ClassMembers> &native_members = GDScriptLanguageProtocol::get_singleton()->get_workspace()->native_members; +		for (const KeyValue<StringName, ClassMembers> &E : GDScriptLanguageProtocol::get_singleton()->get_workspace()->native_members) { +			const ClassMembers &members = E.value; -		const StringName *class_ptr = native_members.next(nullptr); -		while (class_ptr) { -			const ClassMembers &members = native_members.get(*class_ptr); - -			const String *name = members.next(nullptr); -			while (name) { -				const lsp::DocumentSymbol *symbol = members.get(*name); +			for (const KeyValue<String, const lsp::DocumentSymbol *> &F : members) { +				const lsp::DocumentSymbol *symbol = members.get(F.key);  				lsp::CompletionItem item = symbol->make_completion_item(); -				item.data = JOIN_SYMBOLS(String(*class_ptr), *name); +				item.data = JOIN_SYMBOLS(String(E.key), F.key);  				native_member_completions.push_back(item.to_json()); - -				name = members.next(name);  			} - -			class_ptr = native_members.next(class_ptr);  		}  	}  } @@ -149,9 +141,9 @@ Array GDScriptTextDocument::documentSymbol(const Dictionary &p_params) {  	String uri = params["uri"];  	String path = GDScriptLanguageProtocol::get_singleton()->get_workspace()->get_file_path(uri);  	Array arr; -	if (const Map<String, ExtendGDScriptParser *>::Element *parser = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(path)) { +	if (HashMap<String, ExtendGDScriptParser *>::ConstIterator parser = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(path)) {  		Vector<lsp::DocumentedSymbolInformation> list; -		parser->get()->get_symbols().symbol_tree_as_list(uri, list); +		parser->value->get_symbols().symbol_tree_as_list(uri, list);  		for (int i = 0; i < list.size(); i++) {  			arr.push_back(list[i].to_json());  		} @@ -275,8 +267,8 @@ Dictionary GDScriptTextDocument::resolve(const Dictionary &p_params) {  			}  			if (!symbol) { -				if (const Map<String, ExtendGDScriptParser *>::Element *E = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(class_name)) { -					symbol = E->get()->get_member_symbol(member_name, inner_class_name); +				if (HashMap<String, ExtendGDScriptParser *>::ConstIterator E = GDScriptLanguageProtocol::get_singleton()->get_workspace()->scripts.find(class_name)) { +					symbol = E->value->get_member_symbol(member_name, inner_class_name);  				}  			}  		} diff --git a/modules/gdscript/language_server/gdscript_workspace.cpp b/modules/gdscript/language_server/gdscript_workspace.cpp index 89ee6b35e5..8d484a43b3 100644 --- a/modules/gdscript/language_server/gdscript_workspace.cpp +++ b/modules/gdscript/language_server/gdscript_workspace.cpp @@ -116,22 +116,22 @@ void GDScriptWorkspace::did_delete_files(const Dictionary &p_params) {  }  void GDScriptWorkspace::remove_cache_parser(const String &p_path) { -	Map<String, ExtendGDScriptParser *>::Element *parser = parse_results.find(p_path); -	Map<String, ExtendGDScriptParser *>::Element *script = scripts.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::Iterator parser = parse_results.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::Iterator script = scripts.find(p_path);  	if (parser && script) { -		if (script->get() && script->get() == parser->get()) { -			memdelete(script->get()); +		if (script->value && script->value == parser->value) { +			memdelete(script->value);  		} else { -			memdelete(script->get()); -			memdelete(parser->get()); +			memdelete(script->value); +			memdelete(parser->value);  		}  		parse_results.erase(p_path);  		scripts.erase(p_path);  	} else if (parser) { -		memdelete(parser->get()); +		memdelete(parser->value);  		parse_results.erase(p_path);  	} else if (script) { -		memdelete(script->get()); +		memdelete(script->value);  		scripts.erase(p_path);  	}  } @@ -141,8 +141,8 @@ const lsp::DocumentSymbol *GDScriptWorkspace::get_native_symbol(const String &p_  	StringName empty;  	while (class_name != empty) { -		if (const Map<StringName, lsp::DocumentSymbol>::Element *E = native_symbols.find(class_name)) { -			const lsp::DocumentSymbol &class_symbol = E->value(); +		if (HashMap<StringName, lsp::DocumentSymbol>::ConstIterator E = native_symbols.find(class_name)) { +			const lsp::DocumentSymbol &class_symbol = E->value;  			if (p_member.is_empty()) {  				return &class_symbol; @@ -162,9 +162,9 @@ const lsp::DocumentSymbol *GDScriptWorkspace::get_native_symbol(const String &p_  }  const lsp::DocumentSymbol *GDScriptWorkspace::get_script_symbol(const String &p_path) const { -	const Map<String, ExtendGDScriptParser *>::Element *S = scripts.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::ConstIterator S = scripts.find(p_path);  	if (S) { -		return &(S->get()->get_symbols()); +		return &(S->value->get_symbols());  	}  	return nullptr;  } @@ -209,10 +209,10 @@ void GDScriptWorkspace::reload_all_workspace_scripts() {  		err = parse_script(path, content);  		if (err != OK) { -			Map<String, ExtendGDScriptParser *>::Element *S = parse_results.find(path); +			HashMap<String, ExtendGDScriptParser *>::Iterator S = parse_results.find(path);  			String err_msg = "Failed parse script " + path;  			if (S) { -				err_msg += "\n" + S->get()->get_errors()[0].message; +				err_msg += "\n" + S->value->get_errors()[0].message;  			}  			ERR_CONTINUE_MSG(err != OK, err_msg);  		} @@ -238,25 +238,25 @@ void GDScriptWorkspace::list_script_files(const String &p_root_dir, List<String>  }  ExtendGDScriptParser *GDScriptWorkspace::get_parse_successed_script(const String &p_path) { -	const Map<String, ExtendGDScriptParser *>::Element *S = scripts.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::Iterator S = scripts.find(p_path);  	if (!S) {  		parse_local_script(p_path);  		S = scripts.find(p_path);  	}  	if (S) { -		return S->get(); +		return S->value;  	}  	return nullptr;  }  ExtendGDScriptParser *GDScriptWorkspace::get_parse_result(const String &p_path) { -	const Map<String, ExtendGDScriptParser *>::Element *S = parse_results.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::Iterator S = parse_results.find(p_path);  	if (!S) {  		parse_local_script(p_path);  		S = parse_results.find(p_path);  	}  	if (S) { -		return S->get(); +		return S->value;  	}  	return nullptr;  } @@ -404,9 +404,9 @@ Error GDScriptWorkspace::initialize() {  			const lsp::DocumentSymbol &class_symbol = E.value;  			for (int i = 0; i < class_symbol.children.size(); i++) {  				const lsp::DocumentSymbol &symbol = class_symbol.children[i]; -				members.set(symbol.name, &symbol); +				members.insert(symbol.name, &symbol);  			} -			native_members.set(E.key, members); +			native_members.insert(E.key, members);  		}  		// cache member completions @@ -424,8 +424,8 @@ Error GDScriptWorkspace::initialize() {  Error GDScriptWorkspace::parse_script(const String &p_path, const String &p_content) {  	ExtendGDScriptParser *parser = memnew(ExtendGDScriptParser);  	Error err = parser->parse(p_content, p_path); -	Map<String, ExtendGDScriptParser *>::Element *last_parser = parse_results.find(p_path); -	Map<String, ExtendGDScriptParser *>::Element *last_script = scripts.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::Iterator last_parser = parse_results.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::Iterator last_script = scripts.find(p_path);  	if (err == OK) {  		remove_cache_parser(p_path); @@ -433,8 +433,8 @@ Error GDScriptWorkspace::parse_script(const String &p_path, const String &p_cont  		scripts[p_path] = parser;  	} else { -		if (last_parser && last_script && last_parser->get() != last_script->get()) { -			memdelete(last_parser->get()); +		if (last_parser && last_script && last_parser->value != last_script->value) { +			memdelete(last_parser->value);  		}  		parse_results[p_path] = parser;  	} @@ -513,9 +513,9 @@ String GDScriptWorkspace::get_file_uri(const String &p_path) const {  void GDScriptWorkspace::publish_diagnostics(const String &p_path) {  	Dictionary params;  	Array errors; -	const Map<String, ExtendGDScriptParser *>::Element *ele = parse_results.find(p_path); +	HashMap<String, ExtendGDScriptParser *>::ConstIterator ele = parse_results.find(p_path);  	if (ele) { -		const Vector<lsp::Diagnostic> &list = ele->get()->get_diagnostics(); +		const Vector<lsp::Diagnostic> &list = ele->value->get_diagnostics();  		errors.resize(list.size());  		for (int i = 0; i < list.size(); ++i) {  			errors[i] = list[i].to_json(); @@ -682,13 +682,11 @@ void GDScriptWorkspace::resolve_related_symbols(const lsp::TextDocumentPositionP  		Vector2i offset;  		symbol_identifier = parser->get_identifier_under_position(p_doc_pos.position, offset); -		const StringName *class_ptr = native_members.next(nullptr); -		while (class_ptr) { -			const ClassMembers &members = native_members.get(*class_ptr); +		for (const KeyValue<StringName, ClassMembers> &E : native_members) { +			const ClassMembers &members = native_members.get(E.key);  			if (const lsp::DocumentSymbol *const *symbol = members.getptr(symbol_identifier)) {  				r_list.push_back(*symbol);  			} -			class_ptr = native_members.next(class_ptr);  		}  		for (const KeyValue<String, ExtendGDScriptParser *> &E : scripts) { @@ -698,23 +696,19 @@ void GDScriptWorkspace::resolve_related_symbols(const lsp::TextDocumentPositionP  				r_list.push_back(*symbol);  			} -			const HashMap<String, ClassMembers> &inner_classes = script->get_inner_classes(); -			const String *_class = inner_classes.next(nullptr); -			while (_class) { -				const ClassMembers *inner_class = inner_classes.getptr(*_class); +			for (const KeyValue<String, ClassMembers> &F : script->get_inner_classes()) { +				const ClassMembers *inner_class = &F.value;  				if (const lsp::DocumentSymbol *const *symbol = inner_class->getptr(symbol_identifier)) {  					r_list.push_back(*symbol);  				} - -				_class = inner_classes.next(_class);  			}  		}  	}  }  const lsp::DocumentSymbol *GDScriptWorkspace::resolve_native_symbol(const lsp::NativeSymbolInspectParams &p_params) { -	if (Map<StringName, lsp::DocumentSymbol>::Element *E = native_symbols.find(p_params.native_class)) { -		const lsp::DocumentSymbol &symbol = E->get(); +	if (HashMap<StringName, lsp::DocumentSymbol>::Iterator E = native_symbols.find(p_params.native_class)) { +		const lsp::DocumentSymbol &symbol = E->value;  		if (p_params.symbol_name.is_empty() || p_params.symbol_name == symbol.name) {  			return &symbol;  		} @@ -790,7 +784,7 @@ GDScriptWorkspace::GDScriptWorkspace() {  }  GDScriptWorkspace::~GDScriptWorkspace() { -	Set<String> cached_parsers; +	HashSet<String> cached_parsers;  	for (const KeyValue<String, ExtendGDScriptParser *> &E : parse_results) {  		cached_parsers.insert(E.key); @@ -800,7 +794,7 @@ GDScriptWorkspace::~GDScriptWorkspace() {  		cached_parsers.insert(E.key);  	} -	for (Set<String>::Element *E = cached_parsers.front(); E; E = E->next()) { -		remove_cache_parser(E->get()); +	for (const String &E : cached_parsers) { +		remove_cache_parser(E);  	}  } diff --git a/modules/gdscript/language_server/gdscript_workspace.h b/modules/gdscript/language_server/gdscript_workspace.h index 92e78f8992..7bff5db81f 100644 --- a/modules/gdscript/language_server/gdscript_workspace.h +++ b/modules/gdscript/language_server/gdscript_workspace.h @@ -48,7 +48,7 @@ protected:  	static void _bind_methods();  	void remove_cache_parser(const String &p_path);  	bool initialized = false; -	Map<StringName, lsp::DocumentSymbol> native_symbols; +	HashMap<StringName, lsp::DocumentSymbol> native_symbols;  	const lsp::DocumentSymbol *get_native_symbol(const String &p_class, const String &p_member = "") const;  	const lsp::DocumentSymbol *get_script_symbol(const String &p_path) const; @@ -68,8 +68,8 @@ public:  	String root;  	String root_uri; -	Map<String, ExtendGDScriptParser *> scripts; -	Map<String, ExtendGDScriptParser *> parse_results; +	HashMap<String, ExtendGDScriptParser *> scripts; +	HashMap<String, ExtendGDScriptParser *> parse_results;  	HashMap<StringName, ClassMembers> native_members;  public: diff --git a/modules/gdscript/language_server/lsp.hpp b/modules/gdscript/language_server/lsp.hpp index a63f9df918..d4aa207972 100644 --- a/modules/gdscript/language_server/lsp.hpp +++ b/modules/gdscript/language_server/lsp.hpp @@ -261,7 +261,7 @@ struct WorkspaceEdit {  	/**  	 * Holds changes to existing resources.  	 */ -	Map<String, Vector<TextEdit>> changes; +	HashMap<String, Vector<TextEdit>> changes;  	_FORCE_INLINE_ void add_edit(const String &uri, const TextEdit &edit) {  		if (changes.has(uri)) { @@ -293,8 +293,8 @@ struct WorkspaceEdit {  	}  	_FORCE_INLINE_ void add_change(const String &uri, const int &line, const int &start_character, const int &end_character, const String &new_text) { -		if (Map<String, Vector<TextEdit>>::Element *E = changes.find(uri)) { -			Vector<TextEdit> edit_list = E->value(); +		if (HashMap<String, Vector<TextEdit>>::Iterator E = changes.find(uri)) { +			Vector<TextEdit> edit_list = E->value;  			for (int i = 0; i < edit_list.size(); ++i) {  				TextEdit edit = edit_list[i];  				if (edit.range.start.character == start_character) { @@ -310,8 +310,8 @@ struct WorkspaceEdit {  		new_edit.range.end.line = line;  		new_edit.range.end.character = end_character; -		if (Map<String, Vector<TextEdit>>::Element *E = changes.find(uri)) { -			E->value().push_back(new_edit); +		if (HashMap<String, Vector<TextEdit>>::Iterator E = changes.find(uri)) { +			E->value.push_back(new_edit);  		} else {  			Vector<TextEdit> edit_list;  			edit_list.push_back(new_edit); |