@@ -5,6 +5,8 @@ use std::cell::RefCell;
55use crate :: source:: { StringId , StringInterner } ;
66use crate :: surface:: { BinOp , FormatField , Item , Module , Pattern , Term } ;
77
8+ use super :: lexer:: is_keyword;
9+
810/// Term precedences
911#[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord ) ]
1012enum Prec {
@@ -42,6 +44,14 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
4244 }
4345 }
4446
47+ fn ident ( & ' arena self , name : StringId ) -> DocBuilder < ' arena , Self > {
48+ match self . interner . borrow ( ) . resolve ( name) {
49+ Some ( name) if is_keyword ( name) => self . text ( format ! ( "r#{name}" ) ) ,
50+ Some ( name) => self . text ( name. to_owned ( ) ) ,
51+ None => self . text ( "#error" ) ,
52+ }
53+ }
54+
4555 pub fn module < Range > ( & ' arena self , module : & Module < ' _ , Range > ) -> DocBuilder < ' arena , Self > {
4656 self . intersperse (
4757 module. items . iter ( ) . map ( |item| self . item ( item) ) ,
@@ -57,13 +67,13 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
5767 self . space ( ) ,
5868 match item. r#type {
5969 None => self . concat ( [
60- self . string_id ( item. label . 1 ) ,
70+ self . ident ( item. label . 1 ) ,
6171 self . ann_patterns ( item. patterns ) ,
6272 self . space ( ) ,
6373 ] ) ,
6474 Some ( r#type) => self . concat ( [
6575 self . concat ( [
66- self . string_id ( item. label . 1 ) ,
76+ self . ident ( item. label . 1 ) ,
6777 self . ann_patterns ( item. patterns ) ,
6878 self . space ( ) ,
6979 self . text ( ":" ) ,
@@ -87,7 +97,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
8797 fn pattern < Range > ( & ' arena self , pattern : & Pattern < Range > ) -> DocBuilder < ' arena , Self > {
8898 match pattern {
8999 Pattern :: Placeholder ( _) => self . text ( "_" ) ,
90- Pattern :: Name ( _, name) => self . string_id ( * name) ,
100+ Pattern :: Name ( _, name) => self . ident ( * name) ,
91101 Pattern :: StringLiteral ( _, number) => self . string_id ( * number) ,
92102 Pattern :: NumberLiteral ( _, number) => self . string_id ( * number) ,
93103 Pattern :: BooleanLiteral ( _, boolean) => match * boolean {
@@ -141,8 +151,8 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
141151 // FIXME: indentation and grouping
142152
143153 match term {
144- Term :: Name ( _, name) => self . string_id ( * name) ,
145- Term :: Hole ( _, name) => self . concat ( [ self . text ( "?" ) , self . string_id ( * name) ] ) ,
154+ Term :: Name ( _, name) => self . ident ( * name) ,
155+ Term :: Hole ( _, name) => self . concat ( [ self . text ( "?" ) , self . ident ( * name) ] ) ,
146156 Term :: Placeholder ( _) => self . text ( "_" ) ,
147157 Term :: Ann ( _, expr, r#type) => self . paren (
148158 prec > Prec :: Top ,
@@ -265,7 +275,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
265275 self . text ( "{" ) ,
266276 type_fields. iter ( ) . map ( |field| {
267277 self . concat ( [
268- self . string_id ( field. label . 1 ) ,
278+ self . ident ( field. label . 1 ) ,
269279 self . space ( ) ,
270280 self . text ( ":" ) ,
271281 self . space ( ) ,
@@ -280,7 +290,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
280290 self . text ( "{" ) ,
281291 expr_fields. iter ( ) . map ( |field| {
282292 self . concat ( [
283- self . string_id ( field. label . 1 ) ,
293+ self . ident ( field. label . 1 ) ,
284294 self . space ( ) ,
285295 self . text ( "=" ) ,
286296 self . space ( ) ,
@@ -306,7 +316,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
306316 Term :: Proj ( _, head_expr, labels) => self . concat ( [
307317 self . term_prec ( Prec :: Atomic , head_expr) ,
308318 self . concat (
309- ( labels. iter ( ) ) . map ( |( _, label) | self . text ( "." ) . append ( self . string_id ( * label) ) ) ,
319+ ( labels. iter ( ) ) . map ( |( _, label) | self . text ( "." ) . append ( self . ident ( * label) ) ) ,
310320 ) ,
311321 ] ) ,
312322 Term :: ArrayLiteral ( _, exprs) => self . sequence (
@@ -334,7 +344,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
334344 Term :: FormatCond ( _, ( _, label) , format, cond) => self . concat ( [
335345 self . text ( "{" ) ,
336346 self . space ( ) ,
337- self . string_id ( * label) ,
347+ self . ident ( * label) ,
338348 self . space ( ) ,
339349 self . text ( "<-" ) ,
340350 self . space ( ) ,
@@ -377,7 +387,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
377387 format,
378388 pred,
379389 } => self . concat ( [
380- self . string_id ( label. 1 ) ,
390+ self . ident ( label. 1 ) ,
381391 self . space ( ) ,
382392 self . text ( "<-" ) ,
383393 self . space ( ) ,
@@ -399,7 +409,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
399409 } => self . concat ( [
400410 self . text ( "let" ) ,
401411 self . space ( ) ,
402- self . string_id ( label. 1 ) ,
412+ self . ident ( label. 1 ) ,
403413 match r#type {
404414 Some ( r#type) => self . concat ( [
405415 self . space ( ) ,
0 commit comments