Просмотр исходного кода

Fix completion for the raw `get_node` call

Yuri Rubinsky 2 лет назад
Родитель
Сommit
20660bb23a
1 измененных файлов с 47 добавлено и 35 удалено
  1. 47 35
      modules/gdscript/gdscript_editor.cpp

+ 47 - 35
modules/gdscript/gdscript_editor.cpp

@@ -2512,50 +2512,62 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
 }
 
 static bool _get_subscript_type(GDScriptParser::CompletionContext &p_context, const GDScriptParser::SubscriptNode *p_subscript, GDScriptParser::DataType &r_base_type, Variant *r_base = nullptr) {
-	if (p_subscript->base->type == GDScriptParser::Node::IDENTIFIER && p_context.base != nullptr) {
-		const GDScriptParser::GetNodeNode *get_node = nullptr;
-		const GDScriptParser::IdentifierNode *identifier_node = static_cast<GDScriptParser::IdentifierNode *>(p_subscript->base);
+	if (p_context.base == nullptr) {
+		return false;
+	}
+	const GDScriptParser::GetNodeNode *get_node = nullptr;
+
+	switch (p_subscript->base->type) {
+		case GDScriptParser::Node::GET_NODE: {
+			get_node = static_cast<GDScriptParser::GetNodeNode *>(p_subscript->base);
+		} break;
 
-		switch (identifier_node->source) {
-			case GDScriptParser::IdentifierNode::Source::MEMBER_VARIABLE: {
-				if (p_context.current_class != nullptr) {
-					const StringName &member_name = identifier_node->name;
-					const GDScriptParser::ClassNode *current_class = p_context.current_class;
+		case GDScriptParser::Node::IDENTIFIER: {
+			const GDScriptParser::IdentifierNode *identifier_node = static_cast<GDScriptParser::IdentifierNode *>(p_subscript->base);
 
-					if (current_class->has_member(member_name)) {
-						const GDScriptParser::ClassNode::Member &member = current_class->get_member(member_name);
+			switch (identifier_node->source) {
+				case GDScriptParser::IdentifierNode::Source::MEMBER_VARIABLE: {
+					if (p_context.current_class != nullptr) {
+						const StringName &member_name = identifier_node->name;
+						const GDScriptParser::ClassNode *current_class = p_context.current_class;
 
-						if (member.type == GDScriptParser::ClassNode::Member::VARIABLE) {
-							const GDScriptParser::VariableNode *variable = static_cast<GDScriptParser::VariableNode *>(member.variable);
+						if (current_class->has_member(member_name)) {
+							const GDScriptParser::ClassNode::Member &member = current_class->get_member(member_name);
 
-							if (variable->initializer && variable->initializer->type == GDScriptParser::Node::GET_NODE) {
-								get_node = static_cast<GDScriptParser::GetNodeNode *>(variable->initializer);
+							if (member.type == GDScriptParser::ClassNode::Member::VARIABLE) {
+								const GDScriptParser::VariableNode *variable = static_cast<GDScriptParser::VariableNode *>(member.variable);
+
+								if (variable->initializer && variable->initializer->type == GDScriptParser::Node::GET_NODE) {
+									get_node = static_cast<GDScriptParser::GetNodeNode *>(variable->initializer);
+								}
 							}
 						}
 					}
-				}
-			} break;
-			case GDScriptParser::IdentifierNode::Source::LOCAL_VARIABLE: {
-				if (identifier_node->next != nullptr && identifier_node->next->type == GDScriptParser::ClassNode::Node::GET_NODE) {
-					get_node = static_cast<GDScriptParser::GetNodeNode *>(identifier_node->next);
-				}
-			} break;
-			default:
-				break;
-		}
+				} break;
+				case GDScriptParser::IdentifierNode::Source::LOCAL_VARIABLE: {
+					if (identifier_node->next != nullptr && identifier_node->next->type == GDScriptParser::ClassNode::Node::GET_NODE) {
+						get_node = static_cast<GDScriptParser::GetNodeNode *>(identifier_node->next);
+					}
+				} break;
+				default: {
+				} break;
+			}
+		} break;
+		default: {
+		} break;
+	}
 
-		if (get_node != nullptr) {
-			const Object *node = p_context.base->call("get_node_or_null", NodePath(get_node->full_path));
-			if (node != nullptr) {
-				if (r_base != nullptr) {
-					*r_base = node;
-				}
-				r_base_type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
-				r_base_type.kind = GDScriptParser::DataType::NATIVE;
-				r_base_type.native_type = node->get_class_name();
-				r_base_type.builtin_type = Variant::OBJECT;
-				return true;
+	if (get_node != nullptr) {
+		const Object *node = p_context.base->call("get_node_or_null", NodePath(get_node->full_path));
+		if (node != nullptr) {
+			if (r_base != nullptr) {
+				*r_base = node;
 			}
+			r_base_type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
+			r_base_type.kind = GDScriptParser::DataType::NATIVE;
+			r_base_type.native_type = node->get_class_name();
+			r_base_type.builtin_type = Variant::OBJECT;
+			return true;
 		}
 	}