@konomanoasa/tree-sitter-diagnostic-sh 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.toml +5 -5
- package/README.md +0 -2
- package/package.json +4 -3
- package/src/parser.c +1 -1
- package/src/scanner.c +305 -61
- package/test/support/parser-cases.json +735 -6
- package/tree-sitter.json +1 -1
|
@@ -7515,16 +7515,32 @@
|
|
|
7515
7515
|
"kind": "dollar_single_quote_escape",
|
|
7516
7516
|
"start": 30
|
|
7517
7517
|
},
|
|
7518
|
-
"range": [30,
|
|
7518
|
+
"range": [30, 32],
|
|
7519
7519
|
"fault": {
|
|
7520
7520
|
"kind": "unspecified_dollar_quote_escape",
|
|
7521
7521
|
"range": [30, 32]
|
|
7522
7522
|
},
|
|
7523
7523
|
"boundary": {
|
|
7524
7524
|
"kind": "recovery_resume",
|
|
7525
|
-
"range": [
|
|
7525
|
+
"range": [32, 32]
|
|
7526
|
+
},
|
|
7527
|
+
"fragments": []
|
|
7528
|
+
},
|
|
7529
|
+
{
|
|
7530
|
+
"owner": {
|
|
7531
|
+
"kind": "dollar_single_quote_escape",
|
|
7532
|
+
"start": 32
|
|
7533
|
+
},
|
|
7534
|
+
"range": [32, 34],
|
|
7535
|
+
"fault": {
|
|
7536
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
7537
|
+
"range": [32, 34]
|
|
7538
|
+
},
|
|
7539
|
+
"boundary": {
|
|
7540
|
+
"kind": "recovery_resume",
|
|
7541
|
+
"range": [34, 34]
|
|
7526
7542
|
},
|
|
7527
|
-
"fragments": [
|
|
7543
|
+
"fragments": []
|
|
7528
7544
|
}
|
|
7529
7545
|
]
|
|
7530
7546
|
},
|
|
@@ -11879,16 +11895,25 @@
|
|
|
11879
11895
|
]
|
|
11880
11896
|
},
|
|
11881
11897
|
{
|
|
11882
|
-
"name": "a bad dollar-quote escape
|
|
11898
|
+
"name": "a bad dollar-quote escape ends before following literal text",
|
|
11883
11899
|
"source": "echo $'a\\qtail'",
|
|
11884
11900
|
"expected": [
|
|
11885
11901
|
{
|
|
11886
11902
|
"owner": {
|
|
11887
11903
|
"kind": "dollar_single_quote_escape",
|
|
11888
11904
|
"start": 8,
|
|
11889
|
-
"end":
|
|
11905
|
+
"end": 10
|
|
11906
|
+
},
|
|
11907
|
+
"range": [8, 10],
|
|
11908
|
+
"fault": {
|
|
11909
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
11910
|
+
"range": [8, 10]
|
|
11890
11911
|
},
|
|
11891
|
-
"
|
|
11912
|
+
"boundary": {
|
|
11913
|
+
"kind": "recovery_resume",
|
|
11914
|
+
"range": [10, 10]
|
|
11915
|
+
},
|
|
11916
|
+
"fragments": []
|
|
11892
11917
|
}
|
|
11893
11918
|
]
|
|
11894
11919
|
},
|
|
@@ -12761,5 +12786,709 @@
|
|
|
12761
12786
|
"range": [4, 9]
|
|
12762
12787
|
}
|
|
12763
12788
|
]
|
|
12789
|
+
},
|
|
12790
|
+
{
|
|
12791
|
+
"name": "a NUL inside an invalid function body token takes priority after its prefix",
|
|
12792
|
+
"source": "f() a\u0000",
|
|
12793
|
+
"expected": [
|
|
12794
|
+
{
|
|
12795
|
+
"owner": null,
|
|
12796
|
+
"range": [5, 6],
|
|
12797
|
+
"fault": {
|
|
12798
|
+
"kind": "nul_character",
|
|
12799
|
+
"range": [5, 6]
|
|
12800
|
+
},
|
|
12801
|
+
"boundary": {
|
|
12802
|
+
"kind": "recovery_resume",
|
|
12803
|
+
"range": [6, 6]
|
|
12804
|
+
},
|
|
12805
|
+
"fragments": []
|
|
12806
|
+
}
|
|
12807
|
+
]
|
|
12808
|
+
},
|
|
12809
|
+
{
|
|
12810
|
+
"name": "an invalid UTF-8 byte inside a function body token keeps its byte range after a multibyte prefix",
|
|
12811
|
+
"source": [102, 40, 41, 32, 231, 140, 171, 255, 97],
|
|
12812
|
+
"expected": [
|
|
12813
|
+
{
|
|
12814
|
+
"owner": null,
|
|
12815
|
+
"range": [7, 8],
|
|
12816
|
+
"fault": {
|
|
12817
|
+
"kind": "invalid_encoding",
|
|
12818
|
+
"range": [7, 8]
|
|
12819
|
+
},
|
|
12820
|
+
"boundary": {
|
|
12821
|
+
"kind": "recovery_resume",
|
|
12822
|
+
"range": [8, 8]
|
|
12823
|
+
},
|
|
12824
|
+
"fragments": []
|
|
12825
|
+
}
|
|
12826
|
+
]
|
|
12827
|
+
},
|
|
12828
|
+
{
|
|
12829
|
+
"name": "input faults inside one invalid token retain separate recoveries and a later independent gap",
|
|
12830
|
+
"source": [102, 40, 41, 32, 97, 0, 98, 255, 59, 32, 99, 97, 116, 32, 62],
|
|
12831
|
+
"expected": [
|
|
12832
|
+
{
|
|
12833
|
+
"owner": null,
|
|
12834
|
+
"range": [5, 6],
|
|
12835
|
+
"fault": {
|
|
12836
|
+
"kind": "nul_character",
|
|
12837
|
+
"range": [5, 6]
|
|
12838
|
+
},
|
|
12839
|
+
"boundary": {
|
|
12840
|
+
"kind": "recovery_resume",
|
|
12841
|
+
"range": [6, 6]
|
|
12842
|
+
},
|
|
12843
|
+
"fragments": []
|
|
12844
|
+
},
|
|
12845
|
+
{
|
|
12846
|
+
"owner": null,
|
|
12847
|
+
"range": [7, 8],
|
|
12848
|
+
"fault": {
|
|
12849
|
+
"kind": "invalid_encoding",
|
|
12850
|
+
"range": [7, 8]
|
|
12851
|
+
},
|
|
12852
|
+
"boundary": {
|
|
12853
|
+
"kind": "recovery_resume",
|
|
12854
|
+
"range": [8, 8]
|
|
12855
|
+
},
|
|
12856
|
+
"fragments": []
|
|
12857
|
+
},
|
|
12858
|
+
{
|
|
12859
|
+
"owner": {
|
|
12860
|
+
"kind": "io_redirect",
|
|
12861
|
+
"start": 14,
|
|
12862
|
+
"end": 15
|
|
12863
|
+
},
|
|
12864
|
+
"range": [15, 15],
|
|
12865
|
+
"fault": {
|
|
12866
|
+
"kind": "redirection_target_gap",
|
|
12867
|
+
"range": [15, 15]
|
|
12868
|
+
},
|
|
12869
|
+
"boundary": {
|
|
12870
|
+
"kind": "recovery_eof",
|
|
12871
|
+
"range": [15, 15]
|
|
12872
|
+
},
|
|
12873
|
+
"fragments": []
|
|
12874
|
+
}
|
|
12875
|
+
]
|
|
12876
|
+
},
|
|
12877
|
+
{
|
|
12878
|
+
"name": "an input fault inside an invalid for header token does not inherit header recovery",
|
|
12879
|
+
"source": "for x a\u0000; do :; done",
|
|
12880
|
+
"expected": [
|
|
12881
|
+
{
|
|
12882
|
+
"owner": null,
|
|
12883
|
+
"range": [7, 8],
|
|
12884
|
+
"fault": {
|
|
12885
|
+
"kind": "nul_character",
|
|
12886
|
+
"range": [7, 8]
|
|
12887
|
+
},
|
|
12888
|
+
"boundary": {
|
|
12889
|
+
"kind": "recovery_resume",
|
|
12890
|
+
"range": [8, 8]
|
|
12891
|
+
},
|
|
12892
|
+
"fragments": []
|
|
12893
|
+
}
|
|
12894
|
+
]
|
|
12895
|
+
},
|
|
12896
|
+
{
|
|
12897
|
+
"name": "a NUL in a recovery fragment does not replace the earlier confirmed fault",
|
|
12898
|
+
"source": "echo ${x:bad\u0000}",
|
|
12899
|
+
"expected": [
|
|
12900
|
+
{
|
|
12901
|
+
"owner": {
|
|
12902
|
+
"kind": "parameter_expansion",
|
|
12903
|
+
"start": 5,
|
|
12904
|
+
"end": 14
|
|
12905
|
+
},
|
|
12906
|
+
"range": [9, 13],
|
|
12907
|
+
"fault": {
|
|
12908
|
+
"kind": "parameter_operator_error",
|
|
12909
|
+
"range": [9, 10]
|
|
12910
|
+
},
|
|
12911
|
+
"boundary": {
|
|
12912
|
+
"kind": "recovery_resume",
|
|
12913
|
+
"range": [13, 13]
|
|
12914
|
+
},
|
|
12915
|
+
"fragments": [[10, 13]]
|
|
12916
|
+
}
|
|
12917
|
+
]
|
|
12918
|
+
},
|
|
12919
|
+
{
|
|
12920
|
+
"name": "adjacent unspecified dollar quote escapes are independent issues",
|
|
12921
|
+
"source": "echo $'\\q\\z'",
|
|
12922
|
+
"expected": [
|
|
12923
|
+
{
|
|
12924
|
+
"owner": {
|
|
12925
|
+
"kind": "dollar_single_quote_escape",
|
|
12926
|
+
"start": 7,
|
|
12927
|
+
"end": 9
|
|
12928
|
+
},
|
|
12929
|
+
"range": [7, 9],
|
|
12930
|
+
"fault": {
|
|
12931
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
12932
|
+
"range": [7, 9]
|
|
12933
|
+
},
|
|
12934
|
+
"boundary": {
|
|
12935
|
+
"kind": "recovery_resume",
|
|
12936
|
+
"range": [9, 9]
|
|
12937
|
+
},
|
|
12938
|
+
"fragments": []
|
|
12939
|
+
},
|
|
12940
|
+
{
|
|
12941
|
+
"owner": {
|
|
12942
|
+
"kind": "dollar_single_quote_escape",
|
|
12943
|
+
"start": 9,
|
|
12944
|
+
"end": 11
|
|
12945
|
+
},
|
|
12946
|
+
"range": [9, 11],
|
|
12947
|
+
"fault": {
|
|
12948
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
12949
|
+
"range": [9, 11]
|
|
12950
|
+
},
|
|
12951
|
+
"boundary": {
|
|
12952
|
+
"kind": "recovery_resume",
|
|
12953
|
+
"range": [11, 11]
|
|
12954
|
+
},
|
|
12955
|
+
"fragments": []
|
|
12956
|
+
}
|
|
12957
|
+
]
|
|
12958
|
+
},
|
|
12959
|
+
{
|
|
12960
|
+
"name": "dollar quote escapes resume before intervening multibyte literal text",
|
|
12961
|
+
"source": "echo $'\\q猫\\z'",
|
|
12962
|
+
"expected": [
|
|
12963
|
+
{
|
|
12964
|
+
"owner": {
|
|
12965
|
+
"kind": "dollar_single_quote_escape",
|
|
12966
|
+
"start": 7,
|
|
12967
|
+
"end": 9
|
|
12968
|
+
},
|
|
12969
|
+
"range": [7, 9],
|
|
12970
|
+
"fault": {
|
|
12971
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
12972
|
+
"range": [7, 9]
|
|
12973
|
+
},
|
|
12974
|
+
"boundary": {
|
|
12975
|
+
"kind": "recovery_resume",
|
|
12976
|
+
"range": [9, 9]
|
|
12977
|
+
},
|
|
12978
|
+
"fragments": []
|
|
12979
|
+
},
|
|
12980
|
+
{
|
|
12981
|
+
"owner": {
|
|
12982
|
+
"kind": "dollar_single_quote_escape",
|
|
12983
|
+
"start": 12,
|
|
12984
|
+
"end": 14
|
|
12985
|
+
},
|
|
12986
|
+
"range": [12, 14],
|
|
12987
|
+
"fault": {
|
|
12988
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
12989
|
+
"range": [12, 14]
|
|
12990
|
+
},
|
|
12991
|
+
"boundary": {
|
|
12992
|
+
"kind": "recovery_resume",
|
|
12993
|
+
"range": [14, 14]
|
|
12994
|
+
},
|
|
12995
|
+
"fragments": []
|
|
12996
|
+
}
|
|
12997
|
+
]
|
|
12998
|
+
},
|
|
12999
|
+
{
|
|
13000
|
+
"name": "a complete unspecified escape at EOF leaves an independent dollar quote gap",
|
|
13001
|
+
"source": "echo $'\\q",
|
|
13002
|
+
"expected": [
|
|
13003
|
+
{
|
|
13004
|
+
"owner": {
|
|
13005
|
+
"kind": "dollar_single_quote_escape",
|
|
13006
|
+
"start": 7,
|
|
13007
|
+
"end": 9
|
|
13008
|
+
},
|
|
13009
|
+
"range": [7, 9],
|
|
13010
|
+
"fault": {
|
|
13011
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13012
|
+
"range": [7, 9]
|
|
13013
|
+
},
|
|
13014
|
+
"boundary": {
|
|
13015
|
+
"kind": "recovery_resume",
|
|
13016
|
+
"range": [9, 9]
|
|
13017
|
+
},
|
|
13018
|
+
"fragments": []
|
|
13019
|
+
},
|
|
13020
|
+
{
|
|
13021
|
+
"owner": {
|
|
13022
|
+
"kind": "dollar_single_quoted",
|
|
13023
|
+
"start": 5,
|
|
13024
|
+
"end": 9
|
|
13025
|
+
},
|
|
13026
|
+
"range": [9, 9],
|
|
13027
|
+
"fault": {
|
|
13028
|
+
"kind": "dollar_quote_gap",
|
|
13029
|
+
"range": [9, 9]
|
|
13030
|
+
},
|
|
13031
|
+
"boundary": {
|
|
13032
|
+
"kind": "recovery_eof",
|
|
13033
|
+
"range": [9, 9]
|
|
13034
|
+
},
|
|
13035
|
+
"fragments": []
|
|
13036
|
+
}
|
|
13037
|
+
]
|
|
13038
|
+
},
|
|
13039
|
+
{
|
|
13040
|
+
"name": "an incomplete escape after a recovered escape suppresses the derived quote gap",
|
|
13041
|
+
"source": "echo $'\\q\\",
|
|
13042
|
+
"expected": [
|
|
13043
|
+
{
|
|
13044
|
+
"owner": {
|
|
13045
|
+
"kind": "dollar_single_quote_escape",
|
|
13046
|
+
"start": 7,
|
|
13047
|
+
"end": 9
|
|
13048
|
+
},
|
|
13049
|
+
"range": [7, 9],
|
|
13050
|
+
"fault": {
|
|
13051
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13052
|
+
"range": [7, 9]
|
|
13053
|
+
},
|
|
13054
|
+
"boundary": {
|
|
13055
|
+
"kind": "recovery_resume",
|
|
13056
|
+
"range": [9, 9]
|
|
13057
|
+
},
|
|
13058
|
+
"fragments": []
|
|
13059
|
+
},
|
|
13060
|
+
{
|
|
13061
|
+
"owner": {
|
|
13062
|
+
"kind": "dollar_single_quote_escape",
|
|
13063
|
+
"start": 9,
|
|
13064
|
+
"end": 10
|
|
13065
|
+
},
|
|
13066
|
+
"range": [9, 10],
|
|
13067
|
+
"fault": {
|
|
13068
|
+
"kind": "incomplete_escape",
|
|
13069
|
+
"range": [9, 10]
|
|
13070
|
+
},
|
|
13071
|
+
"boundary": {
|
|
13072
|
+
"kind": "recovery_eof",
|
|
13073
|
+
"range": [10, 10]
|
|
13074
|
+
},
|
|
13075
|
+
"fragments": []
|
|
13076
|
+
}
|
|
13077
|
+
]
|
|
13078
|
+
},
|
|
13079
|
+
{
|
|
13080
|
+
"name": "each unspecified escape form resumes at its own lexical end",
|
|
13081
|
+
"source": "echo $'\\xg\\c@\\777\\q'",
|
|
13082
|
+
"expected": [
|
|
13083
|
+
{
|
|
13084
|
+
"owner": {
|
|
13085
|
+
"kind": "dollar_single_quote_escape",
|
|
13086
|
+
"start": 7,
|
|
13087
|
+
"end": 9
|
|
13088
|
+
},
|
|
13089
|
+
"range": [7, 9],
|
|
13090
|
+
"fault": {
|
|
13091
|
+
"kind": "unspecified_empty_hex_escape",
|
|
13092
|
+
"range": [7, 9]
|
|
13093
|
+
},
|
|
13094
|
+
"boundary": {
|
|
13095
|
+
"kind": "recovery_resume",
|
|
13096
|
+
"range": [9, 9]
|
|
13097
|
+
},
|
|
13098
|
+
"fragments": []
|
|
13099
|
+
},
|
|
13100
|
+
{
|
|
13101
|
+
"owner": {
|
|
13102
|
+
"kind": "dollar_single_quote_escape",
|
|
13103
|
+
"start": 10,
|
|
13104
|
+
"end": 13
|
|
13105
|
+
},
|
|
13106
|
+
"range": [10, 13],
|
|
13107
|
+
"fault": {
|
|
13108
|
+
"kind": "unspecified_control_escape",
|
|
13109
|
+
"range": [10, 13]
|
|
13110
|
+
},
|
|
13111
|
+
"boundary": {
|
|
13112
|
+
"kind": "recovery_resume",
|
|
13113
|
+
"range": [13, 13]
|
|
13114
|
+
},
|
|
13115
|
+
"fragments": []
|
|
13116
|
+
},
|
|
13117
|
+
{
|
|
13118
|
+
"owner": {
|
|
13119
|
+
"kind": "dollar_single_quote_escape",
|
|
13120
|
+
"start": 13,
|
|
13121
|
+
"end": 17
|
|
13122
|
+
},
|
|
13123
|
+
"range": [13, 17],
|
|
13124
|
+
"fault": {
|
|
13125
|
+
"kind": "unspecified_octal_escape",
|
|
13126
|
+
"range": [13, 17]
|
|
13127
|
+
},
|
|
13128
|
+
"boundary": {
|
|
13129
|
+
"kind": "recovery_resume",
|
|
13130
|
+
"range": [17, 17]
|
|
13131
|
+
},
|
|
13132
|
+
"fragments": []
|
|
13133
|
+
},
|
|
13134
|
+
{
|
|
13135
|
+
"owner": {
|
|
13136
|
+
"kind": "dollar_single_quote_escape",
|
|
13137
|
+
"start": 17,
|
|
13138
|
+
"end": 19
|
|
13139
|
+
},
|
|
13140
|
+
"range": [17, 19],
|
|
13141
|
+
"fault": {
|
|
13142
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13143
|
+
"range": [17, 19]
|
|
13144
|
+
},
|
|
13145
|
+
"boundary": {
|
|
13146
|
+
"kind": "recovery_resume",
|
|
13147
|
+
"range": [19, 19]
|
|
13148
|
+
},
|
|
13149
|
+
"fragments": []
|
|
13150
|
+
}
|
|
13151
|
+
]
|
|
13152
|
+
},
|
|
13153
|
+
{
|
|
13154
|
+
"name": "multiple unspecified delimiter escapes remain in one unrecoverable here-document region",
|
|
13155
|
+
"source": "cat <<$'\\q\\z'\nbody\nqz\n",
|
|
13156
|
+
"expected": [
|
|
13157
|
+
{
|
|
13158
|
+
"owner": {
|
|
13159
|
+
"kind": "dollar_single_quote_escape",
|
|
13160
|
+
"start": 8,
|
|
13161
|
+
"end": 22
|
|
13162
|
+
},
|
|
13163
|
+
"range": [8, 22],
|
|
13164
|
+
"fault": {
|
|
13165
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13166
|
+
"range": [8, 10]
|
|
13167
|
+
},
|
|
13168
|
+
"boundary": {
|
|
13169
|
+
"kind": "recovery_eof",
|
|
13170
|
+
"range": [22, 22]
|
|
13171
|
+
},
|
|
13172
|
+
"fragments": [[10, 22]]
|
|
13173
|
+
}
|
|
13174
|
+
]
|
|
13175
|
+
},
|
|
13176
|
+
{
|
|
13177
|
+
"name": "an undecidable escape delimiter skipped by header recovery keeps the header region to EOF",
|
|
13178
|
+
"source": "for x a <<$'\\q'; do :; done\nbody\nq\necho $%\n",
|
|
13179
|
+
"expected": [
|
|
13180
|
+
{
|
|
13181
|
+
"owner": {
|
|
13182
|
+
"kind": "for_clause",
|
|
13183
|
+
"start": 0,
|
|
13184
|
+
"end": 43
|
|
13185
|
+
},
|
|
13186
|
+
"range": [6, 43],
|
|
13187
|
+
"fault": {
|
|
13188
|
+
"kind": "invalid_for_header",
|
|
13189
|
+
"range": [6, 7]
|
|
13190
|
+
},
|
|
13191
|
+
"boundary": {
|
|
13192
|
+
"kind": "recovery_eof",
|
|
13193
|
+
"range": [43, 43]
|
|
13194
|
+
},
|
|
13195
|
+
"fragments": [[7, 43]]
|
|
13196
|
+
}
|
|
13197
|
+
]
|
|
13198
|
+
},
|
|
13199
|
+
{
|
|
13200
|
+
"name": "an undecodable delimiter skipped by header recovery keeps the header region to EOF past a later here-document",
|
|
13201
|
+
"source": [
|
|
13202
|
+
102, 111, 114, 32, 120, 32, 97, 32, 60, 60, 69, 255, 32, 60, 60, 70, 59,
|
|
13203
|
+
32, 100, 111, 32, 58, 59, 32, 100, 111, 110, 101, 10, 98, 111, 100, 121,
|
|
13204
|
+
10, 69, 255, 10, 102, 10, 70, 10, 101, 99, 104, 111, 32, 36, 37, 10
|
|
13205
|
+
],
|
|
13206
|
+
"expected": [
|
|
13207
|
+
{
|
|
13208
|
+
"owner": {
|
|
13209
|
+
"kind": "for_clause",
|
|
13210
|
+
"start": 0,
|
|
13211
|
+
"end": 49
|
|
13212
|
+
},
|
|
13213
|
+
"range": [6, 49],
|
|
13214
|
+
"fault": {
|
|
13215
|
+
"kind": "invalid_for_header",
|
|
13216
|
+
"range": [6, 7]
|
|
13217
|
+
},
|
|
13218
|
+
"boundary": {
|
|
13219
|
+
"kind": "recovery_eof",
|
|
13220
|
+
"range": [49, 49]
|
|
13221
|
+
},
|
|
13222
|
+
"fragments": [[7, 49]]
|
|
13223
|
+
}
|
|
13224
|
+
]
|
|
13225
|
+
},
|
|
13226
|
+
{
|
|
13227
|
+
"name": "an undecodable delimiter skipped by unexpected token recovery keeps the unowned region to EOF",
|
|
13228
|
+
"source": [
|
|
13229
|
+
124, 32, 97, 32, 60, 60, 69, 255, 10, 98, 111, 100, 121, 10, 69, 255, 10,
|
|
13230
|
+
101, 99, 104, 111, 32, 36, 37, 10
|
|
13231
|
+
],
|
|
13232
|
+
"expected": [
|
|
13233
|
+
{
|
|
13234
|
+
"owner": null,
|
|
13235
|
+
"range": [0, 25],
|
|
13236
|
+
"fault": {
|
|
13237
|
+
"kind": "unexpected_pipe",
|
|
13238
|
+
"range": [0, 1]
|
|
13239
|
+
},
|
|
13240
|
+
"boundary": {
|
|
13241
|
+
"kind": "recovery_eof",
|
|
13242
|
+
"range": [25, 25]
|
|
13243
|
+
},
|
|
13244
|
+
"fragments": [[1, 25]]
|
|
13245
|
+
}
|
|
13246
|
+
]
|
|
13247
|
+
},
|
|
13248
|
+
{
|
|
13249
|
+
"name": "an undecidable escape inside an arithmetic delimiter skipped by header recovery keeps the header region to EOF",
|
|
13250
|
+
"source": "for x a <<$((`echo $'\\q'`+1)); do :; done\nbody\necho $%\n",
|
|
13251
|
+
"expected": [
|
|
13252
|
+
{
|
|
13253
|
+
"owner": {
|
|
13254
|
+
"kind": "for_clause",
|
|
13255
|
+
"start": 0,
|
|
13256
|
+
"end": 55
|
|
13257
|
+
},
|
|
13258
|
+
"range": [6, 55],
|
|
13259
|
+
"fault": {
|
|
13260
|
+
"kind": "invalid_for_header",
|
|
13261
|
+
"range": [6, 7]
|
|
13262
|
+
},
|
|
13263
|
+
"boundary": {
|
|
13264
|
+
"kind": "recovery_eof",
|
|
13265
|
+
"range": [55, 55]
|
|
13266
|
+
},
|
|
13267
|
+
"fragments": [[7, 55]]
|
|
13268
|
+
}
|
|
13269
|
+
]
|
|
13270
|
+
},
|
|
13271
|
+
{
|
|
13272
|
+
"name": "an uncertain delimiter suppresses later body faults even when an end line is present and preserves outer issues",
|
|
13273
|
+
"source": "echo `cat <<$'\\q' <<F\nq\nF\n`; cat >",
|
|
13274
|
+
"expected": [
|
|
13275
|
+
{
|
|
13276
|
+
"owner": {
|
|
13277
|
+
"kind": "dollar_single_quote_escape",
|
|
13278
|
+
"start": 14,
|
|
13279
|
+
"end": 26
|
|
13280
|
+
},
|
|
13281
|
+
"range": [14, 26],
|
|
13282
|
+
"fault": {
|
|
13283
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13284
|
+
"range": [14, 16]
|
|
13285
|
+
},
|
|
13286
|
+
"boundary": {
|
|
13287
|
+
"kind": "recovery_resume",
|
|
13288
|
+
"range": [26, 26]
|
|
13289
|
+
},
|
|
13290
|
+
"fragments": [[16, 26]]
|
|
13291
|
+
},
|
|
13292
|
+
{
|
|
13293
|
+
"owner": {
|
|
13294
|
+
"kind": "io_redirect",
|
|
13295
|
+
"start": 33,
|
|
13296
|
+
"end": 34
|
|
13297
|
+
},
|
|
13298
|
+
"range": [34, 34],
|
|
13299
|
+
"fault": {
|
|
13300
|
+
"kind": "redirection_target_gap",
|
|
13301
|
+
"range": [34, 34]
|
|
13302
|
+
},
|
|
13303
|
+
"boundary": {
|
|
13304
|
+
"kind": "recovery_eof",
|
|
13305
|
+
"range": [34, 34]
|
|
13306
|
+
},
|
|
13307
|
+
"fragments": []
|
|
13308
|
+
}
|
|
13309
|
+
]
|
|
13310
|
+
},
|
|
13311
|
+
{
|
|
13312
|
+
"name": "an uncertain delimiter suppresses later body faults when no end line is present",
|
|
13313
|
+
"source": "echo `cat <<$'\\q' <<F\nbody\n`",
|
|
13314
|
+
"expected": [
|
|
13315
|
+
{
|
|
13316
|
+
"owner": {
|
|
13317
|
+
"kind": "dollar_single_quote_escape",
|
|
13318
|
+
"start": 14,
|
|
13319
|
+
"end": 27
|
|
13320
|
+
},
|
|
13321
|
+
"range": [14, 27],
|
|
13322
|
+
"fault": {
|
|
13323
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13324
|
+
"range": [14, 16]
|
|
13325
|
+
},
|
|
13326
|
+
"boundary": {
|
|
13327
|
+
"kind": "recovery_resume",
|
|
13328
|
+
"range": [27, 27]
|
|
13329
|
+
},
|
|
13330
|
+
"fragments": [[16, 27]]
|
|
13331
|
+
}
|
|
13332
|
+
]
|
|
13333
|
+
},
|
|
13334
|
+
{
|
|
13335
|
+
"name": "an uncertain delimiter caused by invalid UTF-8 suppresses later body faults at a closing backquote",
|
|
13336
|
+
"source": [
|
|
13337
|
+
101, 99, 104, 111, 32, 96, 99, 97, 116, 32, 60, 60, 69, 255, 32, 60, 60,
|
|
13338
|
+
70, 10, 69, 255, 10, 70, 10, 96
|
|
13339
|
+
],
|
|
13340
|
+
"expected": [
|
|
13341
|
+
{
|
|
13342
|
+
"owner": null,
|
|
13343
|
+
"range": [13, 24],
|
|
13344
|
+
"fault": {
|
|
13345
|
+
"kind": "invalid_encoding",
|
|
13346
|
+
"range": [13, 14]
|
|
13347
|
+
},
|
|
13348
|
+
"boundary": {
|
|
13349
|
+
"kind": "recovery_resume",
|
|
13350
|
+
"range": [24, 24]
|
|
13351
|
+
},
|
|
13352
|
+
"fragments": [[14, 24]]
|
|
13353
|
+
}
|
|
13354
|
+
]
|
|
13355
|
+
},
|
|
13356
|
+
{
|
|
13357
|
+
"name": "an uncertain delimiter after a completed body suppresses remaining queued body faults",
|
|
13358
|
+
"source": "echo `cat <<A <<$'\\q' <<F\nA\nq\nF\n`",
|
|
13359
|
+
"expected": [
|
|
13360
|
+
{
|
|
13361
|
+
"owner": {
|
|
13362
|
+
"kind": "dollar_single_quote_escape",
|
|
13363
|
+
"start": 18,
|
|
13364
|
+
"end": 32
|
|
13365
|
+
},
|
|
13366
|
+
"range": [18, 32],
|
|
13367
|
+
"fault": {
|
|
13368
|
+
"kind": "unspecified_dollar_quote_escape",
|
|
13369
|
+
"range": [18, 20]
|
|
13370
|
+
},
|
|
13371
|
+
"boundary": {
|
|
13372
|
+
"kind": "recovery_resume",
|
|
13373
|
+
"range": [32, 32]
|
|
13374
|
+
},
|
|
13375
|
+
"fragments": [[20, 32]]
|
|
13376
|
+
}
|
|
13377
|
+
]
|
|
13378
|
+
},
|
|
13379
|
+
{
|
|
13380
|
+
"name": "a fixed missing ternary colon rejects arithmetic before later expansions",
|
|
13381
|
+
"source": "echo $(( (1?2) + $x ))",
|
|
13382
|
+
"expected": [
|
|
13383
|
+
{
|
|
13384
|
+
"owner": {
|
|
13385
|
+
"kind": "compound_list",
|
|
13386
|
+
"start": 9
|
|
13387
|
+
},
|
|
13388
|
+
"range": [15, 15],
|
|
13389
|
+
"fault": {
|
|
13390
|
+
"kind": "separator_gap",
|
|
13391
|
+
"range": [15, 15]
|
|
13392
|
+
},
|
|
13393
|
+
"boundary": {
|
|
13394
|
+
"kind": "recovery_resume",
|
|
13395
|
+
"range": [15, 15]
|
|
13396
|
+
},
|
|
13397
|
+
"fragments": []
|
|
13398
|
+
}
|
|
13399
|
+
]
|
|
13400
|
+
},
|
|
13401
|
+
{
|
|
13402
|
+
"name": "an earlier expansion cannot repair a fixed missing ternary colon",
|
|
13403
|
+
"source": "echo $(( ($x?2) + $y ))",
|
|
13404
|
+
"expected": [
|
|
13405
|
+
{
|
|
13406
|
+
"owner": {
|
|
13407
|
+
"kind": "compound_list",
|
|
13408
|
+
"start": 9
|
|
13409
|
+
},
|
|
13410
|
+
"range": [16, 16],
|
|
13411
|
+
"fault": {
|
|
13412
|
+
"kind": "separator_gap",
|
|
13413
|
+
"range": [16, 16]
|
|
13414
|
+
},
|
|
13415
|
+
"boundary": {
|
|
13416
|
+
"kind": "recovery_resume",
|
|
13417
|
+
"range": [16, 16]
|
|
13418
|
+
},
|
|
13419
|
+
"fragments": []
|
|
13420
|
+
}
|
|
13421
|
+
]
|
|
13422
|
+
},
|
|
13423
|
+
{
|
|
13424
|
+
"name": "an expansion after a question can supply the missing ternary branch",
|
|
13425
|
+
"source": "echo $(( (1 ? $x) + 2",
|
|
13426
|
+
"expected": [
|
|
13427
|
+
{
|
|
13428
|
+
"owner": {
|
|
13429
|
+
"kind": "arithmetic_expansion",
|
|
13430
|
+
"start": 5
|
|
13431
|
+
},
|
|
13432
|
+
"range": [21, 21],
|
|
13433
|
+
"fault": {
|
|
13434
|
+
"kind": "arithmetic_ending_gap",
|
|
13435
|
+
"range": [21, 21]
|
|
13436
|
+
},
|
|
13437
|
+
"boundary": {
|
|
13438
|
+
"kind": "recovery_eof",
|
|
13439
|
+
"range": [21, 21]
|
|
13440
|
+
},
|
|
13441
|
+
"fragments": []
|
|
13442
|
+
}
|
|
13443
|
+
]
|
|
13444
|
+
},
|
|
13445
|
+
{
|
|
13446
|
+
"name": "an expansion before a colon can supply its question and operand",
|
|
13447
|
+
"source": "echo $(( ($x : 2) + 1",
|
|
13448
|
+
"expected": [
|
|
13449
|
+
{
|
|
13450
|
+
"owner": {
|
|
13451
|
+
"kind": "arithmetic_expansion",
|
|
13452
|
+
"start": 5
|
|
13453
|
+
},
|
|
13454
|
+
"range": [21, 21],
|
|
13455
|
+
"fault": {
|
|
13456
|
+
"kind": "arithmetic_ending_gap",
|
|
13457
|
+
"range": [21, 21]
|
|
13458
|
+
},
|
|
13459
|
+
"boundary": {
|
|
13460
|
+
"kind": "recovery_eof",
|
|
13461
|
+
"range": [21, 21]
|
|
13462
|
+
},
|
|
13463
|
+
"fragments": []
|
|
13464
|
+
}
|
|
13465
|
+
]
|
|
13466
|
+
},
|
|
13467
|
+
{
|
|
13468
|
+
"name": "an expansion can complete the context around a fixed parenthesized operand",
|
|
13469
|
+
"source": "echo $(( ($x (2)) + 1",
|
|
13470
|
+
"expected": [
|
|
13471
|
+
{
|
|
13472
|
+
"owner": {
|
|
13473
|
+
"kind": "arithmetic_expansion",
|
|
13474
|
+
"start": 5
|
|
13475
|
+
},
|
|
13476
|
+
"range": [21, 21],
|
|
13477
|
+
"fault": {
|
|
13478
|
+
"kind": "arithmetic_ending_gap",
|
|
13479
|
+
"range": [21, 21]
|
|
13480
|
+
},
|
|
13481
|
+
"boundary": {
|
|
13482
|
+
"kind": "recovery_eof",
|
|
13483
|
+
"range": [21, 21]
|
|
13484
|
+
},
|
|
13485
|
+
"fragments": []
|
|
13486
|
+
}
|
|
13487
|
+
]
|
|
13488
|
+
},
|
|
13489
|
+
{
|
|
13490
|
+
"name": "literal arithmetic preserves parenthesized lvalues and assignment in the true branch",
|
|
13491
|
+
"source": "echo $(( ((a) = b ? c = d : e) + 1 ))",
|
|
13492
|
+
"expected": []
|
|
12764
13493
|
}
|
|
12765
13494
|
]
|