From cd5f2aa923c338e752ae85f03d5fc142d4c26bd2 Mon Sep 17 00:00:00 2001 From: Chaosus Date: Tue, 17 Feb 2026 19:20:06 +0300 Subject: [PATCH] Fixes for completion of shader preprocessor defines --- editor/shader/text_shader_editor.cpp | 15 ++++++++++++--- servers/rendering/shader_language.h | 1 + servers/rendering/shader_preprocessor.cpp | 15 ++++++++++++++- servers/rendering/shader_preprocessor.h | 1 + 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/editor/shader/text_shader_editor.cpp b/editor/shader/text_shader_editor.cpp index 3ca3423ea9..2b1f77cc43 100644 --- a/editor/shader/text_shader_editor.cpp +++ b/editor/shader/text_shader_editor.cpp @@ -440,9 +440,6 @@ void ShaderTextEditor::_code_complete_script(const String &p_code, Listpush_back(E); - } ShaderLanguage sl; String calltip; @@ -453,6 +450,12 @@ void ShaderTextEditor::_code_complete_script(const String &p_code, Listpush_back(E); + } + } + get_text_editor()->set_code_hint(calltip); return; } @@ -463,6 +466,12 @@ void ShaderTextEditor::_code_complete_script(const String &p_code, Listget_types(); sl.complete(code, comp_info, r_options, calltip); + if (sl.get_completion_type() == ShaderLanguage::COMPLETION_IDENTIFIER) { + for (const ScriptLanguage::CodeCompletionOption &E : pp_defines) { + r_options->push_back(E); + } + } + get_text_editor()->set_code_hint(calltip); } diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index 164a1ef467..43eb211bd2 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -1275,6 +1275,7 @@ public: String get_error_text(); Vector get_include_positions(); + CompletionType get_completion_type() const { return completion_type; } int get_error_line(); ShaderNode *get_shader(); diff --git a/servers/rendering/shader_preprocessor.cpp b/servers/rendering/shader_preprocessor.cpp index ee34504b79..e5ea5fffe5 100644 --- a/servers/rendering/shader_preprocessor.cpp +++ b/servers/rendering/shader_preprocessor.cpp @@ -636,13 +636,18 @@ void ShaderPreprocessor::process_if(Tokenizer *p_tokenizer) { void ShaderPreprocessor::process_ifdef(Tokenizer *p_tokenizer) { const int line = p_tokenizer->get_line(); + bool is_cursor = false; - String label = p_tokenizer->get_identifier(); + String label = p_tokenizer->get_identifier(&is_cursor); if (label.is_empty()) { set_error(RTR("Invalid macro name."), line); return; } + if (is_cursor) { + state->completion_show_defines = true; + } + if (!p_tokenizer->consume_empty_line()) { set_error(vformat(RTR("Invalid '%s' directive."), "ifdef"), line); return; @@ -876,6 +881,7 @@ Error ShaderPreprocessor::expand_condition(const String &p_string, int p_line, S switch (p_string[i]) { case CURSOR: state->completion_type = COMPLETION_TYPE_CONDITION; + state->completion_show_defines = true; break; case '(': bracket_start_count++; @@ -1417,6 +1423,13 @@ Error ShaderPreprocessor::preprocess(const String &p_code, const String &p_filen } } + if (state->completion_show_defines) { + for (const KeyValue &E : state->defines) { + ScriptLanguage::CodeCompletionOption option(E.key, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT); + r_completion_options->push_back(option); + } + } + clear_state(); return err; diff --git a/servers/rendering/shader_preprocessor.h b/servers/rendering/shader_preprocessor.h index 3b386af687..f30b8cccf3 100644 --- a/servers/rendering/shader_preprocessor.h +++ b/servers/rendering/shader_preprocessor.h @@ -161,6 +161,7 @@ private: bool disabled = false; CompletionType completion_type = COMPLETION_TYPE_NONE; HashSet> shader_includes; + bool completion_show_defines = false; }; private: