Skip to content

Commit c789e7a

Browse files
committed
lowering: extract lower_expr_range
1 parent 1194992 commit c789e7a

File tree

1 file changed

+44
-39
lines changed

1 file changed

+44
-39
lines changed

src/librustc/hir/lowering/expr.rs

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -376,45 +376,7 @@ impl LoweringContext<'_> {
376376
)
377377
}
378378
ExprKind::Range(ref e1, ref e2, lims) => {
379-
use syntax::ast::RangeLimits::*;
380-
381-
let path = match (e1, e2, lims) {
382-
(&None, &None, HalfOpen) => sym::RangeFull,
383-
(&Some(..), &None, HalfOpen) => sym::RangeFrom,
384-
(&None, &Some(..), HalfOpen) => sym::RangeTo,
385-
(&Some(..), &Some(..), HalfOpen) => sym::Range,
386-
(&None, &Some(..), Closed) => sym::RangeToInclusive,
387-
(&Some(..), &Some(..), Closed) => unreachable!(),
388-
(_, &None, Closed) => self.diagnostic()
389-
.span_fatal(e.span, "inclusive range with no end")
390-
.raise(),
391-
};
392-
393-
let fields = e1.iter()
394-
.map(|e| ("start", e))
395-
.chain(e2.iter().map(|e| ("end", e)))
396-
.map(|(s, e)| {
397-
let expr = P(self.lower_expr(&e));
398-
let ident = Ident::new(Symbol::intern(s), e.span);
399-
self.field(ident, expr, e.span)
400-
})
401-
.collect::<P<[hir::Field]>>();
402-
403-
let is_unit = fields.is_empty();
404-
let struct_path = [sym::ops, path];
405-
let struct_path = self.std_path(e.span, &struct_path, None, is_unit);
406-
let struct_path = hir::QPath::Resolved(None, P(struct_path));
407-
408-
return hir::Expr {
409-
hir_id: self.lower_node_id(e.id),
410-
node: if is_unit {
411-
hir::ExprKind::Path(struct_path)
412-
} else {
413-
hir::ExprKind::Struct(P(struct_path), fields, None)
414-
},
415-
span: e.span,
416-
attrs: e.attrs.clone(),
417-
};
379+
self.lower_expr_range(e.span, e1.as_deref(), e2.as_deref(), lims)
418380
}
419381
ExprKind::Path(ref qself, ref path) => {
420382
let qpath = self.lower_qpath(
@@ -497,6 +459,49 @@ impl LoweringContext<'_> {
497459
}
498460
}
499461

462+
fn lower_expr_range(
463+
&mut self,
464+
span: Span,
465+
e1: Option<&Expr>,
466+
e2: Option<&Expr>,
467+
lims: RangeLimits,
468+
) -> hir::ExprKind {
469+
use syntax::ast::RangeLimits::*;
470+
471+
let path = match (e1, e2, lims) {
472+
(None, None, HalfOpen) => sym::RangeFull,
473+
(Some(..), None, HalfOpen) => sym::RangeFrom,
474+
(None, Some(..), HalfOpen) => sym::RangeTo,
475+
(Some(..), Some(..), HalfOpen) => sym::Range,
476+
(None, Some(..), Closed) => sym::RangeToInclusive,
477+
(Some(..), Some(..), Closed) => unreachable!(),
478+
(_, None, Closed) => self.diagnostic()
479+
.span_fatal(span, "inclusive range with no end")
480+
.raise(),
481+
};
482+
483+
let fields = e1.iter()
484+
.map(|e| ("start", e))
485+
.chain(e2.iter().map(|e| ("end", e)))
486+
.map(|(s, e)| {
487+
let expr = P(self.lower_expr(&e));
488+
let ident = Ident::new(Symbol::intern(s), e.span);
489+
self.field(ident, expr, e.span)
490+
})
491+
.collect::<P<[hir::Field]>>();
492+
493+
let is_unit = fields.is_empty();
494+
let struct_path = [sym::ops, path];
495+
let struct_path = self.std_path(span, &struct_path, None, is_unit);
496+
let struct_path = hir::QPath::Resolved(None, P(struct_path));
497+
498+
if is_unit {
499+
hir::ExprKind::Path(struct_path)
500+
} else {
501+
hir::ExprKind::Struct(P(struct_path), fields, None)
502+
}
503+
}
504+
500505
fn lower_expr_asm(&mut self, asm: &InlineAsm) -> hir::ExprKind {
501506
let hir_asm = hir::InlineAsm {
502507
inputs: asm.inputs.iter().map(|&(ref c, _)| c.clone()).collect(),

0 commit comments

Comments
 (0)