@@ -29,7 +29,7 @@ pub struct WithLineNumber<T> {
29
29
pub data : T ,
30
30
}
31
31
32
- impl Span for WithLineNumber < & str > {
32
+ impl Span for & str {
33
33
/// Byte index range into this string.
34
34
type Subspan = Range < usize > ;
35
35
/// Byte index into this string.
@@ -40,63 +40,111 @@ impl Span for WithLineNumber<&str> {
40
40
}
41
41
42
42
fn end ( & self ) -> Self :: Pos {
43
- self . data . len ( )
43
+ self . len ( )
44
44
}
45
45
46
46
fn slice ( & self , range : Range < Self :: Pos > ) -> Range < usize > {
47
47
range
48
48
}
49
49
}
50
50
51
- impl SpanFormatter < WithLineNumber < & str > > for ( ) {
52
- fn first_line ( & self , span : & WithLineNumber < & str > ) -> WithLineNumber < Range < usize > > {
51
+ impl SpanFormatter < & str > for ( ) {
52
+ fn first_line ( & self , span : & & str ) -> WithLineNumber < Range < usize > > {
53
53
let start = 0 ;
54
54
let end = span
55
- . data
56
55
. as_bytes ( )
57
56
. iter ( )
58
57
. enumerate ( )
59
58
. find ( |( _, & b) | b == b'\n' )
60
- . map_or_else ( || span. data . len ( ) , |( i, _) | i) ;
59
+ . map_or_else ( || span. len ( ) , |( i, _) | i) ;
61
60
WithLineNumber {
62
61
data : start..end,
63
- line_num : span . line_num ,
62
+ line_num : 1 ,
64
63
}
65
64
}
66
65
67
66
fn next_line (
68
67
& self ,
69
- span : & WithLineNumber < & str > ,
68
+ span : & & str ,
70
69
subspan : & WithLineNumber < Range < usize > > ,
71
70
) -> Option < WithLineNumber < Range < usize > > > {
72
71
let start = subspan. data . end + 1 ;
73
72
let end = span
74
- . data
75
73
. get ( start..) ?
76
74
. as_bytes ( )
77
75
. iter ( )
78
76
. enumerate ( )
79
77
. find ( |( _, & b) | b == b'\n' )
80
- . map_or_else ( || span. data . len ( ) , |( i, _) | i + start) ;
78
+ . map_or_else ( || span. len ( ) , |( i, _) | i + start) ;
81
79
Some ( WithLineNumber {
82
80
data : start..end,
83
81
line_num : subspan. line_num + 1 ,
84
82
} )
85
83
}
86
84
87
- fn count_columns ( & self , span : & WithLineNumber < & str > , subspan : & Range < usize > ) -> usize {
88
- span. data [ subspan. start ..subspan. end ] . chars ( ) . count ( )
85
+ fn count_columns ( & self , span : & & str , subspan : & Range < usize > ) -> usize {
86
+ span[ subspan. start ..subspan. end ] . chars ( ) . count ( )
89
87
}
90
88
}
91
89
92
- impl SpanWriter < WithLineNumber < & str > > for ( ) {
90
+ impl SpanWriter < & str > for ( ) {
93
91
fn write (
94
92
& self ,
95
93
w : & mut dyn io:: Write ,
96
- span : & WithLineNumber < & str > ,
94
+ span : & & str ,
97
95
subspan : & Range < usize > ,
98
96
) -> io:: Result < ( ) > {
99
- w. write_all ( span. data [ subspan. start ..subspan. end ] . as_bytes ( ) )
97
+ w. write_all ( span[ subspan. start ..subspan. end ] . as_bytes ( ) )
98
+ }
99
+ }
100
+
101
+ impl < S : Span > Span for WithLineNumber < S > {
102
+ type Subspan = S :: Subspan ;
103
+ type Pos = S :: Pos ;
104
+
105
+ fn start ( & self ) -> S :: Pos {
106
+ self . data . start ( )
107
+ }
108
+
109
+ fn end ( & self ) -> S :: Pos {
110
+ self . data . end ( )
111
+ }
112
+
113
+ fn slice ( & self , range : Range < S :: Pos > ) -> S :: Subspan {
114
+ self . data . slice ( range)
115
+ }
116
+ }
117
+
118
+ impl < S : Span , SF : SpanFormatter < S > > SpanFormatter < WithLineNumber < S > > for SF {
119
+ fn first_line ( & self , span : & WithLineNumber < S > ) -> WithLineNumber < S :: Subspan > {
120
+ let wln = self . first_line ( & span. data ) ;
121
+ WithLineNumber {
122
+ data : wln. data ,
123
+ line_num : wln. line_num + span. line_num - 1 ,
124
+ }
125
+ }
126
+
127
+ fn next_line (
128
+ & self ,
129
+ span : & WithLineNumber < S > ,
130
+ subspan : & WithLineNumber < S :: Subspan > ,
131
+ ) -> Option < WithLineNumber < S :: Subspan > > {
132
+ self . next_line ( & span. data , subspan)
133
+ }
134
+
135
+ fn count_columns ( & self , span : & WithLineNumber < S > , subspan : & S :: Subspan ) -> usize {
136
+ self . count_columns ( & span. data , subspan)
137
+ }
138
+ }
139
+
140
+ impl < S : Span , SW : SpanWriter < S > > SpanWriter < WithLineNumber < S > > for SW {
141
+ fn write (
142
+ & self ,
143
+ w : & mut dyn io:: Write ,
144
+ span : & WithLineNumber < S > ,
145
+ subspan : & S :: Subspan ,
146
+ ) -> io:: Result < ( ) > {
147
+ self . write ( w, & span. data , subspan)
100
148
}
101
149
}
102
150
0 commit comments