@@ -142,22 +142,26 @@ package body LSP.Clients is
142
142
procedure Show_Message
143
143
(Stream : access Ada.Streams.Root_Stream_Type'Class;
144
144
Handler : access LSP.Client_Notification_Receivers
145
- .Client_Notification_Receiver'Class);
145
+ .Client_Notification_Receiver'Class;
146
+ Token : LSP.Types.LSP_Number_Or_String);
146
147
147
148
procedure Log_Message
148
149
(Stream : access Ada.Streams.Root_Stream_Type'Class;
149
150
Handler : access LSP.Client_Notification_Receivers
150
- .Client_Notification_Receiver'Class);
151
+ .Client_Notification_Receiver'Class;
152
+ Token : LSP.Types.LSP_Number_Or_String);
151
153
152
154
procedure Publish_Diagnostics
153
155
(Stream : access Ada.Streams.Root_Stream_Type'Class;
154
156
Handler : access LSP.Client_Notification_Receivers
155
- .Client_Notification_Receiver'Class);
157
+ .Client_Notification_Receiver'Class;
158
+ Token : LSP.Types.LSP_Number_Or_String);
156
159
157
160
procedure Progress
158
161
(Stream : access Ada.Streams.Root_Stream_Type'Class;
159
162
Handler : access LSP.Client_Notification_Receivers
160
- .Client_Notification_Receiver'Class);
163
+ .Client_Notification_Receiver'Class;
164
+ Token : LSP.Types.LSP_Number_Or_String);
161
165
162
166
end Decoders ;
163
167
@@ -461,8 +465,10 @@ package body LSP.Clients is
461
465
procedure Log_Message
462
466
(Stream : access Ada.Streams.Root_Stream_Type'Class;
463
467
Handler : access LSP.Client_Notification_Receivers
464
- .Client_Notification_Receiver'Class)
468
+ .Client_Notification_Receiver'Class;
469
+ Token : LSP.Types.LSP_Number_Or_String)
465
470
is
471
+ pragma Unreferenced (Token);
466
472
Message : LogMessage_Notification;
467
473
begin
468
474
LogMessage_Notification'Read (Stream, Message);
@@ -476,8 +482,10 @@ package body LSP.Clients is
476
482
procedure Publish_Diagnostics
477
483
(Stream : access Ada.Streams.Root_Stream_Type'Class;
478
484
Handler : access LSP.Client_Notification_Receivers
479
- .Client_Notification_Receiver'Class)
485
+ .Client_Notification_Receiver'Class;
486
+ Token : LSP.Types.LSP_Number_Or_String)
480
487
is
488
+ pragma Unreferenced (Token);
481
489
Message : PublishDiagnostics_Notification;
482
490
begin
483
491
PublishDiagnostics_Notification'Read (Stream, Message);
@@ -491,8 +499,10 @@ package body LSP.Clients is
491
499
procedure Show_Message
492
500
(Stream : access Ada.Streams.Root_Stream_Type'Class;
493
501
Handler : access LSP.Client_Notification_Receivers
494
- .Client_Notification_Receiver'Class)
502
+ .Client_Notification_Receiver'Class;
503
+ Token : LSP.Types.LSP_Number_Or_String)
495
504
is
505
+ pragma Unreferenced (Token);
496
506
Message : ShowMessage_Notification;
497
507
begin
498
508
ShowMessage_Notification'Read (Stream, Message);
@@ -506,12 +516,28 @@ package body LSP.Clients is
506
516
procedure Progress
507
517
(Stream : access Ada.Streams.Root_Stream_Type'Class;
508
518
Handler : access LSP.Client_Notification_Receivers
509
- .Client_Notification_Receiver'Class)
510
- is
511
- Message : Progress_Notification;
519
+ .Client_Notification_Receiver'Class;
520
+ Token : LSP.Types.LSP_Number_Or_String) is
512
521
begin
513
- Progress_Notification'Read (Stream, Message);
514
- Handler.On_Progress (Message.params);
522
+ case Handler.Get_Progress_Type (Token) is
523
+ when LSP.Client_Notification_Receivers.ProgressParams =>
524
+ declare
525
+ Message : Progress_Notification;
526
+ begin
527
+ Progress_Notification'Read (Stream, Message);
528
+ Handler.On_Progress (Message.params);
529
+ end ;
530
+
531
+ when LSP.Client_Notification_Receivers.SymbolInformation =>
532
+ declare
533
+ Message : SymbolInformation_Vectors_Notification;
534
+ begin
535
+ SymbolInformation_Vectors_Notification'Read
536
+ (Stream, Message);
537
+ Handler.On_Progress_SymbolInformation_Vector
538
+ (Message.params);
539
+ end ;
540
+ end case ;
515
541
end Progress ;
516
542
517
543
end Decoders ;
@@ -588,6 +614,7 @@ package body LSP.Clients is
588
614
procedure Look_Ahead
589
615
(Id : out LSP.Types.LSP_Number_Or_String;
590
616
Method : out LSP.Types.Optional_String;
617
+ Token : out LSP.Types.LSP_Number_Or_String;
591
618
Is_Error : in out Boolean);
592
619
593
620
Memory : aliased
@@ -600,6 +627,7 @@ package body LSP.Clients is
600
627
procedure Look_Ahead
601
628
(Id : out LSP.Types.LSP_Number_Or_String;
602
629
Method : out LSP.Types.Optional_String;
630
+ Token : out LSP.Types.LSP_Number_Or_String;
603
631
Is_Error : in out Boolean)
604
632
is
605
633
use all type VSS.JSON.Pull_Readers.JSON_Event_Kind;
@@ -628,24 +656,69 @@ package body LSP.Clients is
628
656
Id :=
629
657
(Is_Number => False,
630
658
String => R.String_Value);
659
+
631
660
when Number_Value =>
632
661
Id :=
633
662
(Is_Number => True,
634
663
Number => LSP.Types.LSP_Number
635
664
(R.Number_Value.Integer_Value));
665
+
636
666
when others =>
637
667
raise Constraint_Error;
638
668
end case ;
639
669
R.Read_Next;
670
+
640
671
elsif Key = " method" then
641
672
pragma Assert (R.Is_String_Value);
642
673
Method := (Is_Set => True,
643
674
Value =>
644
675
LSP.Types.To_LSP_String (R.String_Value));
645
676
R.Read_Next;
677
+
646
678
elsif Key = " error" then
647
679
Is_Error := True;
648
680
JS.Skip_Value;
681
+
682
+ elsif Key = " params" then
683
+ -- parse 'params' object to get 'token' value
684
+ -- from a notification if any
685
+
686
+ pragma Assert (R.Is_Start_Object);
687
+ R.Read_Next;
688
+
689
+ while not R.Is_End_Object loop
690
+ pragma Assert (R.Is_Key_Name);
691
+ declare
692
+ Key : constant String :=
693
+ VSS.Strings.Conversions.To_UTF_8_String (R.Key_Name);
694
+ begin
695
+ R.Read_Next;
696
+
697
+ if Key = " token" then
698
+ case R.Event_Kind is
699
+ when String_Value =>
700
+ Token :=
701
+ (Is_Number => False,
702
+ String => R.String_Value);
703
+
704
+ when Number_Value =>
705
+ Token :=
706
+ (Is_Number => True,
707
+ Number => LSP.Types.LSP_Number
708
+ (R.Number_Value.Integer_Value));
709
+
710
+ when others =>
711
+ raise Constraint_Error;
712
+ end case ;
713
+ R.Read_Next;
714
+
715
+ else
716
+ JS.Skip_Value;
717
+ end if ;
718
+ end ;
719
+ end loop ;
720
+ R.Read_Next;
721
+
649
722
else
650
723
JS.Skip_Value;
651
724
end if ;
@@ -660,6 +733,8 @@ package body LSP.Clients is
660
733
(Is_Server_Side => False, R => Reader'Unchecked_Access);
661
734
Id : LSP.Types.LSP_Number_Or_String;
662
735
Method : LSP.Types.Optional_String;
736
+ Token : LSP.Types.LSP_Number_Or_String :=
737
+ (Is_Number => False, String => VSS.Strings.Empty_Virtual_String);
663
738
664
739
Is_Error : Boolean := False;
665
740
@@ -671,7 +746,7 @@ package body LSP.Clients is
671
746
(VSS.Stream_Element_Vectors.Conversions.Unchecked_From_Unbounded_String
672
747
(Data));
673
748
674
- Look_Ahead (Id, Method, Is_Error);
749
+ Look_Ahead (Id, Method, Token, Is_Error);
675
750
Reader.Set_Stream (Memory'Unchecked_Access);
676
751
Stream.R.Read_Next;
677
752
pragma Assert (Stream.R.Is_Start_Document);
@@ -803,7 +878,7 @@ package body LSP.Clients is
803
878
begin
804
879
if Notification_Maps.Has_Element (Position) then
805
880
Notification_Maps.Element (Position).all
806
- (Stream'Access , Self.Notification);
881
+ (Stream'Access , Self.Notification, Token );
807
882
end if ;
808
883
end ;
809
884
end if ;
0 commit comments