Fix code completion for shader editor
This commit is contained in:
parent
d897131ac5
commit
253cd73f1d
4 changed files with 29 additions and 22 deletions
|
@ -190,7 +190,7 @@ void ShaderTextEditor::_check_shader_mode() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderTextEditor::_code_complete_script(const String &p_code, List<String> *r_options) {
|
void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options) {
|
||||||
|
|
||||||
_check_shader_mode();
|
_check_shader_mode();
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
virtual void _load_theme_settings();
|
virtual void _load_theme_settings();
|
||||||
|
|
||||||
virtual void _code_complete_script(const String &p_code, List<String> *r_options);
|
virtual void _code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void _validate_script();
|
virtual void _validate_script();
|
||||||
|
|
|
@ -4684,7 +4684,7 @@ Error ShaderLanguage::compile(const String &p_code, const Map<StringName, Functi
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error ShaderLanguage::complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, List<String> *r_options, String &r_call_hint) {
|
Error ShaderLanguage::complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint) {
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
|
@ -4705,8 +4705,8 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
} break;
|
} break;
|
||||||
case COMPLETION_RENDER_MODE: {
|
case COMPLETION_RENDER_MODE: {
|
||||||
for (int i = 0; i < p_render_modes.size(); i++) {
|
for (int i = 0; i < p_render_modes.size(); i++) {
|
||||||
|
ScriptCodeCompletionOption option(p_render_modes[i], ScriptCodeCompletionOption::KIND_ENUM);
|
||||||
r_options->push_back(p_render_modes[i]);
|
r_options->push_back(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -4714,8 +4714,8 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
case COMPLETION_MAIN_FUNCTION: {
|
case COMPLETION_MAIN_FUNCTION: {
|
||||||
|
|
||||||
for (const Map<StringName, FunctionInfo>::Element *E = p_functions.front(); E; E = E->next()) {
|
for (const Map<StringName, FunctionInfo>::Element *E = p_functions.front(); E; E = E->next()) {
|
||||||
|
ScriptCodeCompletionOption option(E->key(), ScriptCodeCompletionOption::KIND_FUNCTION);
|
||||||
r_options->push_back(E->key());
|
r_options->push_back(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -4724,10 +4724,8 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
case COMPLETION_FUNCTION_CALL: {
|
case COMPLETION_FUNCTION_CALL: {
|
||||||
|
|
||||||
bool comp_ident = completion_type == COMPLETION_IDENTIFIER;
|
bool comp_ident = completion_type == COMPLETION_IDENTIFIER;
|
||||||
Set<String> matches;
|
Map<String, ScriptCodeCompletionOption::Kind> matches;
|
||||||
|
|
||||||
StringName skip_function;
|
StringName skip_function;
|
||||||
|
|
||||||
BlockNode *block = completion_block;
|
BlockNode *block = completion_block;
|
||||||
|
|
||||||
while (block) {
|
while (block) {
|
||||||
|
@ -4736,7 +4734,7 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
for (const Map<StringName, BlockNode::Variable>::Element *E = block->variables.front(); E; E = E->next()) {
|
for (const Map<StringName, BlockNode::Variable>::Element *E = block->variables.front(); E; E = E->next()) {
|
||||||
|
|
||||||
if (E->get().line < completion_line) {
|
if (E->get().line < completion_line) {
|
||||||
matches.insert(E->key());
|
matches.insert(E->key(), ScriptCodeCompletionOption::KIND_VARIABLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4744,7 +4742,7 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
if (block->parent_function) {
|
if (block->parent_function) {
|
||||||
if (comp_ident) {
|
if (comp_ident) {
|
||||||
for (int i = 0; i < block->parent_function->arguments.size(); i++) {
|
for (int i = 0; i < block->parent_function->arguments.size(); i++) {
|
||||||
matches.insert(block->parent_function->arguments[i].name);
|
matches.insert(block->parent_function->arguments[i].name, ScriptCodeCompletionOption::KIND_FUNCTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
skip_function = block->parent_function->name;
|
skip_function = block->parent_function->name;
|
||||||
|
@ -4755,35 +4753,43 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
if (comp_ident && skip_function != StringName() && p_functions.has(skip_function)) {
|
if (comp_ident && skip_function != StringName() && p_functions.has(skip_function)) {
|
||||||
|
|
||||||
for (Map<StringName, BuiltInInfo>::Element *E = p_functions[skip_function].built_ins.front(); E; E = E->next()) {
|
for (Map<StringName, BuiltInInfo>::Element *E = p_functions[skip_function].built_ins.front(); E; E = E->next()) {
|
||||||
matches.insert(E->key());
|
ScriptCodeCompletionOption::Kind kind = ScriptCodeCompletionOption::KIND_MEMBER;
|
||||||
|
if (E->get().constant) {
|
||||||
|
kind = ScriptCodeCompletionOption::KIND_CONSTANT;
|
||||||
|
}
|
||||||
|
matches.insert(E->key(), kind);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (comp_ident) {
|
if (comp_ident) {
|
||||||
for (const Map<StringName, ShaderNode::Varying>::Element *E = shader->varyings.front(); E; E = E->next()) {
|
for (const Map<StringName, ShaderNode::Varying>::Element *E = shader->varyings.front(); E; E = E->next()) {
|
||||||
matches.insert(E->key());
|
matches.insert(E->key(), ScriptCodeCompletionOption::KIND_VARIABLE);
|
||||||
}
|
}
|
||||||
for (const Map<StringName, ShaderNode::Uniform>::Element *E = shader->uniforms.front(); E; E = E->next()) {
|
for (const Map<StringName, ShaderNode::Uniform>::Element *E = shader->uniforms.front(); E; E = E->next()) {
|
||||||
matches.insert(E->key());
|
matches.insert(E->key(), ScriptCodeCompletionOption::KIND_MEMBER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < shader->functions.size(); i++) {
|
for (int i = 0; i < shader->functions.size(); i++) {
|
||||||
if (!shader->functions[i].callable || shader->functions[i].name == skip_function)
|
if (!shader->functions[i].callable || shader->functions[i].name == skip_function)
|
||||||
continue;
|
continue;
|
||||||
matches.insert(String(shader->functions[i].name) + "(");
|
matches.insert(String(shader->functions[i].name), ScriptCodeCompletionOption::KIND_FUNCTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
|
|
||||||
while (builtin_func_defs[idx].name) {
|
while (builtin_func_defs[idx].name) {
|
||||||
|
|
||||||
matches.insert(String(builtin_func_defs[idx].name) + "(");
|
matches.insert(String(builtin_func_defs[idx].name), ScriptCodeCompletionOption::KIND_FUNCTION);
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Set<String>::Element *E = matches.front(); E; E = E->next()) {
|
for (Map<String, ScriptCodeCompletionOption::Kind>::Element *E = matches.front(); E; E = E->next()) {
|
||||||
r_options->push_back(E->get());
|
ScriptCodeCompletionOption option(E->key(), E->value());
|
||||||
|
if (E->value() == ScriptCodeCompletionOption::KIND_FUNCTION) {
|
||||||
|
option.insert_text += "(";
|
||||||
|
}
|
||||||
|
r_options->push_back(option);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -4923,8 +4929,8 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < limit; i++) {
|
for (int i = 0; i < limit; i++) {
|
||||||
r_options->push_back(String::chr(colv[i]));
|
r_options->push_back(ScriptCodeCompletionOption(String::chr(colv[i]), ScriptCodeCompletionOption::KIND_PLAIN_TEXT));
|
||||||
r_options->push_back(String::chr(coordv[i]));
|
r_options->push_back(ScriptCodeCompletionOption(String::chr(coordv[i]), ScriptCodeCompletionOption::KIND_PLAIN_TEXT));
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include "core/list.h"
|
#include "core/list.h"
|
||||||
#include "core/map.h"
|
#include "core/map.h"
|
||||||
|
#include "core/script_language.h"
|
||||||
#include "core/string_name.h"
|
#include "core/string_name.h"
|
||||||
#include "core/typedefs.h"
|
#include "core/typedefs.h"
|
||||||
#include "core/ustring.h"
|
#include "core/ustring.h"
|
||||||
|
@ -689,7 +690,7 @@ public:
|
||||||
|
|
||||||
static String get_shader_type(const String &p_code);
|
static String get_shader_type(const String &p_code);
|
||||||
Error compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types);
|
Error compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types);
|
||||||
Error complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, List<String> *r_options, String &r_call_hint);
|
Error complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint);
|
||||||
|
|
||||||
String get_error_text();
|
String get_error_text();
|
||||||
int get_error_line();
|
int get_error_line();
|
||||||
|
|
Loading…
Reference in a new issue