Skip to content

Commit

Permalink
Fix: Failed to parse 'tuple of XXX' (#130)
Browse files Browse the repository at this point in the history
  • Loading branch information
nutti committed Jul 19, 2023
1 parent e75693a commit 625d57b
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 27 deletions.
25 changes: 17 additions & 8 deletions src/fake_bpy_module/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -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":
Expand Down Expand Up @@ -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")),
Expand All @@ -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)
]
Expand All @@ -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)
]
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
58 changes: 40 additions & 18 deletions src/fake_bpy_module/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion tools/collect_failure_state/collect_failure_state.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 625d57b

Please sign in to comment.