This commit is contained in:
Ivan Bondarev 2023-11-04 13:17:54 +01:00
parent 5c4b3f1de4
commit 5db41ff65f
5 changed files with 41 additions and 0 deletions

View file

@ -899,6 +899,22 @@ namespace PascalABCCompiler.PCU
}
}
private void AddIndirectUsedUnitsForFunction(common_namespace_function_node cnfn, Dictionary<common_namespace_node, bool> 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<common_namespace_node, bool> 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;

View file

@ -0,0 +1,7 @@
unit u_indirect_extensionmethods1;
uses u_indirect_extensionmethods2;
begin
// Вызов extensionmethod'а из неявно подключённого u3
''.p1;
end.

View file

@ -0,0 +1,4 @@
unit u_indirect_extensionmethods2;
uses u_indirect_extensionmethods3;
end.

View file

@ -0,0 +1,4 @@
unit u_indirect_extensionmethods3;
procedure p1(self: string); extensionmethod := exit;
end.

View file

@ -0,0 +1,4 @@
uses u_indirect_extensionmethods1;
begin
end.