static Ref create_decomp_for_version(String ver);
| 1640 | |
| 1641 | // static Ref<GDScriptDecomp> create_decomp_for_version(String ver); |
| 1642 | Ref<GDScriptDecomp> GDScriptDecomp::create_decomp_for_version(String str_ver, bool p_force) { |
| 1643 | bool include_dev = false; |
| 1644 | Ref<GodotVer> ver = GodotVer::parse(str_ver); |
| 1645 | ERR_FAIL_COND_V_MSG(ver.is_null() || ver->get_major() == 0, Ref<GDScriptDecomp>(), "Invalid version: " + str_ver); |
| 1646 | if (ver->get_prerelease().contains("dev")) { |
| 1647 | include_dev = true; |
| 1648 | } |
| 1649 | auto versions = GDScriptDecompVersion::get_decomp_versions(include_dev, ver->get_major()); |
| 1650 | versions.reverse(); |
| 1651 | // Exact match for dev versions |
| 1652 | if (include_dev) { |
| 1653 | str_ver = ver->as_tag(); |
| 1654 | for (auto &v : versions) { |
| 1655 | bool has_max = !v.max_version.is_empty(); |
| 1656 | if (v.min_version == str_ver || (has_max && v.max_version == str_ver)) { |
| 1657 | return Ref<GDScriptDecomp>(create_decomp_for_commit(v.commit)); |
| 1658 | } |
| 1659 | } |
| 1660 | ERR_FAIL_COND_V_MSG(include_dev, Ref<GDScriptDecomp>(), "No version found for: " + str_ver); |
| 1661 | } |
| 1662 | if (p_force && ver->get_major() == 4 && ver->get_minor() < 3 && (ver->get_minor() != 0 || !ver->is_prerelease())) { |
| 1663 | return Ref<GDScriptDecomp>(create_decomp_for_version("4.3.0")); |
| 1664 | } |
| 1665 | Ref<GodotVer> prev_ver = nullptr; |
| 1666 | int prev_ver_commit = 0; |
| 1667 | for (auto &curr_version : versions) { |
| 1668 | Ref<GodotVer> min_ver = curr_version.get_min_version(); |
| 1669 | if (ver->eq(min_ver)) { |
| 1670 | return Ref<GDScriptDecomp>(create_decomp_for_commit(curr_version.commit)); |
| 1671 | } |
| 1672 | |
| 1673 | if (ver->gt(min_ver) && !curr_version.max_version.is_empty()) { |
| 1674 | Ref<GodotVer> max_ver = curr_version.get_max_version(); |
| 1675 | if (ver->lte(max_ver)) { |
| 1676 | return Ref<GDScriptDecomp>(create_decomp_for_commit(curr_version.commit)); |
| 1677 | } |
| 1678 | } |
| 1679 | if (prev_ver_commit > 0 && ver->lt(min_ver) && ver->gte(prev_ver)) { |
| 1680 | // 3.4 -> 3.2 |
| 1681 | if (ver->get_major() == prev_ver->get_major()) { |
| 1682 | return Ref<GDScriptDecomp>(create_decomp_for_commit(prev_ver_commit)); |
| 1683 | } |
| 1684 | } |
| 1685 | prev_ver = min_ver; |
| 1686 | prev_ver_commit = curr_version.commit; |
| 1687 | } |
| 1688 | if (ver->get_major() == prev_ver->get_major() && ver->gte(prev_ver)) { |
| 1689 | return Ref<GDScriptDecomp>(create_decomp_for_commit(prev_ver_commit)); |
| 1690 | } |
| 1691 | ERR_FAIL_V_MSG(Ref<GDScriptDecomp>(), "No version found for: " + str_ver); |
| 1692 | } |
| 1693 | |
| 1694 | template <typename T> |
| 1695 | static int64_t continuity_tester(const Vector<T> &p_vector, const Vector<T> &p_other, String name, int pos = 0) { |
nothing calls this directly
no test coverage detected