1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
#!/usr/bin/env python
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
import sys
import os
sys.path.append(os.path.abspath("../../scripts/breaking_changes_checker"))
from _models import CheckerType
import jsondiff
class RemovedMethodOverloadChecker:
node_type = CheckerType.FUNCTION_OR_METHOD
name = "RemovedMethodOverload"
is_breaking = True
message = {
"default": "`{}.{}` had an overload `{}` removed",
"all": "`{}.{}` had all overloads removed"
}
def run_check(self, diff, stable_nodes, current_nodes, **kwargs):
module_name = kwargs.get("module_name")
class_name = kwargs.get("class_name")
bc_list = []
# This is a new module, so we won't check for removed overloads
if module_name not in stable_nodes:
return bc_list
if class_name not in stable_nodes[module_name]["class_nodes"]:
# This is a new class, so we don't need to check for removed overloads
return bc_list
for method_name, method_components in diff.items():
# We aren't checking for deleted methods in this checker
if isinstance(method_name, jsondiff.Symbol):
continue
# Check if all of the overloads were deleted for an existing stable method
if len(method_components.get("overloads", [])) == 0:
if method_name in stable_nodes[module_name]["class_nodes"][class_name]["methods"] and \
"overloads" in stable_nodes[module_name]["class_nodes"][class_name]["methods"][method_name]:
if len(stable_nodes[module_name]["class_nodes"][class_name]["methods"][method_name]["overloads"]) > 0:
bc_list.append((self.message["all"], self.name, module_name, class_name, method_name))
continue
# Check for specific overloads that were deleted
for overload in method_components.get("overloads", []):
if isinstance(overload, jsondiff.Symbol):
if overload.label == "delete":
for deleted_overload in method_components["overloads"][overload]:
stable_node_overloads = stable_nodes[module_name]["class_nodes"][class_name]["methods"][method_name]["overloads"][deleted_overload]
parsed_overload_signature = f"def {method_name}(" + ", ".join([f"{name}: {data['type']}" for name, data in stable_node_overloads["parameters"].items()]) + ")"
if stable_node_overloads["return_type"] is not None:
parsed_overload_signature += f" -> {stable_node_overloads['return_type']}"
bc_list.append((self.message["default"], self.name, module_name, class_name, method_name, parsed_overload_signature))
return bc_list
|