diff options
Diffstat (limited to 'modules/gdscript/gdscript_parser.h')
-rw-r--r-- | modules/gdscript/gdscript_parser.h | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h index 23b8fc249c..4e9f750a2d 100644 --- a/modules/gdscript/gdscript_parser.h +++ b/modules/gdscript/gdscript_parser.h @@ -44,6 +44,7 @@ #include "core/vector.h" #include "gdscript_functions.h" #include "gdscript_tokenizer.h" +#include "gdscript_warning.h" #ifdef DEBUG_ENABLED #include "core/string_builder.h" @@ -101,7 +102,7 @@ public: CLASS, // GDScript. VARIANT, // Can be any type. UNRESOLVED, - // TODO: Enum, Signal, Callable + // TODO: Enum }; Kind kind = UNRESOLVED; @@ -366,7 +367,7 @@ public: struct CallNode : public ExpressionNode { ExpressionNode *callee = nullptr; Vector<ExpressionNode *> arguments; - StringName function_name; // TODO: Set this. + StringName function_name; bool is_super = false; CallNode() { @@ -388,6 +389,9 @@ public: IdentifierNode *identifier = nullptr; LiteralNode *custom_value = nullptr; int value = 0; + int line = 0; + int leftmost_column = 0; + int rightmost_column = 0; }; IdentifierNode *identifier = nullptr; Vector<Value> values; @@ -444,6 +448,28 @@ public: return ""; } + int get_line() const { + switch (type) { + case CLASS: + return m_class->start_line; + case CONSTANT: + return constant->start_line; + case FUNCTION: + return function->start_line; + case VARIABLE: + return variable->start_line; + case ENUM_VALUE: + return enum_value.line; + case ENUM: + return m_enum->start_line; + case SIGNAL: + return signal->start_line; + case UNDEFINED: + ERR_FAIL_V_MSG(-1, "Reaching undefined member type."); + } + ERR_FAIL_V_MSG(-1, "Reaching unhandled type."); + } + DataType get_datatype() const { switch (type) { case CLASS: @@ -462,9 +488,16 @@ public: type.builtin_type = Variant::INT; return type; } + case SIGNAL: { + DataType type; + type.type_source = DataType::ANNOTATED_EXPLICIT; + type.kind = DataType::BUILTIN; + type.builtin_type = Variant::SIGNAL; + // TODO: Add parameter info. + return type; + } case ENUM: - case SIGNAL: - // TODO: Use special datatype kinds for these. + // TODO: Use special datatype kinds for this. return DataType(); case UNDEFINED: return DataType(); @@ -545,6 +578,7 @@ public: ExpressionNode *initializer = nullptr; TypeNode *datatype_specifier = nullptr; bool infer_datatype = false; + int usages = 0; ConstantNode() { type = CONSTANT; @@ -594,6 +628,7 @@ public: bool is_static = false; bool is_coroutine = false; MultiplayerAPI::RPCMode rpc_mode = MultiplayerAPI::RPC_MODE_DISABLED; + MethodInfo info; bool resolved_signature = false; bool resolved_body = false; @@ -634,6 +669,8 @@ public: IdentifierNode *bind_source; }; + int usages = 0; // Useful for binds/iterator variable. + IdentifierNode() { type = IDENTIFIER; } @@ -669,6 +706,7 @@ public: struct MatchBranchNode : public Node { Vector<PatternNode *> patterns; SuiteNode *block; + bool has_wildcard = false; MatchBranchNode() { type = MATCH_BRANCH; @@ -680,6 +718,7 @@ public: ExpressionNode *default_value = nullptr; TypeNode *datatype_specifier = nullptr; bool infer_datatype = false; + int usages = 0; ParameterNode() { type = PARAMETER; @@ -836,6 +875,10 @@ public: IfNode *parent_if = nullptr; PatternNode *parent_pattern = nullptr; + bool has_return = false; + bool has_continue = false; + bool has_unreachable_code = false; // Just so warnings aren't given more than once per block. + bool has_local(const StringName &p_name) const; const Local &get_local(const StringName &p_name) const; template <class T> @@ -916,6 +959,8 @@ public: bool onready = false; PropertyInfo export_info; MultiplayerAPI::RPCMode rpc_mode = MultiplayerAPI::RPC_MODE_DISABLED; + int assignments = 0; + int usages = 0; VariableNode() { type = VARIABLE; @@ -940,11 +985,15 @@ private: bool panic_mode = false; bool can_break = false; bool can_continue = false; + bool is_ignoring_warnings = false; List<bool> multiline_stack; ClassNode *head = nullptr; Node *list = nullptr; List<ParserError> errors; + List<GDScriptWarning> warnings; + Set<String> ignored_warnings; + Set<int> unsafe_lines; GDScriptTokenizer tokenizer; GDScriptTokenizer::Token previous; @@ -974,8 +1023,6 @@ private: HashMap<StringName, AnnotationInfo> valid_annotations; List<AnnotationNode *> annotation_stack; - Set<int> unsafe_lines; - typedef ExpressionNode *(GDScriptParser::*ParseFunction)(ExpressionNode *p_previous_operand, bool p_can_assign); // Higher value means higher precedence (i.e. is evaluated first). enum Precedence { @@ -1015,6 +1062,8 @@ private: T *alloc_node(); void clear(); void push_error(const String &p_message, const Node *p_origin = nullptr); + void push_warning(const Node *p_source, GDScriptWarning::Code p_code, const String &p_symbol1 = String(), const String &p_symbol2 = String(), const String &p_symbol3 = String(), const String &p_symbol4 = String()); + void push_warning(const Node *p_source, GDScriptWarning::Code p_code, const Vector<String> &p_symbols); GDScriptTokenizer::Token advance(); bool match(GDScriptTokenizer::Token::Type p_token_type); @@ -1104,6 +1153,7 @@ public: static GDScriptFunctions::Function get_builtin_function(const StringName &p_name); const List<ParserError> &get_errors() const { return errors; } + const List<GDScriptWarning> &get_warnings() const { return warnings; } const List<String> get_dependencies() const { // TODO: Keep track of deps. return List<String>(); |