@@ -36,11 +36,17 @@ package body LSP.Ada_Completions.Parameters is
36
36
(C : Libadalang.Analysis.Call_Expr;
37
37
Context : not null LSP.Ada_Handlers.Context_Access)
38
38
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;
39
43
40
44
package Call_Expr_Completion is new
41
45
LSP.Ada_Completions.Generic_Assoc
42
46
(Element => Libadalang.Analysis.Call_Expr,
43
47
Null_Element => Libadalang.Analysis.No_Call_Expr,
48
+ Pretty_Print_Rule => Libadalang.Common.Param_Assoc_Rule,
49
+ Get_Prefix_Node => Get_Prefix_Node,
44
50
Search_Element => LSP.Lal_Utils.Get_Call_Expr,
45
51
Get_Designators => LSP.Lal_Utils.Get_Call_Designators,
46
52
Get_Spec_Designators => Get_Spec_Call_Expr_Designators);
@@ -55,15 +61,52 @@ package body LSP.Ada_Completions.Parameters is
55
61
(A : Libadalang.Analysis.Aggregate;
56
62
Context : not null LSP.Ada_Handlers.Context_Access)
57
63
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;
58
68
59
69
package Aggregate_Completion is new
60
70
LSP.Ada_Completions.Generic_Assoc
61
71
(Element => Libadalang.Analysis.Aggregate,
62
72
Null_Element => Libadalang.Analysis.No_Aggregate,
73
+ Pretty_Print_Rule => Libadalang.Common.Param_Assoc_Rule,
74
+ Get_Prefix_Node => Get_Prefix_Node,
63
75
Search_Element => Get_Aggregate,
64
76
Get_Designators => Get_Designators,
65
77
Get_Spec_Designators => Get_Spec_Aggregate_Designators);
66
78
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
+
67
110
-- ----------------------------------
68
111
-- Get_Spec_Call_Expr_Designators --
69
112
-- ----------------------------------
@@ -428,6 +471,140 @@ package body LSP.Ada_Completions.Parameters is
428
471
return Res;
429
472
end Get_Spec_Aggregate_Designators ;
430
473
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
+
431
608
-- ----------------------
432
609
-- Propose_Completion --
433
610
-- ----------------------
@@ -464,6 +641,16 @@ package body LSP.Ada_Completions.Parameters is
464
641
Names => Names,
465
642
Unsorted_Res => Unsorted_Res);
466
643
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
+
467
654
declare
468
655
Min_Width : constant Natural := Unsorted_Res.Length'Img'Length - 1 ;
469
656
begin
0 commit comments