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
@@ -2047,13 +2053,15 @@ def initialize(
2047
2053
@comments = comments
2048
2054
end
2049
2055
2050
- def bind ( start_char , end_char )
2056
+ def bind ( start_char , start_column , end_char , end_column )
2051
2057
@location =
2052
2058
Location . new (
2053
2059
start_line : location . start_line ,
2054
2060
start_char : start_char ,
2061
+ start_column : start_column ,
2055
2062
end_line : location . end_line ,
2056
- end_char : end_char
2063
+ end_char : end_char ,
2064
+ end_column : end_column
2057
2065
)
2058
2066
2059
2067
parts = [ rescue_clause , else_clause , ensure_clause ]
@@ -2062,14 +2070,17 @@ def bind(start_char, end_char)
2062
2070
consequent = parts . compact . first
2063
2071
statements . bind (
2064
2072
start_char ,
2065
- consequent ? consequent . location . start_char : end_char
2073
+ start_column ,
2074
+ consequent ? consequent . location . start_char : end_char ,
2075
+ consequent ? consequent . location . start_column : end_column
2066
2076
)
2067
2077
2068
2078
# Next we're going to determine the rescue clause if there is one
2069
2079
if rescue_clause
2070
2080
consequent = parts . drop ( 1 ) . compact . first
2071
2081
rescue_clause . bind_end (
2072
- consequent ? consequent . location . start_char : end_char
2082
+ consequent ? consequent . location . start_char : end_char ,
2083
+ consequent ? consequent . location . start_column : end_column
2073
2084
)
2074
2085
end
2075
2086
end
@@ -8413,20 +8424,22 @@ def initialize(
8413
8424
@comments = comments
8414
8425
end
8415
8426
8416
- def bind_end ( end_char )
8427
+ def bind_end ( end_char , end_column )
8417
8428
@location =
8418
8429
Location . new (
8419
8430
start_line : location . start_line ,
8420
8431
start_char : location . start_char ,
8432
+ start_column : location . start_column ,
8421
8433
end_line : location . end_line ,
8422
- end_char : end_char
8434
+ end_char : end_char ,
8435
+ end_column : end_column
8423
8436
)
8424
8437
8425
8438
if consequent
8426
- consequent . bind_end ( end_char )
8427
- statements . bind_end ( consequent . location . start_char )
8439
+ consequent . bind_end ( end_char , end_column )
8440
+ statements . bind_end ( consequent . location . start_char , consequent . location . start_column )
8428
8441
else
8429
- statements . bind_end ( end_char )
8442
+ statements . bind_end ( end_char , end_column )
8430
8443
end
8431
8444
end
8432
8445
@@ -8885,13 +8898,15 @@ def initialize(parser, body:, location:, comments: [])
8885
8898
@comments = comments
8886
8899
end
8887
8900
8888
- def bind ( start_char , end_char )
8901
+ def bind ( start_char , start_column , end_char , end_column )
8889
8902
@location =
8890
8903
Location . new (
8891
8904
start_line : location . start_line ,
8892
8905
start_char : start_char ,
8906
+ start_column : start_column ,
8893
8907
end_line : location . end_line ,
8894
- end_char : end_char
8908
+ end_char : end_char ,
8909
+ end_column : end_column
8895
8910
)
8896
8911
8897
8912
if body [ 0 ] . is_a? ( VoidStmt )
@@ -8900,8 +8915,10 @@ def bind(start_char, end_char)
8900
8915
Location . new (
8901
8916
start_line : location . start_line ,
8902
8917
start_char : start_char ,
8918
+ start_column : start_column ,
8903
8919
end_line : location . end_line ,
8904
- end_char : start_char
8920
+ end_char : start_char ,
8921
+ end_column : end_column
8905
8922
)
8906
8923
8907
8924
body [ 0 ] = VoidStmt . new ( location : location )
@@ -8910,13 +8927,15 @@ def bind(start_char, end_char)
8910
8927
attach_comments ( start_char , end_char )
8911
8928
end
8912
8929
8913
- def bind_end ( end_char )
8930
+ def bind_end ( end_char , end_column )
8914
8931
@location =
8915
8932
Location . new (
8916
8933
start_line : location . start_line ,
8917
8934
start_char : location . start_char ,
8935
+ start_column : location . start_column ,
8918
8936
end_line : location . end_line ,
8919
- end_char : end_char
8937
+ end_char : end_char ,
8938
+ end_column : end_column
8920
8939
)
8921
8940
end
8922
8941
0 commit comments