Property error when loading a P_Body_Part for a Generic_Subp_Decl
faedia opened this issue · 2 comments
This appears to occur because a with generic package is instantiated inside of the generic subprogram, and the generic package is width'd from another file that libadalang cannot find.
with pkg;
package body test_pkg is
generic
type t_type;
package g_p_decl is
function is_true (x : t_type) return Boolean (True);
end g_p_decl;
-- Fine because the generic package is in scope
function g_foo_1 (x : t_type) return Boolean
is
package g_p_inst is new g_p_decl (t_type);
use g_p_inst;
begin
return is_true (x);
end g_foo;
-- Error because can't find generic package
function g_foo_2 (x : t_type) return Boolean
is
package g_p_inst is new pkg.g_p_decl (t_type);
use g_p_inst;
begin
return is_true (x);
end g_foo;
end test_pkg;
The erroneous subprogram is g_foo_2 because it uses g_p_decl from pkg and not from the local unit.
The following program demonstrates the error by iterating over all Ada_Generic_Subp_Decl
and then trying to access the P_Body_Part
of the generic.
with Libadalang.Analysis;
with Libadalang.Common;
with Libadalang.Iterators;
procedure Main is
package LAL renames Libadalang.Analysis;
package LAL_iter renames Libadalang.Iterators;
package LAL_common renames Libadalang.Common;
context : LAL.Analysis_Context := LAL.Create_Context;
unit : LAL.Analysis_Unit := context.Get_From_File ("test_pkg.ads");
pred : LAL_iter.Ada_Node_Predicate := LAL_iter.Kind_Is (LAL_common.Ada_Generic_Subp_Decl);
iter : LAL_iter.Traverse_Iterator'Class := LAL_iter.Find (unit.Root, pred);
Node : LAL.Ada_Node;
begin
while iter.Next (Node) loop
Node.Print;
declare
s_body : LAL.Ada_Node := Node.As_Generic_Subp_Decl.P_Body_Part.As_Ada_Node;
begin
s_body.Print;
end;
end loop;
end Main;
I'm not sure if this is expected behaviour, I would have expected it to be able to give me the body of the subprogram but have incomplete semantic analysis of the subprogram.
Here is a full reproducer for the issue, run the program in the test directory:
p_body_part_reproducer.zip
Thank you,
Steven
Hello Steven,
Thanks for reporting this issue, I confirm I can reproduce locally.
Fortunately, we have a big patch coming up to Libadalang that seems to make this issue disappear. However this patch won't be merged on our master branch before a few weeks. I hope that's okay for you to wait a little bit for this issue to be fixed!
Best regards,
Romain
Hello Steven,
I forgot to close this issue in the end, so I just double checked and I get no property error running your reproducer. I think it's been resolved since we merged the patch I mentioned in my last message.
Closing this!
Best regards,
Romain