From 5db41ff65f7ef8a55ac0b644e32d21b2053f6654 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sat, 4 Nov 2023 13:17:54 +0100 Subject: [PATCH] #2868 --- Compiler/PCU/PCUWriter.cs | 22 +++++++++++++++++++ .../units/u_indirect_extensionmethods1.pas | 7 ++++++ .../units/u_indirect_extensionmethods2.pas | 4 ++++ .../units/u_indirect_extensionmethods3.pas | 4 ++++ .../use_indirect_extensionmethods1.pas | 4 ++++ 5 files changed, 41 insertions(+) create mode 100644 TestSuite/units/u_indirect_extensionmethods1.pas create mode 100644 TestSuite/units/u_indirect_extensionmethods2.pas create mode 100644 TestSuite/units/u_indirect_extensionmethods3.pas create mode 100644 TestSuite/usesunits/use_indirect_extensionmethods1.pas diff --git a/Compiler/PCU/PCUWriter.cs b/Compiler/PCU/PCUWriter.cs index 61aafa897..c8051dc91 100644 --- a/Compiler/PCU/PCUWriter.cs +++ b/Compiler/PCU/PCUWriter.cs @@ -899,6 +899,22 @@ namespace PascalABCCompiler.PCU } } + private void AddIndirectUsedUnitsForFunction(common_namespace_function_node cnfn, Dictionary ns_dict, bool interf) + { + common_namespace_node comp_cnn = cnfn.namespace_node; + if (comp_cnn != null && !ns_dict.ContainsKey(comp_cnn) && unit.SemanticTree != comp_cnn.cont_unit) + { + var path = Compiler.GetUnitPath(unit, compiler.UnitsSortedList.Find(u => u.SemanticTree == comp_cnn.cont_unit)); + + if (interf) + unit.InterfaceUsedUnits.AddElement(comp_cnn.cont_unit, path); + else + unit.ImplementationUsedUnits.AddElement(comp_cnn.cont_unit, path); + + ns_dict[comp_cnn] = true; + } + } + private void AddIndirectUsedUnitsInStatement(statement_node stmt, Dictionary ns_dict, bool interf) { if (stmt == null) @@ -923,6 +939,12 @@ namespace PascalABCCompiler.PCU common_method_call cmc = stmt as common_method_call; AddIndirectUsedUnitsForType(cmc.function_node.cont_type, ns_dict, interf); } + else if (stmt is common_namespace_function_call) + { + common_namespace_function_call cnfc = stmt as common_namespace_function_call; + if (cnfc.function_node.ConnectedToType != null) + AddIndirectUsedUnitsForFunction(cnfc.function_node, ns_dict, interf); + } else if (stmt is if_node) { if_node node = stmt as if_node; diff --git a/TestSuite/units/u_indirect_extensionmethods1.pas b/TestSuite/units/u_indirect_extensionmethods1.pas new file mode 100644 index 000000000..f34a9fa2c --- /dev/null +++ b/TestSuite/units/u_indirect_extensionmethods1.pas @@ -0,0 +1,7 @@ +unit u_indirect_extensionmethods1; +uses u_indirect_extensionmethods2; + +begin + // Вызов extensionmethod'а из неявно подключённого u3 + ''.p1; +end. \ No newline at end of file diff --git a/TestSuite/units/u_indirect_extensionmethods2.pas b/TestSuite/units/u_indirect_extensionmethods2.pas new file mode 100644 index 000000000..e5a27f855 --- /dev/null +++ b/TestSuite/units/u_indirect_extensionmethods2.pas @@ -0,0 +1,4 @@ +unit u_indirect_extensionmethods2; +uses u_indirect_extensionmethods3; + +end. \ No newline at end of file diff --git a/TestSuite/units/u_indirect_extensionmethods3.pas b/TestSuite/units/u_indirect_extensionmethods3.pas new file mode 100644 index 000000000..8922e79a7 --- /dev/null +++ b/TestSuite/units/u_indirect_extensionmethods3.pas @@ -0,0 +1,4 @@ +unit u_indirect_extensionmethods3; +procedure p1(self: string); extensionmethod := exit; + +end. \ No newline at end of file diff --git a/TestSuite/usesunits/use_indirect_extensionmethods1.pas b/TestSuite/usesunits/use_indirect_extensionmethods1.pas new file mode 100644 index 000000000..c954584f7 --- /dev/null +++ b/TestSuite/usesunits/use_indirect_extensionmethods1.pas @@ -0,0 +1,4 @@ +uses u_indirect_extensionmethods1; +begin + +end. \ No newline at end of file