diff options
author | Juan Linietsky <reduzio@gmail.com> | 2017-08-25 00:34:32 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2017-08-25 00:34:32 -0300 |
commit | b1c0e45b03aa14453846c9a888763077eef2476b (patch) | |
tree | dd0436d887330c110b3b768bab2398a826a4d4b7 | |
parent | a7e8aa405394c383c7d84e667c9a4165b2cfaf3b (diff) |
Implemented, The Amazing Zylann Hack (tm), fixes #10603
-rw-r--r-- | modules/gdscript/gd_editor.cpp | 14 | ||||
-rw-r--r-- | modules/gdscript/gd_parser.cpp | 2 | ||||
-rw-r--r-- | modules/gdscript/gd_parser.h | 3 |
3 files changed, 19 insertions, 0 deletions
diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp index 863009f1a7..95091831a9 100644 --- a/modules/gdscript/gd_editor.cpp +++ b/modules/gdscript/gd_editor.cpp @@ -930,6 +930,20 @@ static bool _guess_expression_type(GDCompletionContext &context, const GDParser: static bool _guess_identifier_type_in_block(GDCompletionContext &context, int p_line, const StringName &p_identifier, GDCompletionIdentifier &r_type) { + if (context.block->if_condition && context.block->if_condition->type == GDParser::Node::TYPE_OPERATOR && static_cast<const GDParser::OperatorNode *>(context.block->if_condition)->op == GDParser::OperatorNode::OP_IS) { + //is used, check if identifier is in there! this helps resolve in blocks that are (if (identifier is value)): which are very common.. + //super dirty hack, but very useful + //credit: Zylann + //TODO: this could be hacked to detect ANDed conditions too.. + const GDParser::OperatorNode *op = static_cast<const GDParser::OperatorNode *>(context.block->if_condition); + if (op->arguments[0]->type == GDParser::Node::TYPE_IDENTIFIER && static_cast<const GDParser::IdentifierNode *>(op->arguments[0])->name == p_identifier) { + //bingo + if (_guess_expression_type(context, op->arguments[1], op->line, r_type)) { + return true; + } + } + } + GDCompletionIdentifier gdi = _get_native_class(context); if (gdi.obj_type != StringName()) { bool valid; diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index de8daedb8b..0cda1701cd 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -2470,6 +2470,8 @@ void GDParser::_parse_block(BlockNode *p_block, bool p_static) { cf_if->body = alloc_node<BlockNode>(); cf_if->body->parent_block = p_block; + cf_if->body->if_condition = condition; //helps code completion + p_block->sub_blocks.push_back(cf_if->body); if (!_enter_indent_block(cf_if->body)) { diff --git a/modules/gdscript/gd_parser.h b/modules/gdscript/gd_parser.h index 8ad494cd39..177552d279 100644 --- a/modules/gdscript/gd_parser.h +++ b/modules/gdscript/gd_parser.h @@ -146,10 +146,13 @@ public: Vector<StringName> variables; Vector<int> variable_lines; + Node *if_condition; //tiny hack to improve code completion on if () blocks + //the following is useful for code completion List<BlockNode *> sub_blocks; int end_line; BlockNode() { + if_condition = NULL; type = TYPE_BLOCK; end_line = -1; parent_block = NULL; |