3
3
module SyntaxTree
4
4
# Represents the location of a node in the tree from the source code.
5
5
class Location
6
- attr_reader :start_line , :start_char , :end_line , :end_char
6
+ attr_reader :start_line , :start_char , :start_column , : end_line, :end_char , :end_column
7
7
8
- def initialize ( start_line :, start_char :, end_line :, end_char :)
8
+ def initialize ( start_line :, start_char :, start_column : , end_line :, end_char : , end_column :)
9
9
@start_line = start_line
10
10
@start_char = start_char
11
+ @start_column = start_column
11
12
@end_line = end_line
12
13
@end_char = end_char
14
+ @end_column = end_column
13
15
end
14
16
15
17
def lines
@@ -26,22 +28,26 @@ def to(other)
26
28
Location . new (
27
29
start_line : start_line ,
28
30
start_char : start_char ,
31
+ start_column : start_column ,
29
32
end_line : [ end_line , other . end_line ] . max ,
30
- end_char : other . end_char
33
+ end_char : other . end_char ,
34
+ end_column : other . end_column
31
35
)
32
36
end
33
37
34
- def self . token ( line :, char :, size :)
38
+ def self . token ( line :, char :, column : , size :)
35
39
new (
36
40
start_line : line ,
37
41
start_char : char ,
42
+ start_column : column ,
38
43
end_line : line ,
39
- end_char : char + size
44
+ end_char : char + size ,
45
+ end_column : column + size
40
46
)
41
47
end
42
48
43
- def self . fixed ( line :, char :)
44
- new ( start_line : line , start_char : char , end_line : line , end_char : char )
49
+ def self . fixed ( line :, char :, column : )
50
+ new ( start_line : line , start_char : char , start_column : column , end_line : line , end_char : char , end_column : column )
45
51
end
46
52
end
47
53
@@ -1722,13 +1728,15 @@ def initialize(
1722
1728
@comments = comments
1723
1729
end
1724
1730
1725
- def bind ( start_char , end_char )
1731
+ def bind ( start_char , start_column , end_char , end_column )
1726
1732
@location =
1727
1733
Location . new (
1728
1734
start_line : location . start_line ,
1729
1735
start_char : start_char ,
1736
+ start_column : start_column ,
1730
1737
end_line : location . end_line ,
1731
- end_char : end_char
1738
+ end_char : end_char ,
1739
+ end_column : end_column
1732
1740
)
1733
1741
1734
1742
parts = [ rescue_clause , else_clause , ensure_clause ]
@@ -1737,14 +1745,17 @@ def bind(start_char, end_char)
1737
1745
consequent = parts . compact . first
1738
1746
statements . bind (
1739
1747
start_char ,
1740
- consequent ? consequent . location . start_char : end_char
1748
+ start_column ,
1749
+ consequent ? consequent . location . start_char : end_char ,
1750
+ consequent ? consequent . location . start_column : end_column
1741
1751
)
1742
1752
1743
1753
# Next we're going to determine the rescue clause if there is one
1744
1754
if rescue_clause
1745
1755
consequent = parts . drop ( 1 ) . compact . first
1746
1756
rescue_clause . bind_end (
1747
- consequent ? consequent . location . start_char : end_char
1757
+ consequent ? consequent . location . start_char : end_char ,
1758
+ consequent ? consequent . location . start_column : end_column
1748
1759
)
1749
1760
end
1750
1761
end
@@ -6898,20 +6909,22 @@ def initialize(
6898
6909
@comments = comments
6899
6910
end
6900
6911
6901
- def bind_end ( end_char )
6912
+ def bind_end ( end_char , end_column )
6902
6913
@location =
6903
6914
Location . new (
6904
6915
start_line : location . start_line ,
6905
6916
start_char : location . start_char ,
6917
+ start_column : location . start_column ,
6906
6918
end_line : location . end_line ,
6907
- end_char : end_char
6919
+ end_char : end_char ,
6920
+ end_column : end_column
6908
6921
)
6909
6922
6910
6923
if consequent
6911
- consequent . bind_end ( end_char )
6912
- statements . bind_end ( consequent . location . start_char )
6924
+ consequent . bind_end ( end_char , end_column )
6925
+ statements . bind_end ( consequent . location . start_char , consequent . location . start_column )
6913
6926
else
6914
- statements . bind_end ( end_char )
6927
+ statements . bind_end ( end_char , end_column )
6915
6928
end
6916
6929
end
6917
6930
@@ -7268,13 +7281,15 @@ def initialize(parser, body:, location:, comments: [])
7268
7281
@comments = comments
7269
7282
end
7270
7283
7271
- def bind ( start_char , end_char )
7284
+ def bind ( start_char , start_column , end_char , end_column )
7272
7285
@location =
7273
7286
Location . new (
7274
7287
start_line : location . start_line ,
7275
7288
start_char : start_char ,
7289
+ start_column : start_column ,
7276
7290
end_line : location . end_line ,
7277
- end_char : end_char
7291
+ end_char : end_char ,
7292
+ end_column : end_column
7278
7293
)
7279
7294
7280
7295
if body [ 0 ] . is_a? ( VoidStmt )
@@ -7283,8 +7298,10 @@ def bind(start_char, end_char)
7283
7298
Location . new (
7284
7299
start_line : location . start_line ,
7285
7300
start_char : start_char ,
7301
+ start_column : start_column ,
7286
7302
end_line : location . end_line ,
7287
- end_char : start_char
7303
+ end_char : start_char ,
7304
+ end_column : end_column
7288
7305
)
7289
7306
7290
7307
body [ 0 ] = VoidStmt . new ( location : location )
@@ -7293,13 +7310,15 @@ def bind(start_char, end_char)
7293
7310
attach_comments ( start_char , end_char )
7294
7311
end
7295
7312
7296
- def bind_end ( end_char )
7313
+ def bind_end ( end_char , end_column )
7297
7314
@location =
7298
7315
Location . new (
7299
7316
start_line : location . start_line ,
7300
7317
start_char : location . start_char ,
7318
+ start_column : location . start_column ,
7301
7319
end_line : location . end_line ,
7302
- end_char : end_char
7320
+ end_char : end_char ,
7321
+ end_column : end_column
7303
7322
)
7304
7323
end
7305
7324
0 commit comments