From 214856a0ba150e4ecff8dc83295310a8c591cff7 Mon Sep 17 00:00:00 2001 From: Rodz Labs Date: Thu, 12 May 2022 08:47:44 +0200 Subject: [PATCH] Updated parser to emit simpler AST for translation units functions and detect duplicate definitions of functions in predefined nodes --- addons/material_maker/engine/loader.gd | 17 ++++++++++++++++- addons/material_maker/parser/glsl_parser.gd | 21 ++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/addons/material_maker/engine/loader.gd b/addons/material_maker/engine/loader.gd index bfc285e6..1243687b 100644 --- a/addons/material_maker/engine/loader.gd +++ b/addons/material_maker/engine/loader.gd @@ -2,10 +2,11 @@ tool extends Node var predefined_generators : Dictionary = {} +var predefined_functions : Dictionary = {} var current_project_path : String = "" -const CHECK_PREDEFINED : bool = false +const CHECK_PREDEFINED : bool = true func _ready()-> void: update_predefined_generators() @@ -15,6 +16,7 @@ func update_predefined_generators()-> void: if CHECK_PREDEFINED: parser = load("res://addons/material_maker/parser/glsl_parser.gd").new() predefined_generators = {} + predefined_functions = {} for path in MMPaths.get_nodes_paths(): var dir = Directory.new() if dir.open(path) == OK: @@ -30,6 +32,19 @@ func update_predefined_generators()-> void: var parse_result = parser.parse(generator.shader_model.global) if parse_result.status != "OK": print(file_name+" has errors in global") + elif parse_result.value.type == "translation_unit": + for definition in parse_result.value.value: + if definition.type == "function_definition": + var function_name = definition.value[0].value[0].value.name + if function_name.type == "IDENTIFIER": + if predefined_functions.has(function_name.value): + print(str(function_name.value)+" is defined in "+file_name.get_basename()+" and "+predefined_functions[function_name.value]) + else: + predefined_functions[function_name.value] = file_name.get_basename() + else: + print(definition) + else: + print(definition.type) predefined_generators[file_name.get_basename()] = generator file.close() file_name = dir.get_next() diff --git a/addons/material_maker/parser/glsl_parser.gd b/addons/material_maker/parser/glsl_parser.gd index 05ade649..1a99588f 100644 --- a/addons/material_maker/parser/glsl_parser.gd +++ b/addons/material_maker/parser/glsl_parser.gd @@ -51,13 +51,32 @@ func build_field_selection_test(t1): return null return t1.value +func build_function_header(t1, t2, t3): + return { return_type=t1, name=t2, parameters=[] } + +func build_function_header_with_parameters(t1, t2): + t1.value.parameters.push_back(t2) + return t1.value + +func build_function_header_with_parameters_2(t1, t2, t3): + t1.value.parameters.push_back(t3) + return t1.value + func build_function_call_header(t1, t2): return { name=t1, parameters=[] } func build_function_call_header_with_parameters(t1, t2): t1.value.parameters.push_back(t2) return t1.value - + func build_function_call_header_with_parameters_2(t1, t2, t3): t1.value.parameters.push_back(t3) return t1.value + +func build_translation_unit(t1): + return [ t1 ] + +func build_translation_unit_2(t1, t2): + t1.value.push_back(t2) + return t1.value +