Skip to content

Commit 3b7c25c

Browse files
committed
syntax: add some more extension helper methods
1 parent 87c78fd commit 3b7c25c

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

src/libsyntax/ext/build.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ pub trait AstBuilder {
170170
subpats: Vec<Gc<ast::Pat>>) -> Gc<ast::Pat>;
171171
fn pat_struct(&self, span: Span,
172172
path: ast::Path, field_pats: Vec<ast::FieldPat> ) -> Gc<ast::Pat>;
173+
fn pat_tuple(&self, span: Span, pats: Vec<Gc<ast::Pat>>) -> Gc<ast::Pat>;
174+
175+
fn pat_some(&self, span: Span, pat: Gc<ast::Pat>) -> Gc<ast::Pat>;
176+
fn pat_none(&self, span: Span) -> Gc<ast::Pat>;
177+
178+
fn pat_ok(&self, span: Span, pat: Gc<ast::Pat>) -> Gc<ast::Pat>;
179+
fn pat_err(&self, span: Span, pat: Gc<ast::Pat>) -> Gc<ast::Pat>;
173180

174181
fn arm(&self, span: Span, pats: Vec<Gc<ast::Pat>> , expr: Gc<ast::Expr>) -> ast::Arm;
175182
fn arm_unreachable(&self, span: Span) -> ast::Arm;
@@ -178,6 +185,7 @@ pub trait AstBuilder {
178185
fn expr_if(&self, span: Span,
179186
cond: Gc<ast::Expr>, then: Gc<ast::Expr>,
180187
els: Option<Gc<ast::Expr>>) -> Gc<ast::Expr>;
188+
fn expr_loop(&self, span: Span, block: P<ast::Block>) -> Gc<ast::Expr>;
181189

182190
fn lambda_fn_decl(&self, span: Span,
183191
fn_decl: P<ast::FnDecl>, blk: P<ast::Block>) -> Gc<ast::Expr>;
@@ -777,6 +785,46 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
777785
let pat = ast::PatStruct(path, field_pats, false);
778786
self.pat(span, pat)
779787
}
788+
fn pat_tuple(&self, span: Span, pats: Vec<Gc<ast::Pat>>) -> Gc<ast::Pat> {
789+
let pat = ast::PatTup(pats);
790+
self.pat(span, pat)
791+
}
792+
793+
fn pat_some(&self, span: Span, pat: Gc<ast::Pat>) -> Gc<ast::Pat> {
794+
let some = vec!(
795+
self.ident_of("std"),
796+
self.ident_of("option"),
797+
self.ident_of("Some"));
798+
let path = self.path_global(span, some);
799+
self.pat_enum(span, path, vec!(pat))
800+
}
801+
802+
fn pat_none(&self, span: Span) -> Gc<ast::Pat> {
803+
let some = vec!(
804+
self.ident_of("std"),
805+
self.ident_of("option"),
806+
self.ident_of("None"));
807+
let path = self.path_global(span, some);
808+
self.pat_enum(span, path, vec!())
809+
}
810+
811+
fn pat_ok(&self, span: Span, pat: Gc<ast::Pat>) -> Gc<ast::Pat> {
812+
let some = vec!(
813+
self.ident_of("std"),
814+
self.ident_of("result"),
815+
self.ident_of("Ok"));
816+
let path = self.path_global(span, some);
817+
self.pat_enum(span, path, vec!(pat))
818+
}
819+
820+
fn pat_err(&self, span: Span, pat: Gc<ast::Pat>) -> Gc<ast::Pat> {
821+
let some = vec!(
822+
self.ident_of("std"),
823+
self.ident_of("result"),
824+
self.ident_of("Err"));
825+
let path = self.path_global(span, some);
826+
self.pat_enum(span, path, vec!(pat))
827+
}
780828

781829
fn arm(&self, _span: Span, pats: Vec<Gc<ast::Pat>> , expr: Gc<ast::Expr>) -> ast::Arm {
782830
ast::Arm {
@@ -803,6 +851,10 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
803851
self.expr(span, ast::ExprIf(cond, self.block_expr(then), els))
804852
}
805853

854+
fn expr_loop(&self, span: Span, block: P<ast::Block>) -> Gc<ast::Expr> {
855+
self.expr(span, ast::ExprLoop(block, None))
856+
}
857+
806858
fn lambda_fn_decl(&self, span: Span,
807859
fn_decl: P<ast::FnDecl>, blk: P<ast::Block>) -> Gc<ast::Expr> {
808860
self.expr(span, ast::ExprFnBlock(fn_decl, blk))

0 commit comments

Comments
 (0)