6
6
with Ada.Command_Line ;
7
7
with Ada.Containers.Hashed_Maps ;
8
8
with Ada.Containers.Vectors ;
9
- with Ada.Exceptions ; use Ada.Exceptions;
10
9
with Ada.Strings.Unbounded ; use Ada.Strings.Unbounded;
11
10
with Ada.Text_IO ; use Ada.Text_IO;
12
11
with Ada.Text_IO.Unbounded_IO ; use Ada.Text_IO.Unbounded_IO;
@@ -28,6 +27,7 @@ use Langkit_Support.Internal.Descriptor;
28
27
with Langkit_Support.Internal.Unparsing ;
29
28
use Langkit_Support.Internal.Unparsing;
30
29
with Langkit_Support.Prettier_Utils ; use Langkit_Support.Prettier_Utils;
30
+ with Langkit_Support.Slocs ; use Langkit_Support.Slocs;
31
31
with Langkit_Support.Symbols ; use Langkit_Support.Symbols;
32
32
33
33
package body Langkit_Support.Generic_API.Unparsing is
@@ -480,7 +480,10 @@ package body Langkit_Support.Generic_API.Unparsing is
480
480
-- -------------------------
481
481
482
482
function Load_Unparsing_Config
483
- (Language : Language_Id; Filename : String) return Unparsing_Configuration
483
+ (Language : Language_Id;
484
+ Filename : String;
485
+ Diagnostics : in out Diagnostics_Vectors.Vector)
486
+ return Unparsing_Configuration
484
487
is
485
488
-- Create a map so that we can lookup nodes/fields by name
486
489
@@ -618,6 +621,10 @@ package body Langkit_Support.Generic_API.Unparsing is
618
621
-- Assuming that JSON is the "fields" configuration for Node, parse its
619
622
-- field configurations and set Configs accordingly.
620
623
624
+ procedure Abort_Parsing (Message : String) with No_Return;
625
+ -- Append an item to ``Diagnostics`` and raise an Invalid_Input
626
+ -- exception.
627
+
621
628
Result : constant Unparsing_Configuration_Access :=
622
629
new Unparsing_Configuration_Record;
623
630
Pool : Document_Pool renames Result.Pool;
@@ -630,7 +637,7 @@ package body Langkit_Support.Generic_API.Unparsing is
630
637
T : constant Type_Ref := Map.Lookup_Type (To_Symbol (Name));
631
638
begin
632
639
if T = No_Type_Ref or else not Is_Node_Type (T) then
633
- raise Invalid_Input with " invalid node name: " & Name;
640
+ Abort_Parsing ( " invalid node name: " & Name) ;
634
641
end if ;
635
642
return To_Index (T);
636
643
end To_Type_Index ;
@@ -646,14 +653,14 @@ package body Langkit_Support.Generic_API.Unparsing is
646
653
Map.Lookup_Struct_Member (Node, To_Symbol (Name));
647
654
begin
648
655
if M = No_Struct_Member_Ref then
649
- raise Invalid_Input with
650
- " invalid field for " & Node_Type_Image (Node) & " : " & Name;
656
+ Abort_Parsing
657
+ ( " invalid field for " & Node_Type_Image (Node) & " : " & Name) ;
651
658
elsif not Is_Field (M) then
652
- raise Invalid_Input with
653
- Name & " is not a syntax field for " & Node_Type_Image (Node);
659
+ Abort_Parsing
660
+ ( Name & " is not a syntax field for " & Node_Type_Image (Node) );
654
661
elsif Is_Null_For (M, Node) then
655
- raise Invalid_Input with
656
- Name & " is a null field for " & Node_Type_Image (Node);
662
+ Abort_Parsing
663
+ ( Name & " is a null field for " & Node_Type_Image (Node) );
657
664
else
658
665
return To_Index (M);
659
666
end if ;
@@ -1168,7 +1175,7 @@ package body Langkit_Support.Generic_API.Unparsing is
1168
1175
when Field_Template =>
1169
1176
" template for " & Field_Image (Context.Field, Context.Node));
1170
1177
begin
1171
- raise Invalid_Input with Prefix & " : " & Message;
1178
+ Abort_Parsing ( Prefix & " : " & Message) ;
1172
1179
end Abort_Parsing ;
1173
1180
1174
1181
-- ------------------------
@@ -1220,6 +1227,16 @@ package body Langkit_Support.Generic_API.Unparsing is
1220
1227
JSON.Map_JSON_Object (Process'Access );
1221
1228
end Load_Field_Configs ;
1222
1229
1230
+ -- -----------------
1231
+ -- Abort_Parsing --
1232
+ -- -----------------
1233
+
1234
+ procedure Abort_Parsing (Message : String) is
1235
+ begin
1236
+ Append (Diagnostics, No_Source_Location_Range, To_Text (Message));
1237
+ raise Invalid_Input;
1238
+ end Abort_Parsing ;
1239
+
1223
1240
use type GNAT.Strings.String_Access;
1224
1241
1225
1242
-- First, parse the JSON document
@@ -1229,16 +1246,27 @@ package body Langkit_Support.Generic_API.Unparsing is
1229
1246
JSON : JSON_Value;
1230
1247
begin
1231
1248
if JSON_Text = null then
1232
- raise Invalid_Input with " cannot read " & Filename;
1249
+ Abort_Parsing ( " cannot read " & Filename) ;
1233
1250
end if ;
1234
1251
JSON_Result := Read (JSON_Text.all );
1235
1252
GNAT.Strings.Free (JSON_Text);
1236
1253
1237
1254
if JSON_Result.Success then
1238
1255
JSON := JSON_Result.Value;
1239
1256
else
1240
- raise Invalid_Input with
1241
- Filename & " :" & Format_Parsing_Error (JSON_Result.Error);
1257
+ declare
1258
+ Sloc : constant Source_Location :=
1259
+ (Line_Number (JSON_Result.Error.Line),
1260
+ Column_Number (JSON_Result.Error.Column));
1261
+ Sloc_Range : constant Source_Location_Range :=
1262
+ Make_Range (Sloc, Sloc);
1263
+ begin
1264
+ Append
1265
+ (Diagnostics,
1266
+ Sloc_Range,
1267
+ To_Text (To_String (JSON_Result.Error.Message)));
1268
+ raise Invalid_Input;
1269
+ end ;
1242
1270
end if ;
1243
1271
1244
1272
-- Then load the unparsing configuration from it. Require a
@@ -1248,7 +1276,7 @@ package body Langkit_Support.Generic_API.Unparsing is
1248
1276
Result.Language := Language;
1249
1277
1250
1278
if not JSON.Has_Field (" node_configs" ) then
1251
- raise Invalid_Input with " missing "" node_configs"" key" ;
1279
+ Abort_Parsing ( " missing "" node_configs"" key" ) ;
1252
1280
end if ;
1253
1281
1254
1282
declare
@@ -1288,9 +1316,9 @@ package body Langkit_Support.Generic_API.Unparsing is
1288
1316
1289
1317
if Value.Has_Field (" sep" ) then
1290
1318
if not Is_List_Node (Node) then
1291
- raise Invalid_Input with
1292
- Name & " is not a list node, invalid "" sep"" "
1293
- & " configuration" ;
1319
+ Abort_Parsing
1320
+ ( Name & " is not a list node, invalid "" sep"" "
1321
+ & " configuration" ) ;
1294
1322
end if ;
1295
1323
declare
1296
1324
Context : Template_Parsing_Context :=
@@ -1395,8 +1423,9 @@ package body Langkit_Support.Generic_API.Unparsing is
1395
1423
1396
1424
exception
1397
1425
when Invalid_Input =>
1426
+ pragma Assert (not Diagnostics.Is_Empty);
1398
1427
Destroy (Symbols);
1399
- raise ;
1428
+ return No_Unparsing_Configuration ;
1400
1429
end Load_Unparsing_Config ;
1401
1430
1402
1431
-- ------------------------
@@ -1854,14 +1883,16 @@ package body Langkit_Support.Generic_API.Unparsing is
1854
1883
-- Parse the configuration file and the source file to pretty-print.
1855
1884
-- Abort if there is a parsing failure.
1856
1885
1886
+ declare
1887
+ Diagnostics : Diagnostics_Vectors.Vector;
1888
+ Filename : constant String := To_String (Config_Filename.Get);
1857
1889
begin
1858
- Config :=
1859
- Load_Unparsing_Config (Language, To_String (Config_Filename.Get));
1860
- exception
1861
- when Exc : Invalid_Input =>
1890
+ Config := Load_Unparsing_Config (Language, Filename, Diagnostics);
1891
+ if Config = No_Unparsing_Configuration then
1862
1892
Put_Line (" Error when loading the unparsing configuration:" );
1863
- Put_Line (Exception_Message (Exc) );
1893
+ Print (Diagnostics );
1864
1894
return ;
1895
+ end if ;
1865
1896
end ;
1866
1897
Context := Create_Context (Language);
1867
1898
Unit := Context.Get_From_File
0 commit comments