def resolve()

in rostran/core/properties.py [0:0]


    def resolve(self) -> "Properties":
        props = Properties()
        for old_name, old_prop in self.items():
            name_parts = old_name.split(".")
            if len(name_parts) == 1:
                props[old_name] = Property(old_prop.name, old_prop.value)
                continue

            prop_name = None
            cur_value = prop_value = None
            length = len(name_parts)
            for i, name_part in enumerate(name_parts):
                result = NORMAL_PATTERN.findall(name_part)
                if result:
                    cur_name = name_part
                    if i == 0:
                        prop_name = name_part
                        cur_value = prop_value = (
                            props[prop_name].value if prop_name in props else {}
                        )
                    elif i < length - 1:
                        if not isinstance(cur_value, dict):
                            raise ConflictDataTypeInExpression(expression=old_name)

                        if cur_name not in cur_value:
                            cur_value[cur_name] = {}
                        cur_value = cur_value[cur_name]
                    else:
                        if not isinstance(cur_value, dict):
                            raise ConflictDataTypeInExpression(expression=old_name)
                        cur_value[cur_name] = old_prop.value
                    continue

                result = LIST_PATTERN.findall(name_part)
                if result:
                    cur_name = result[0][0]
                    if i == 0:
                        prop_name = cur_name
                        cur_value = prop_value = (
                            props[prop_name].value if prop_name in props else []
                        )
                        cur_value = _handle_list_value(
                            name_part, cur_value, expression=old_name
                        )
                    elif i < length - 1:
                        if not isinstance(cur_value, dict):
                            raise ConflictDataTypeInExpression(expression=old_name)

                        if cur_name not in cur_value:
                            cur_value[cur_name] = []
                        cur_value = cur_value[cur_name]
                        cur_value = _handle_list_value(
                            name_part, cur_value, expression=old_name
                        )
                    else:
                        if not isinstance(cur_value, dict):
                            raise ConflictDataTypeInExpression(expression=old_name)

                        if cur_name not in cur_value:
                            cur_value[cur_name] = []
                        cur_value = cur_value[cur_name]
                        cur_value = _handle_list_value(
                            name_part,
                            cur_value,
                            expression=old_name,
                            data=old_prop.value,
                        )
                    continue

                raise InvalidExpression(expression=old_name)

            props[prop_name] = Property(prop_name, prop_value)

        return props