@@ -10,6 +10,7 @@ use crate::quote;
10
10
11
11
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
12
12
pub enum BuiltinExpander {
13
+ Column ,
13
14
File ,
14
15
Line ,
15
16
Stringify ,
@@ -23,6 +24,7 @@ impl BuiltinExpander {
23
24
tt : & tt:: Subtree ,
24
25
) -> Result < tt:: Subtree , mbe:: ExpandError > {
25
26
match self {
27
+ BuiltinExpander :: Column => column_expand ( db, id, tt) ,
26
28
BuiltinExpander :: File => file_expand ( db, id, tt) ,
27
29
BuiltinExpander :: Line => line_expand ( db, id, tt) ,
28
30
BuiltinExpander :: Stringify => stringify_expand ( db, id, tt) ,
@@ -36,7 +38,9 @@ pub fn find_builtin_macro(
36
38
ast_id : AstId < ast:: MacroCall > ,
37
39
) -> Option < MacroDefId > {
38
40
// FIXME: Better registering method
39
- if ident == & name:: FILE_MACRO {
41
+ if ident == & name:: COLUMN_MACRO {
42
+ Some ( MacroDefId { krate, ast_id, kind : MacroDefKind :: BuiltIn ( BuiltinExpander :: Column ) } )
43
+ } else if ident == & name:: FILE_MACRO {
40
44
Some ( MacroDefId { krate, ast_id, kind : MacroDefKind :: BuiltIn ( BuiltinExpander :: File ) } )
41
45
} else if ident == & name:: LINE_MACRO {
42
46
Some ( MacroDefId { krate, ast_id, kind : MacroDefKind :: BuiltIn ( BuiltinExpander :: Line ) } )
@@ -110,13 +114,51 @@ fn stringify_expand(
110
114
Ok ( expanded)
111
115
}
112
116
117
+ fn to_col_number ( db : & dyn AstDatabase , file : HirFileId , pos : TextUnit ) -> usize {
118
+ // FIXME: Use expansion info
119
+ let file_id = file. original_file ( db) ;
120
+ let text = db. file_text ( file_id) ;
121
+ let mut col_num = 1 ;
122
+
123
+ for c in text[ ..pos. to_usize ( ) ] . chars ( ) . rev ( ) {
124
+ if c == '\n' {
125
+ break ;
126
+ }
127
+ col_num = col_num + 1 ;
128
+ }
129
+
130
+ col_num
131
+ }
132
+
133
+ fn column_expand (
134
+ db : & dyn AstDatabase ,
135
+ id : MacroCallId ,
136
+ _tt : & tt:: Subtree ,
137
+ ) -> Result < tt:: Subtree , mbe:: ExpandError > {
138
+ let loc = db. lookup_intern_macro ( id) ;
139
+ let macro_call = loc. ast_id . to_node ( db) ;
140
+
141
+ let _arg = macro_call. token_tree ( ) . ok_or_else ( || mbe:: ExpandError :: UnexpectedToken ) ?;
142
+ let col_start = macro_call. syntax ( ) . text_range ( ) . start ( ) ;
143
+
144
+ let file = id. as_file ( MacroFileKind :: Expr ) ;
145
+ let col_num = to_col_number ( db, file, col_start) ;
146
+
147
+ let expanded = quote ! {
148
+ #col_num
149
+ } ;
150
+
151
+ Ok ( expanded)
152
+ }
153
+
113
154
fn file_expand (
114
155
db : & dyn AstDatabase ,
115
156
id : MacroCallId ,
116
157
_tt : & tt:: Subtree ,
117
158
) -> Result < tt:: Subtree , mbe:: ExpandError > {
118
159
let loc = db. lookup_intern_macro ( id) ;
119
160
let macro_call = loc. ast_id . to_node ( db) ;
161
+
120
162
let _ = macro_call. token_tree ( ) . ok_or_else ( || mbe:: ExpandError :: UnexpectedToken ) ?;
121
163
122
164
// FIXME: RA purposefully lacks knowledge of absolute file names
0 commit comments