@@ -4,6 +4,7 @@ import dvec::extensions;
4
4
export parse_sess;
5
5
export next_node_id;
6
6
export new_parser_from_file;
7
+ export new_parser_etc_from_file;
7
8
export new_parser_from_source_str;
8
9
export parse_crate_from_file;
9
10
export parse_crate_from_crate_file;
@@ -17,7 +18,7 @@ import attr::parser_attr;
17
18
import common:: parser_common;
18
19
import ast:: node_id;
19
20
import util:: interner;
20
- import lexer:: reader;
21
+ import lexer:: { string_reader_as_reader , reader, string_reader } ;
21
22
22
23
type parse_sess = @{
23
24
cm : codemap:: codemap ,
@@ -42,14 +43,15 @@ fn parse_crate_from_file(input: str, cfg: ast::crate_cfg, sess: parse_sess) ->
42
43
43
44
fn parse_crate_from_crate_file ( input : str , cfg : ast:: crate_cfg ,
44
45
sess : parse_sess ) -> @ast:: crate {
45
- let p = new_parser_from_file ( sess, cfg, input, parser:: CRATE_FILE ) ;
46
+ let ( p, rdr) = new_parser_etc_from_file ( sess, cfg, input,
47
+ parser:: CRATE_FILE ) ;
46
48
let lo = p. span . lo ;
47
- let prefix = path:: dirname ( p . reader . filemap . name ) ;
49
+ let prefix = path:: dirname ( input ) ;
48
50
let leading_attrs = p. parse_inner_attrs_and_next ( ) ;
49
51
let { inner: crate_attrs , next: first_cdir_attr } = leading_attrs;
50
52
let cdirs = p. parse_crate_directives ( token:: EOF , first_cdir_attr) ;
51
- sess. chpos = p . reader . chpos ;
52
- sess. byte_pos = sess. byte_pos + p . reader . pos ;
53
+ sess. chpos = rdr . chpos ;
54
+ sess. byte_pos = sess. byte_pos + rdr . pos ;
53
55
let cx = @{ sess: sess, cfg: /* FIXME: bad */ copy p. cfg } ;
54
56
let ( companionmod, _) = path:: splitext ( path:: basename ( input) ) ;
55
57
let ( m, attrs) = eval:: eval_crate_directives_to_mod (
@@ -65,41 +67,42 @@ fn parse_crate_from_crate_file(input: str, cfg: ast::crate_cfg,
65
67
66
68
fn parse_crate_from_source_file ( input : str , cfg : ast:: crate_cfg ,
67
69
sess : parse_sess ) -> @ast:: crate {
68
- let p = new_parser_from_file ( sess, cfg, input, parser:: SOURCE_FILE ) ;
70
+ let ( p, rdr) = new_parser_etc_from_file ( sess, cfg, input,
71
+ parser:: SOURCE_FILE ) ;
69
72
let r = p. parse_crate_mod ( cfg) ;
70
- sess. chpos = p . reader . chpos ;
71
- sess. byte_pos = sess. byte_pos + p . reader . pos ;
73
+ sess. chpos = rdr . chpos ;
74
+ sess. byte_pos = sess. byte_pos + rdr . pos ;
72
75
ret r;
73
76
}
74
77
75
78
fn parse_crate_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
76
79
sess : parse_sess ) -> @ast:: crate {
77
- let p = new_parser_from_source_str (
78
- sess , cfg , name , codemap:: fss_none, source) ;
80
+ let ( p , rdr ) = new_parser_etc_from_source_str ( sess , cfg , name ,
81
+ codemap:: fss_none, source) ;
79
82
let r = p. parse_crate_mod ( cfg) ;
80
- sess. chpos = p . reader . chpos ;
81
- sess. byte_pos = sess. byte_pos + p . reader . pos ;
83
+ sess. chpos = rdr . chpos ;
84
+ sess. byte_pos = sess. byte_pos + rdr . pos ;
82
85
ret r;
83
86
}
84
87
85
88
fn parse_expr_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
86
89
sess : parse_sess ) -> @ast:: expr {
87
- let p = new_parser_from_source_str (
88
- sess , cfg , name , codemap:: fss_none, source) ;
90
+ let ( p , rdr ) = new_parser_etc_from_source_str ( sess , cfg , name ,
91
+ codemap:: fss_none, source) ;
89
92
let r = p. parse_expr ( ) ;
90
- sess. chpos = p . reader . chpos ;
91
- sess. byte_pos = sess. byte_pos + p . reader . pos ;
93
+ sess. chpos = rdr . chpos ;
94
+ sess. byte_pos = sess. byte_pos + rdr . pos ;
92
95
ret r;
93
96
}
94
97
95
98
fn parse_item_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
96
99
+attrs : [ ast:: attribute ] , vis : ast:: visibility ,
97
100
sess : parse_sess ) -> option < @ast:: item > {
98
- let p = new_parser_from_source_str (
99
- sess , cfg , name , codemap:: fss_none, source) ;
101
+ let ( p , rdr ) = new_parser_etc_from_source_str ( sess , cfg , name ,
102
+ codemap:: fss_none, source) ;
100
103
let r = p. parse_item ( attrs, vis) ;
101
- sess. chpos = p . reader . chpos ;
102
- sess. byte_pos = sess. byte_pos + p . reader . pos ;
104
+ sess. chpos = rdr . chpos ;
105
+ sess. byte_pos = sess. byte_pos + rdr . pos ;
103
106
ret r;
104
107
}
105
108
@@ -109,13 +112,14 @@ fn parse_from_source_str<T>(f: fn (p: parser) -> T,
109
112
sess : parse_sess )
110
113
-> T
111
114
{
112
- let p = new_parser_from_source_str ( sess, cfg, name, ss, source) ;
115
+ let ( p, rdr) = new_parser_etc_from_source_str ( sess, cfg, name, ss,
116
+ source) ;
113
117
let r = f ( p) ;
114
118
if !p. reader . is_eof ( ) {
115
119
p. reader . fatal ( "expected end-of-string" ) ;
116
120
}
117
- sess. chpos = p . reader . chpos ;
118
- sess. byte_pos = sess. byte_pos + p . reader . pos ;
121
+ sess. chpos = rdr . chpos ;
122
+ sess. byte_pos = sess. byte_pos + rdr . pos ;
119
123
ret r;
120
124
}
121
125
@@ -127,9 +131,9 @@ fn next_node_id(sess: parse_sess) -> node_id {
127
131
ret rv;
128
132
}
129
133
130
- fn new_parser_from_source_str ( sess : parse_sess , cfg : ast:: crate_cfg ,
131
- +name : str , +ss : codemap:: file_substr ,
132
- source : @str ) -> parser {
134
+ fn new_parser_etc_from_source_str ( sess : parse_sess , cfg : ast:: crate_cfg ,
135
+ +name : str , +ss : codemap:: file_substr ,
136
+ source : @str ) -> ( parser , string_reader ) {
133
137
let ftype = parser:: SOURCE_FILE ;
134
138
let filemap = codemap:: new_filemap_w_substr
135
139
( name, ss, source, sess. chpos , sess. byte_pos ) ;
@@ -138,14 +142,21 @@ fn new_parser_from_source_str(sess: parse_sess, cfg: ast::crate_cfg,
138
142
{ |x|str:: hash ( * x) } ,
139
143
{ |x, y|str:: eq ( * x, * y) }
140
144
) ;
141
- let rdr = lexer:: new_reader ( sess. span_diagnostic ,
142
- filemap, itr) ;
143
- ret parser( sess, cfg, rdr, ftype) ;
145
+ let srdr = lexer:: new_string_reader ( sess. span_diagnostic , filemap, itr) ;
146
+ ret ( parser ( sess, cfg, srdr as reader , ftype) , srdr) ;
144
147
}
145
148
146
- fn new_parser_from_file( sess : parse_sess , cfg : ast:: crate_cfg , +path : str ,
147
- ftype : parser:: file_type ) ->
148
- parser {
149
+ fn new_parser_from_source_str ( sess : parse_sess , cfg : ast:: crate_cfg ,
150
+ +name : str , +ss : codemap:: file_substr ,
151
+ source : @str ) -> parser {
152
+ let ( p, _) = new_parser_etc_from_source_str ( sess, cfg, name, ss, source) ;
153
+ ret p;
154
+ }
155
+
156
+
157
+ fn new_parser_etc_from_file( sess : parse_sess , cfg : ast:: crate_cfg , +path : str ,
158
+ ftype : parser:: file_type ) ->
159
+ ( parser , string_reader ) {
149
160
let res = io:: read_whole_file_str ( path) ;
150
161
alt res {
151
162
result: : ok ( _) { /* Continue. */ }
@@ -158,6 +169,12 @@ fn new_parser_from_file(sess: parse_sess, cfg: ast::crate_cfg, +path: str,
158
169
{ |x|str:: hash ( * x) } ,
159
170
{ |x, y|str:: eq ( * x, * y) }
160
171
) ;
161
- let rdr = lexer:: new_reader ( sess. span_diagnostic , filemap, itr) ;
162
- ret parser( sess, cfg, rdr, ftype) ;
172
+ let srdr = lexer:: new_string_reader ( sess. span_diagnostic , filemap, itr) ;
173
+ ret ( parser ( sess, cfg, srdr as reader , ftype) , srdr) ;
174
+ }
175
+
176
+ fn new_parser_from_file ( sess : parse_sess , cfg : ast:: crate_cfg , +path : str ,
177
+ ftype : parser:: file_type ) -> parser {
178
+ let ( p, _) = new_parser_etc_from_file ( sess, cfg, path, ftype) ;
179
+ ret p;
163
180
}
0 commit comments