@@ -36,11 +36,17 @@ package body LSP.Ada_Completions.Parameters is
3636 (C : Libadalang.Analysis.Call_Expr;
3737 Context : not null LSP.Ada_Handlers.Context_Access)
3838 return LSP.Ada_Completions.Generic_Assoc_Utils.Assoc_Data_Lists.List;
39+ function Get_Prefix_Node
40+ (C : Libadalang.Analysis.Call_Expr;
41+ Column : out Langkit_Support.Slocs.Column_Number)
42+ return Libadalang.Analysis.Ada_Node'Class;
3943
4044 package Call_Expr_Completion is new
4145 LSP.Ada_Completions.Generic_Assoc
4246 (Element => Libadalang.Analysis.Call_Expr,
4347 Null_Element => Libadalang.Analysis.No_Call_Expr,
48+ Pretty_Print_Rule => Libadalang.Common.Param_Assoc_Rule,
49+ Get_Prefix_Node => Get_Prefix_Node,
4450 Search_Element => LSP.Lal_Utils.Get_Call_Expr,
4551 Get_Designators => LSP.Lal_Utils.Get_Call_Designators,
4652 Get_Spec_Designators => Get_Spec_Call_Expr_Designators);
@@ -55,15 +61,52 @@ package body LSP.Ada_Completions.Parameters is
5561 (A : Libadalang.Analysis.Aggregate;
5662 Context : not null LSP.Ada_Handlers.Context_Access)
5763 return LSP.Ada_Completions.Generic_Assoc_Utils.Assoc_Data_Lists.List;
64+ function Get_Prefix_Node
65+ (A : Libadalang.Analysis.Aggregate;
66+ Column : out Langkit_Support.Slocs.Column_Number)
67+ return Libadalang.Analysis.Ada_Node'Class;
5868
5969 package Aggregate_Completion is new
6070 LSP.Ada_Completions.Generic_Assoc
6171 (Element => Libadalang.Analysis.Aggregate,
6272 Null_Element => Libadalang.Analysis.No_Aggregate,
73+ Pretty_Print_Rule => Libadalang.Common.Param_Assoc_Rule,
74+ Get_Prefix_Node => Get_Prefix_Node,
6375 Search_Element => Get_Aggregate,
6476 Get_Designators => Get_Designators,
6577 Get_Spec_Designators => Get_Spec_Aggregate_Designators);
6678
79+ function Get_Generic_Package
80+ (N : Libadalang.Analysis.Ada_Node'Class)
81+ return Libadalang.Analysis.Generic_Package_Instantiation;
82+ function Get_Designators
83+ (G : Libadalang.Analysis.Generic_Package_Instantiation)
84+ return Laltools.Common.Node_Vectors.Vector;
85+ function Get_Decl_Designators
86+ (G : Libadalang.Analysis.Generic_Package_Instantiation;
87+ Context : not null LSP.Ada_Handlers.Context_Access)
88+ return LSP.Ada_Completions.Generic_Assoc_Utils.Assoc_Data_Lists.List;
89+ function Get_Prefix_Node
90+ (G : Libadalang.Analysis.Generic_Package_Instantiation;
91+ Column : out Langkit_Support.Slocs.Column_Number)
92+ return Libadalang.Analysis.Ada_Node'Class;
93+
94+ package Generic_Package_Completion is new
95+ LSP.Ada_Completions.Generic_Assoc
96+ (Element =>
97+ Libadalang.Analysis.Generic_Package_Instantiation,
98+ Null_Element =>
99+ Libadalang.Analysis.No_Generic_Package_Instantiation,
100+ -- GNATpp is having trouble formatting a LAL tree representing
101+ -- Generic_Package_Instanciation_Rule
102+ -- => retrieve the nested Assoc_List and format it as a function
103+ -- call.
104+ Pretty_Print_Rule => Libadalang.Common.Param_Assoc_Rule,
105+ Get_Prefix_Node => Get_Prefix_Node,
106+ Search_Element => Get_Generic_Package,
107+ Get_Designators => Get_Designators,
108+ Get_Spec_Designators => Get_Decl_Designators);
109+
67110 -- ----------------------------------
68111 -- Get_Spec_Call_Expr_Designators --
69112 -- ----------------------------------
@@ -428,6 +471,140 @@ package body LSP.Ada_Completions.Parameters is
428471 return Res;
429472 end Get_Spec_Aggregate_Designators ;
430473
474+ -- -----------------------
475+ -- Get_Generic_Package --
476+ -- -----------------------
477+
478+ function Get_Generic_Package
479+ (N : Libadalang.Analysis.Ada_Node'Class)
480+ return Libadalang.Analysis.Generic_Package_Instantiation
481+ is
482+ begin
483+ if N.Kind in Ada_Generic_Package_Instantiation_Range then
484+ return N.As_Generic_Package_Instantiation;
485+ end if ;
486+
487+ declare
488+ N_Parent : constant Libadalang.Analysis.Ada_Node'Class := N.Parent;
489+ begin
490+ if not N_Parent.Is_Null
491+ and then N_Parent.Kind in Ada_Generic_Package_Instantiation_Range
492+ then
493+ return N_Parent.As_Generic_Package_Instantiation;
494+ end if ;
495+ end ;
496+ return No_Generic_Package_Instantiation;
497+ end Get_Generic_Package ;
498+
499+ -- -------------------
500+ -- Get_Designators --
501+ -- -------------------
502+
503+ function Get_Designators
504+ (G : Libadalang.Analysis.Generic_Package_Instantiation)
505+ return Laltools.Common.Node_Vectors.Vector
506+ is
507+ Designator : Libadalang.Analysis.Ada_Node;
508+ Res : Laltools.Common.Node_Vectors.Vector;
509+ begin
510+ for Assoc of G.F_Params loop
511+ Designator := Assoc.As_Param_Assoc.F_Designator;
512+ if Designator /= No_Ada_Node then
513+ Res.Append (Designator);
514+ end if ;
515+ end loop ;
516+
517+ return Res;
518+ end Get_Designators ;
519+
520+ -- ------------------------
521+ -- Get_Decl_Designators --
522+ -- ------------------------
523+
524+ function Get_Decl_Designators
525+ (G : Libadalang.Analysis.Generic_Package_Instantiation;
526+ Context : not null LSP.Ada_Handlers.Context_Access)
527+ return LSP.Ada_Completions.Generic_Assoc_Utils.Assoc_Data_Lists.List
528+ is
529+ Res :
530+ LSP.Ada_Completions.Generic_Assoc_Utils.Assoc_Data_Lists.List;
531+ Name_Node : constant Libadalang.Analysis.Name := G.F_Generic_Pkg_Name;
532+ begin
533+ for N of reverse Context.Find_All_Env_Elements (Name_Node) loop
534+ if N.Kind in Ada_Generic_Package_Decl_Range then
535+ declare
536+ Assoc : LSP.Ada_Completions.Generic_Assoc_Utils.Assoc_Data;
537+ Decl : constant Libadalang.Analysis.Generic_Package_Decl
538+ := N.As_Generic_Package_Decl;
539+ begin
540+ Assoc.Title.Append (" Params of " );
541+ Assoc.Title.Append
542+ (VSS.Strings.To_Virtual_String (Name_Node.Text));
543+ Assoc.Decl := N.As_Basic_Decl;
544+
545+ for Param of Decl.F_Formal_Part.F_Decls loop
546+ if Param.Kind in Ada_Generic_Formal then
547+ declare
548+ Gen_Formal : constant Generic_Formal :=
549+ Param.As_Generic_Formal;
550+ Param_Name : constant Name :=
551+ Gen_Formal.F_Decl.P_Defining_Name.F_Name;
552+ begin
553+ Assoc.Param_Types.Include
554+ (Gen_Formal.F_Decl.P_Defining_Name.F_Name,
555+ (Node => Gen_Formal.As_Ada_Node,
556+ Is_Value => False));
557+ Assoc.Param_Vector.Append (Param_Name.As_Ada_Node);
558+ end ;
559+ end if ;
560+ end loop ;
561+ Res.Append (Assoc);
562+ end ;
563+ end if ;
564+ end loop ;
565+
566+ return Res;
567+ end Get_Decl_Designators ;
568+
569+ -- -------------------
570+ -- Get_Prefix_Node --
571+ -- -------------------
572+
573+ function Get_Prefix_Node
574+ (C : Libadalang.Analysis.Call_Expr;
575+ Column : out Langkit_Support.Slocs.Column_Number)
576+ return Libadalang.Analysis.Ada_Node'Class is
577+ begin
578+ Column := C.Parent.Sloc_Range.Start_Column;
579+ return C.Parent;
580+ end Get_Prefix_Node ;
581+
582+ -- -------------------
583+ -- Get_Prefix_Node --
584+ -- -------------------
585+
586+ function Get_Prefix_Node
587+ (A : Libadalang.Analysis.Aggregate;
588+ Column : out Langkit_Support.Slocs.Column_Number)
589+ return Libadalang.Analysis.Ada_Node'Class is
590+ begin
591+ Column := A.Parent.Sloc_Range.Start_Column;
592+ return A.Parent;
593+ end Get_Prefix_Node ;
594+
595+ -- --------------
596+ -- Get_Prefix --
597+ -- --------------
598+
599+ function Get_Prefix_Node
600+ (G : Libadalang.Analysis.Generic_Package_Instantiation;
601+ Column : out Langkit_Support.Slocs.Column_Number)
602+ return Libadalang.Analysis.Ada_Node'Class is
603+ begin
604+ Column := G.Sloc_Range.Start_Column;
605+ return G.F_Generic_Pkg_Name;
606+ end Get_Prefix_Node ;
607+
431608 -- ----------------------
432609 -- Propose_Completion --
433610 -- ----------------------
@@ -464,6 +641,16 @@ package body LSP.Ada_Completions.Parameters is
464641 Names => Names,
465642 Unsorted_Res => Unsorted_Res);
466643
644+ Generic_Package_Completion.Propose_Completion
645+ (Self => Self,
646+ Sloc => Sloc,
647+ Token => Token,
648+ Node => Node,
649+ Limit => Self.Named_Notation_Threshold,
650+ Filter => Filter,
651+ Names => Names,
652+ Unsorted_Res => Unsorted_Res);
653+
467654 declare
468655 Min_Width : constant Natural := Unsorted_Res.Length'Img'Length - 1 ;
469656 begin
0 commit comments