diff --git a/src/fake_bpy_module/common.py b/src/fake_bpy_module/common.py index f8dfbdce..67959578 100644 --- a/src/fake_bpy_module/common.py +++ b/src/fake_bpy_module/common.py @@ -275,8 +275,10 @@ def to_string(self) -> str: f"{self._data_type}]" elif self._modifier.modifier_data_type() == "tuple": if self._modifier_add_info is not None: + elms_strs = [elm.to_string() + for elm in self._modifier_add_info['tuple_elms']] return f"{self._modifier.to_string()}[" \ - f"{', '.join(self._modifier_add_info['tuple_elms'])}]" + f"{', '.join(elms_strs)}]" elif self._modifier.modifier_data_type() == "tupletuple": if self._modifier_add_info is not None: inner_str = [] @@ -373,8 +375,10 @@ def to_string(self) -> str: f"'{self._data_type}']" elif self._modifier.modifier_data_type() == "tuple": if self._modifier_add_info is not None: + elms_strs = [elm.to_string() + for elm in self._modifier_add_info['tuple_elms']] return f"{self._modifier.to_string()}[" \ - f"{', '.join(self._modifier_add_info['tuple_elms'])}]" + f"{', '.join(elms_strs)}]" elif self._modifier.modifier_data_type() == "listlist": return f"typing.List[typing.List['{self._data_type}']]" elif self._modifier.modifier_data_type() == "listcallable": @@ -1465,6 +1469,7 @@ def _get_refined_data_type_fast( "mathutils.Vector", uniq_full_names, uniq_module_names, module_name) if s: + tuple_elms = [BuiltinDataType("float")] * int(m.group(2)) dtypes = [ BuiltinDataType("float", CustomModifierDataType( "bpy.types.bpy_prop_array")), @@ -1473,7 +1478,7 @@ def _get_refined_data_type_fast( BuiltinDataType( "float", ModifierDataType("tuple"), modifier_add_info={ - "tuple_elms": ["float"] * int(m.group(2)) + "tuple_elms": tuple_elms }), CustomDataType(s) ] @@ -1489,12 +1494,13 @@ def _get_refined_data_type_fast( m.group(1), uniq_full_names, uniq_module_names, module_name) if s: + tuple_elms = [BuiltinDataType("float")] * int(m.group(3)) dtypes = [ BuiltinDataType("float", ModifierDataType("list")), BuiltinDataType( "float", ModifierDataType("tuple"), modifier_add_info={ - "tuple_elms": ["float"] * int(m.group(3)) + "tuple_elms": tuple_elms }), CustomDataType(s) ] @@ -1678,13 +1684,14 @@ def _get_refined_data_type_fast( ] return MixinDataType(dtypes) # Ex: tuple of mathutils.Vector's - m = re.match(r"^tuple of `([a-zA-Z0-9.]+)`'s$", dtype_str) + m = re.match(r"^tuple of `([a-zA-Z0-9.]+)`('s)*$", dtype_str) if m: s = self._parse_custom_data_type( m.group(1), uniq_full_names, uniq_module_names, module_name) if s: dd = CustomDataType( - s, ModifierDataType("tuple"), modifier_add_info=s, + s, ModifierDataType("tuple"), + modifier_add_info={"tuple_elms": [CustomDataType(s)]}, skip_refine=True) return dd @@ -2109,11 +2116,13 @@ def _get_refined_data_type_internal( s.strip(), uniq_full_names, uniq_module_names, module_name, variable_kind) if d: - dtypes.append(d.to_string()) + dtypes.append(d.data_type()) if len(dtypes) >= 1: + elms = [CustomDataType(d) for d in dtypes] dd = CustomDataType( dtypes[0], ModifierDataType("tuple"), - modifier_add_info={"tuple_elms": dtypes}, skip_refine=True) + modifier_add_info={"tuple_elms": elms}, + skip_refine=True) dd.set_metadata(metadata) return dd diff --git a/src/fake_bpy_module/generator.py b/src/fake_bpy_module/generator.py index 0fce4335..3a3fb1de 100644 --- a/src/fake_bpy_module/generator.py +++ b/src/fake_bpy_module/generator.py @@ -968,8 +968,7 @@ def _rewrite_data_type( processed_info.dependencies = gen_info.dependencies processed_info.child_modules = gen_info.child_modules - def rewrite_for_custom( - data_type: 'CustomDataType'): + def rewrite_for_custom(data_type: 'CustomDataType'): new_data_type = refiner.get_generation_data_type( data_type.data_type(), gen_info.name) dt = CustomDataType( @@ -979,40 +978,63 @@ def rewrite_for_custom( dt.set_metadata(data_type.get_metadata()) return dt - def rewrite_for_custom_modifier( - data_type: 'CustomDataType'): + def rewrite_for_custom_modifier(data_type: 'CustomDataType'): new_modifier_name = refiner.get_generation_data_type( data_type.modifier().output_modifier_name(), gen_info.name) dt = data_type dt.modifier().set_output_modifier_name(new_modifier_name) return dt + def rewrite_for_tuple_elms(data_type: 'CustomDataType'): + dt = data_type + if dt.modifier().modifier_data_type() == 'tuple': + add_info = dt.modifier_add_info() + elms_old = add_info["tuple_elms"] + elms_new = [] + for elm_old in elms_old: + if elm_old.type() == 'CUSTOM': + elm_new = rewrite_for_custom(elm_old) + elms_new.append(elm_new) + else: + elms_new.append(elm_old) + add_info["tuple_elms"] = elms_new + return dt + def rewrite(info_to_rewrite: Info): dtype_to_rewrite = info_to_rewrite.data_type() if dtype_to_rewrite.type() == 'BUILTIN': - if dtype_to_rewrite.has_modifier() and \ - dtype_to_rewrite.modifier().type() == 'CUSTOM_MODIFIER': - info_to_rewrite.set_data_type(rewrite_for_custom_modifier( - dtype_to_rewrite)) + if dtype_to_rewrite.has_modifier(): + modifier = dtype_to_rewrite.modifier() + if modifier.type() == 'MODIFIER': + rewrite_for_tuple_elms(dtype_to_rewrite) + elif modifier.type() == 'CUSTOM_MODIFIER': + info_to_rewrite.set_data_type( + rewrite_for_custom_modifier(dtype_to_rewrite)) elif dtype_to_rewrite.type() == 'CUSTOM': dt = rewrite_for_custom(dtype_to_rewrite) - if dt.has_modifier() and \ - dt.modifier().type() == 'CUSTOM_MODIFIER': - dt = rewrite_for_custom_modifier(dt) + if dt.has_modifier(): + if dt.modifier().type() == 'MODIFIER': + dt = rewrite_for_tuple_elms(dt) + elif dt.modifier().type() == 'CUSTOM_MODIFIER': + dt = rewrite_for_custom_modifier(dt) info_to_rewrite.set_data_type(dt) elif dtype_to_rewrite.type() == 'MIXIN': mixin_dt = dtype_to_rewrite for i, d in enumerate(mixin_dt.data_types()): if d.type() == 'BUILTIN': - if d.has_modifier() and \ - d.modifier().type() == 'CUSTOM_MODIFIER': - mixin_dt.set_data_type( - i, rewrite_for_custom_modifier(d)) + if d.has_modifier(): + if d.modifier().type() == 'MODIFIER': + rewrite_for_tuple_elms(d) + elif d.modifier().type() == 'CUSTOM_MODIFIER': + mixin_dt.set_data_type( + i, rewrite_for_custom_modifier(d)) elif d.type() == 'CUSTOM': dt = rewrite_for_custom(d) - if dt.has_modifier() and \ - dt.modifier().type() == 'CUSTOM_MODIFIER': - dt = rewrite_for_custom_modifier(dt) + if dt.has_modifier(): + if dt.modifier().type() == 'MODIFIER': + rewrite_for_tuple_elms(dt) + elif dt.modifier().type() == 'CUSTOM_MODIFIER': + dt = rewrite_for_custom_modifier(dt) mixin_dt.set_data_type(i, dt) for info in gen_info.data: diff --git a/tools/collect_failure_state/collect_failure_state.sh b/tools/collect_failure_state/collect_failure_state.sh index 672cd1eb..be9513a8 100644 --- a/tools/collect_failure_state/collect_failure_state.sh +++ b/tools/collect_failure_state/collect_failure_state.sh @@ -18,7 +18,7 @@ OUTPUT_DIR=${1} mkdir -p "${OUTPUT_DIR}" -INTERMIDIATE_DIR="${SCRIPT_DIR}/../.." +INTERMIDIATE_DIR="${SCRIPT_DIR}/../pip_package" if [ -d "${INTERMIDIATE_DIR}" ]; then cp -r "${INTERMIDIATE_DIR}" "${OUTPUT_DIR}" fi \ No newline at end of file