1752: Always wrap blocks into block expressions r=flodiebold a=matklad

This way, things like function bodies are expressions, and we don't have to single them out

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2019-09-02 19:20:24 +00:00 committed by GitHub
commit 7faec1c300
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
174 changed files with 9432 additions and 9105 deletions

View File

@ -274,7 +274,7 @@ impl AstBuilder<ast::Block> {
impl AstBuilder<ast::Expr> {
fn from_text(text: &str) -> ast::Expr {
ast_node_from_file_text(&format!("fn f() {{ {}; }}", text))
ast_node_from_file_text(&format!("const C: () = {};", text))
}
pub fn unit() -> ast::Expr {

View File

@ -3,7 +3,8 @@ use hir::db::HirDatabase;
use ra_syntax::{
ast::{self, AstNode},
SyntaxKind::{
BREAK_EXPR, COMMENT, LAMBDA_EXPR, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR, WHITESPACE,
BLOCK_EXPR, BREAK_EXPR, COMMENT, LAMBDA_EXPR, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR,
WHITESPACE,
},
SyntaxNode, TextUnit,
};
@ -80,10 +81,12 @@ pub(crate) fn introduce_variable(mut ctx: AssistCtx<impl HirDatabase>) -> Option
/// In general that's true for any expression, but in some cases that would produce invalid code.
fn valid_target_expr(node: SyntaxNode) -> Option<ast::Expr> {
match node.kind() {
PATH_EXPR => None,
PATH_EXPR | LOOP_EXPR => None,
BREAK_EXPR => ast::BreakExpr::cast(node).and_then(|e| e.expr()),
RETURN_EXPR => ast::ReturnExpr::cast(node).and_then(|e| e.expr()),
LOOP_EXPR => ast::ReturnExpr::cast(node).and_then(|e| e.expr()),
BLOCK_EXPR => {
ast::BlockExpr::cast(node).filter(|it| it.is_standalone()).map(ast::Expr::from)
}
_ => ast::Expr::cast(node),
}
}

View File

@ -65,9 +65,9 @@ pub(crate) fn move_arm_cond_to_match_guard(mut ctx: AssistCtx<impl HirDatabase>)
"move condition to match guard",
|edit| {
edit.target(if_expr.syntax().text_range());
let then_only_expr = then_block.statements().next().is_none();
let then_only_expr = then_block.block().and_then(|it| it.statements().next()).is_none();
match &then_block.expr() {
match &then_block.block().and_then(|it| it.expr()) {
Some(then_expr) if then_only_expr => {
edit.replace(if_expr.syntax().text_range(), then_expr.syntax().text())
}

View File

@ -1,3 +1,4 @@
use format_buf::format;
use hir::db::HirDatabase;
use ra_fmt::extract_trivial_expression;
use ra_syntax::{ast, AstNode};
@ -25,16 +26,21 @@ pub(crate) fn replace_if_let_with_match(mut ctx: AssistCtx<impl HirDatabase>) ->
ctx.build()
}
fn build_match_expr(expr: ast::Expr, pat1: ast::Pat, arm1: ast::Block, arm2: ast::Block) -> String {
fn build_match_expr(
expr: ast::Expr,
pat1: ast::Pat,
arm1: ast::BlockExpr,
arm2: ast::BlockExpr,
) -> String {
let mut buf = String::new();
buf.push_str(&format!("match {} {{\n", expr.syntax().text()));
buf.push_str(&format!(" {} => {}\n", pat1.syntax().text(), format_arm(&arm1)));
buf.push_str(&format!(" _ => {}\n", format_arm(&arm2)));
format!(buf, "match {} {{\n", expr.syntax().text());
format!(buf, " {} => {}\n", pat1.syntax().text(), format_arm(&arm1));
format!(buf, " _ => {}\n", format_arm(&arm2));
buf.push_str("}");
buf
}
fn format_arm(block: &ast::Block) -> String {
fn format_arm(block: &ast::BlockExpr) -> String {
match extract_trivial_expression(block) {
None => block.syntax().text().to_string(),
Some(e) => format!("{},", e.syntax().text()),

View File

@ -34,7 +34,8 @@ fn prev_tokens(token: SyntaxToken) -> impl Iterator<Item = SyntaxToken> {
successors(token.prev_token(), |token| token.prev_token())
}
pub fn extract_trivial_expression(block: &ast::Block) -> Option<ast::Expr> {
pub fn extract_trivial_expression(expr: &ast::BlockExpr) -> Option<ast::Expr> {
let block = expr.block()?;
let expr = block.expr()?;
if expr.syntax().text().contains_char('\n') {
return None;

View File

@ -119,10 +119,10 @@ where
expr_id: crate::expr::ExprId,
) -> Option<Source<ast::Expr>> {
let source_map = self.body_source_map(db);
let expr_syntax = source_map.expr_syntax(expr_id)?;
let expr_syntax = source_map.expr_syntax(expr_id)?.a()?;
let source = self.source(db);
let node = expr_syntax.to_node(&source.ast.syntax());
ast::Expr::cast(node).map(|ast| Source { file_id: source.file_id, ast })
let ast = expr_syntax.to_node(&source.ast.syntax());
Some(Source { file_id: source.file_id, ast })
}
}

View File

@ -9,7 +9,7 @@ use ra_syntax::{
self, ArgListOwner, ArrayExprKind, LiteralKind, LoopBodyOwner, NameOwner,
TypeAscriptionOwner,
},
AstNode, AstPtr, SyntaxNodePtr,
AstNode, AstPtr,
};
use test_utils::tested_by;
@ -56,13 +56,14 @@ pub struct Body {
/// file, so that we don't recompute types whenever some whitespace is typed.
#[derive(Default, Debug, Eq, PartialEq)]
pub struct BodySourceMap {
expr_map: FxHashMap<SyntaxNodePtr, ExprId>,
expr_map_back: ArenaMap<ExprId, SyntaxNodePtr>,
expr_map: FxHashMap<ExprPtr, ExprId>,
expr_map_back: ArenaMap<ExprId, ExprPtr>,
pat_map: FxHashMap<PatPtr, PatId>,
pat_map_back: ArenaMap<PatId, PatPtr>,
field_map: FxHashMap<(ExprId, usize), AstPtr<ast::RecordField>>,
}
type ExprPtr = Either<AstPtr<ast::Expr>, AstPtr<ast::RecordField>>;
type PatPtr = Either<AstPtr<ast::Pat>, AstPtr<ast::SelfParam>>;
impl Body {
@ -128,16 +129,12 @@ impl Index<PatId> for Body {
}
impl BodySourceMap {
pub(crate) fn expr_syntax(&self, expr: ExprId) -> Option<SyntaxNodePtr> {
pub(crate) fn expr_syntax(&self, expr: ExprId) -> Option<ExprPtr> {
self.expr_map_back.get(expr).cloned()
}
pub(crate) fn syntax_expr(&self, ptr: SyntaxNodePtr) -> Option<ExprId> {
self.expr_map.get(&ptr).cloned()
}
pub(crate) fn node_expr(&self, node: &ast::Expr) -> Option<ExprId> {
self.expr_map.get(&SyntaxNodePtr::new(node.syntax())).cloned()
self.expr_map.get(&Either::A(AstPtr::new(node))).cloned()
}
pub(crate) fn pat_syntax(&self, pat: PatId) -> Option<PatPtr> {
@ -575,11 +572,12 @@ where
current_file_id: file_id,
}
}
fn alloc_expr(&mut self, expr: Expr, syntax_ptr: SyntaxNodePtr) -> ExprId {
fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId {
let ptr = Either::A(ptr);
let id = self.exprs.alloc(expr);
if self.current_file_id == self.original_file_id {
self.source_map.expr_map.insert(syntax_ptr, id);
self.source_map.expr_map_back.insert(id, syntax_ptr);
self.source_map.expr_map.insert(ptr, id);
self.source_map.expr_map_back.insert(id, ptr);
}
id
}
@ -601,7 +599,7 @@ where
}
fn collect_expr(&mut self, expr: ast::Expr) -> ExprId {
let syntax_ptr = SyntaxNodePtr::new(expr.syntax());
let syntax_ptr = AstPtr::new(&expr);
match expr {
ast::Expr::IfExpr(e) => {
let then_branch = self.collect_block_opt(e.then_branch());
@ -640,10 +638,10 @@ where
self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr)
}
ast::Expr::TryBlockExpr(e) => {
let body = self.collect_block_opt(e.block());
let body = self.collect_block_opt(e.body());
self.alloc_expr(Expr::TryBlock { body }, syntax_ptr)
}
ast::Expr::BlockExpr(e) => self.collect_block_opt(e.block()),
ast::Expr::BlockExpr(e) => self.collect_block(e),
ast::Expr::LoopExpr(e) => {
let body = self.collect_block_opt(e.loop_body());
self.alloc_expr(Expr::Loop { body }, syntax_ptr)
@ -739,7 +737,7 @@ where
ast::Expr::ParenExpr(e) => {
let inner = self.collect_expr_opt(e.expr());
// make the paren expr point to the inner expression as well
self.source_map.expr_map.insert(syntax_ptr, inner);
self.source_map.expr_map.insert(Either::A(syntax_ptr), inner);
inner
}
ast::Expr::ReturnExpr(e) => {
@ -763,12 +761,9 @@ where
} else if let Some(nr) = field.name_ref() {
// field shorthand
let id = self.exprs.alloc(Expr::Path(Path::from_name_ref(&nr)));
self.source_map
.expr_map
.insert(SyntaxNodePtr::new(nr.syntax()), id);
self.source_map
.expr_map_back
.insert(id, SyntaxNodePtr::new(nr.syntax()));
let ptr = Either::B(AstPtr::new(&field));
self.source_map.expr_map.insert(ptr, id);
self.source_map.expr_map_back.insert(id, ptr);
id
} else {
self.exprs.alloc(Expr::Missing)
@ -942,7 +937,12 @@ where
}
}
fn collect_block(&mut self, block: ast::Block) -> ExprId {
fn collect_block(&mut self, expr: ast::BlockExpr) -> ExprId {
let syntax_node_ptr = AstPtr::new(&expr.clone().into());
let block = match expr.block() {
Some(block) => block,
None => return self.alloc_expr(Expr::Missing, syntax_node_ptr),
};
let statements = block
.statements()
.map(|s| match s {
@ -956,11 +956,11 @@ where
})
.collect();
let tail = block.expr().map(|e| self.collect_expr(e));
self.alloc_expr(Expr::Block { statements, tail }, SyntaxNodePtr::new(block.syntax()))
self.alloc_expr(Expr::Block { statements, tail }, syntax_node_ptr)
}
fn collect_block_opt(&mut self, block: Option<ast::Block>) -> ExprId {
if let Some(block) = block {
fn collect_block_opt(&mut self, expr: Option<ast::BlockExpr>) -> ExprId {
if let Some(block) = expr {
self.collect_block(block)
} else {
self.exprs.alloc(Expr::Missing)

View File

@ -172,7 +172,7 @@ fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut ExprScopes, scope
#[cfg(test)]
mod tests {
use ra_db::SourceDatabase;
use ra_syntax::{algo::find_node_at_offset, ast, AstNode, SyntaxNodePtr};
use ra_syntax::{algo::find_node_at_offset, ast, AstNode};
use test_utils::{assert_eq_text, extract_offset};
use crate::{mock::MockDatabase, source_binder::SourceAnalyzer};
@ -194,8 +194,7 @@ mod tests {
let analyzer = SourceAnalyzer::new(&db, file_id, marker.syntax(), None);
let scopes = analyzer.scopes();
let expr_id =
analyzer.body_source_map().syntax_expr(SyntaxNodePtr::new(marker.syntax())).unwrap();
let expr_id = analyzer.body_source_map().node_expr(&marker.into()).unwrap();
let scope = scopes.scope_for(expr_id);
let actual = scopes

View File

@ -1,7 +1,7 @@
use rustc_hash::FxHashSet;
use std::sync::Arc;
use ra_syntax::ast::{AstNode, RecordLit};
use ra_syntax::ast::{self, AstNode};
use rustc_hash::FxHashSet;
use super::{Expr, ExprId, RecordLitField};
use crate::{
@ -13,7 +13,6 @@ use crate::{
ty::{ApplicationTy, InferenceResult, Ty, TypeCtor},
Function, HasSource, HirDatabase, ModuleDef, Name, Path, PerNs, Resolution,
};
use ra_syntax::ast;
pub(crate) struct ExprValidator<'a, 'b: 'a> {
func: Function,
@ -84,8 +83,12 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
let source_file = parse.tree();
if let Some(field_list_node) = source_map
.expr_syntax(id)
.and_then(|ptr| ptr.a())
.map(|ptr| ptr.to_node(source_file.syntax()))
.and_then(RecordLit::cast)
.and_then(|expr| match expr {
ast::Expr::RecordLit(it) => Some(it),
_ => None,
})
.and_then(|lit| lit.record_field_list())
{
let field_list_ptr = AstPtr::new(&field_list_node);
@ -135,7 +138,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
let source_map = self.func.body_source_map(db);
let file_id = self.func.source(db).file_id;
if let Some(expr) = source_map.expr_syntax(id).and_then(|n| n.cast::<ast::Expr>()) {
if let Some(expr) = source_map.expr_syntax(id).and_then(|n| n.a()) {
self.sink.push(MissingOkInTailExpr { file: file_id, expr });
}
}

View File

@ -462,8 +462,8 @@ fn scope_for(
node: &SyntaxNode,
) -> Option<ScopeId> {
node.ancestors()
.map(|it| SyntaxNodePtr::new(&it))
.filter_map(|ptr| source_map.syntax_expr(ptr))
.filter_map(ast::Expr::cast)
.filter_map(|it| source_map.node_expr(&it))
.find_map(|it| scopes.scope_for(it))
}
@ -475,7 +475,10 @@ fn scope_for_offset(
scopes
.scope_by_expr()
.iter()
.filter_map(|(id, scope)| Some((source_map.expr_syntax(*id)?, scope)))
.filter_map(|(id, scope)| {
let ast_ptr = source_map.expr_syntax(*id)?.a()?;
Some((ast_ptr.syntax_node_ptr(), scope))
})
// find containing scope
.min_by_key(|(ptr, _scope)| {
(!(ptr.range().start() <= offset && offset <= ptr.range().end()), ptr.range().len())
@ -495,7 +498,10 @@ fn adjust(
let child_scopes = scopes
.scope_by_expr()
.iter()
.filter_map(|(id, scope)| Some((source_map.expr_syntax(*id)?, scope)))
.filter_map(|(id, scope)| {
let ast_ptr = source_map.expr_syntax(*id)?.a()?;
Some((ast_ptr.syntax_node_ptr(), scope))
})
.map(|(ptr, scope)| (ptr.range(), scope))
.filter(|(range, _)| range.start() <= offset && range.is_subrange(&r) && *range != r);

View File

@ -3582,7 +3582,7 @@ fn infer(content: &str) -> String {
for (expr, ty) in inference_result.type_of_expr.iter() {
let syntax_ptr = match body_source_map.expr_syntax(expr) {
Some(sp) => sp,
Some(sp) => sp.either(|it| it.syntax_node_ptr(), |it| it.syntax_node_ptr()),
None => continue,
};
types.push((syntax_ptr, ty));

View File

@ -123,7 +123,7 @@ fn has_comma_after(node: &SyntaxNode) -> bool {
fn join_single_expr_block(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Option<()> {
let block = ast::Block::cast(token.parent())?;
let block_expr = ast::BlockExpr::cast(block.syntax().parent()?)?;
let expr = extract_trivial_expression(&block)?;
let expr = extract_trivial_expression(&block_expr)?;
let block_range = block_expr.syntax().text_range();
let mut buf = expr.syntax().text().to_string();

View File

@ -116,6 +116,7 @@ SOURCE_FILE@[0; 11)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 11)
BLOCK@[9; 11)
L_CURLY@[9; 10) "{"
R_CURLY@[10; 11) "}"
@ -148,6 +149,7 @@ SOURCE_FILE@[0; 60)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 60)
BLOCK@[10; 60)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "
@ -190,6 +192,7 @@ FN_DEF@[0; 11)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 11)
BLOCK@[9; 11)
L_CURLY@[9; 10) "{"
R_CURLY@[10; 11) "}"
@ -258,6 +261,7 @@ SOURCE_FILE@[0; 12)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 12)
BLOCK@[9; 12)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) "\n"
@ -292,6 +296,7 @@ SOURCE_FILE@[0; 12)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 12)
BLOCK@[9; 12)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) "\n"
@ -325,6 +330,7 @@ SOURCE_FILE@[0; 25)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 12)
BLOCK@[9; 12)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) "\n"
@ -339,6 +345,7 @@ SOURCE_FILE@[0; 25)
L_PAREN@[19; 20) "("
R_PAREN@[20; 21) ")"
WHITESPACE@[21; 22) " "
BLOCK_EXPR@[22; 25)
BLOCK@[22; 25)
L_CURLY@[22; 23) "{"
WHITESPACE@[23; 24) "\n"

View File

@ -678,6 +678,7 @@ fn test_expr_order() {
PARAM_LIST@[5; 7)
L_PAREN@[5; 6) "("
R_PAREN@[6; 7) ")"
BLOCK_EXPR@[7; 15)
BLOCK@[7; 15)
L_CURLY@[7; 8) "{"
EXPR_STMT@[8; 14)

View File

@ -144,7 +144,7 @@ pub(crate) fn reparser(
parent: Option<SyntaxKind>,
) -> Option<fn(&mut Parser)> {
let res = match node {
BLOCK => expressions::block,
BLOCK => expressions::naked_block,
RECORD_FIELD_DEF_LIST => items::record_field_def_list,
RECORD_FIELD_LIST => items::record_field_list,
ENUM_VARIANT_LIST => items::enum_variant_list,

View File

@ -40,6 +40,11 @@ pub(crate) fn block(p: &mut Parser) {
p.error("expected a block");
return;
}
atom::block_expr(p, None);
}
pub(crate) fn naked_block(p: &mut Parser) {
assert!(p.at(T!['{']));
let m = p.start();
p.bump();
expr_block_contents(p);

View File

@ -463,10 +463,10 @@ fn match_guard(p: &mut Parser) -> CompletedMarker {
// unsafe {};
// 'label: {};
// }
fn block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
pub(super) fn block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
assert!(p.at(T!['{']));
let m = m.unwrap_or_else(|| p.start());
block(p);
naked_block(p);
m.complete(p, BLOCK_EXPR)
}

View File

@ -9,12 +9,12 @@ use crate::{
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ElseBranch {
Block(ast::Block),
Block(ast::BlockExpr),
IfExpr(ast::IfExpr),
}
impl ast::IfExpr {
pub fn then_branch(&self) -> Option<ast::Block> {
pub fn then_branch(&self) -> Option<ast::BlockExpr> {
self.blocks().nth(0)
}
pub fn else_branch(&self) -> Option<ElseBranch> {
@ -28,7 +28,7 @@ impl ast::IfExpr {
Some(res)
}
fn blocks(&self) -> AstChildren<ast::Block> {
fn blocks(&self) -> AstChildren<ast::BlockExpr> {
children(self)
}
}
@ -289,6 +289,26 @@ impl ast::Literal {
}
}
impl ast::BlockExpr {
/// false if the block is an intrinsic part of the syntax and can't be
/// replaced with arbitrary expression.
///
/// ```not_rust
/// fn foo() { not_stand_alone }
/// const FOO: () = { stand_alone };
/// ```
pub fn is_standalone(&self) -> bool {
let kind = match self.syntax().parent() {
None => return true,
Some(it) => it.kind(),
};
match kind {
FN_DEF | MATCH_ARM | IF_EXPR | WHILE_EXPR | LOOP_EXPR | TRY_BLOCK_EXPR => false,
_ => true,
}
}
}
#[test]
fn test_literal_with_attr() {
let parse = ast::SourceFile::parse(r#"const _: &str = { #[attr] "Hello" };"#);

View File

@ -1003,7 +1003,7 @@ impl FnDef {
pub fn param_list(&self) -> Option<ParamList> {
AstChildren::new(&self.syntax).next()
}
pub fn body(&self) -> Option<Block> {
pub fn body(&self) -> Option<BlockExpr> {
AstChildren::new(&self.syntax).next()
}
pub fn ret_type(&self) -> Option<RetType> {
@ -3135,7 +3135,7 @@ impl AstNode for TryBlockExpr {
}
}
impl TryBlockExpr {
pub fn block(&self) -> Option<Block> {
pub fn body(&self) -> Option<BlockExpr> {
AstChildren::new(&self.syntax).next()
}
}

View File

@ -28,7 +28,7 @@ pub trait VisibilityOwner: AstNode {
}
pub trait LoopBodyOwner: AstNode {
fn loop_body(&self) -> Option<ast::Block> {
fn loop_body(&self) -> Option<ast::BlockExpr> {
child_opt(self)
}
}

View File

@ -275,7 +275,7 @@ Grammar(
"AttrsOwner",
"DocCommentsOwner"
],
options: [ "ParamList", ["body", "Block"], "RetType" ],
options: [ "ParamList", ["body", "BlockExpr"], "RetType" ],
),
"RetType": (options: ["TypeRef"]),
"StructDef": (
@ -426,7 +426,7 @@ Grammar(
traits: ["LoopBodyOwner"],
),
"TryBlockExpr": (
options: ["Block"],
options: [["body", "BlockExpr"]],
),
"ForExpr": (
traits: ["LoopBodyOwner"],

View File

@ -203,7 +203,8 @@ fn api_walkthrough() {
assert_eq!(name.text(), "foo");
// Let's get the `1 + 1` expression!
let block: ast::Block = func.body().unwrap();
let body: ast::BlockExpr = func.body().unwrap();
let block = body.block().unwrap();
let expr: ast::Expr = block.expr().unwrap();
// Enums are used to group related ast nodes together, and can be used for

View File

@ -97,7 +97,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> {
for node in root.descendants() {
let _ = visitor_ctx(&mut errors)
.visit::<ast::Literal, _>(validate_literal)
.visit::<ast::Block, _>(block::validate_block_node)
.visit::<ast::BlockExpr, _>(block::validate_block_expr)
.visit::<ast::FieldExpr, _>(|it, errors| validate_numeric_name(it.name_ref(), errors))
.visit::<ast::RecordField, _>(|it, errors| validate_numeric_name(it.name_ref(), errors))
.accept(&node);

View File

@ -5,18 +5,18 @@ use crate::{
SyntaxKind::*,
};
pub(crate) fn validate_block_node(node: ast::Block, errors: &mut Vec<SyntaxError>) {
if let Some(parent) = node.syntax().parent() {
pub(crate) fn validate_block_expr(expr: ast::BlockExpr, errors: &mut Vec<SyntaxError>) {
if let Some(parent) = expr.syntax().parent() {
match parent.kind() {
FN_DEF => return,
BLOCK_EXPR => match parent.parent().map(|v| v.kind()) {
Some(EXPR_STMT) | Some(BLOCK) => return,
_ => {}
},
FN_DEF | EXPR_STMT | BLOCK => return,
_ => {}
}
}
if let Some(block) = expr.block() {
errors.extend(
node.attrs().map(|attr| SyntaxError::new(InvalidBlockAttr, attr.syntax().text_range())),
block
.attrs()
.map(|attr| SyntaxError::new(InvalidBlockAttr, attr.syntax().text_range())),
)
}
}

View File

@ -25,6 +25,7 @@ SOURCE_FILE@[0; 54)
L_PAREN@[25; 26) "("
R_PAREN@[26; 27) ")"
WHITESPACE@[27; 28) " "
BLOCK_EXPR@[28; 31)
BLOCK@[28; 31)
L_CURLY@[28; 29) "{"
WHITESPACE@[29; 30) "\n"

View File

@ -20,6 +20,7 @@ SOURCE_FILE@[0; 31)
PARAM_LIST@[23; 25)
L_PAREN@[23; 24) "("
R_PAREN@[24; 25) ")"
BLOCK_EXPR@[25; 27)
BLOCK@[25; 27)
L_CURLY@[25; 26) "{"
R_CURLY@[26; 27) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 95)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 12)
BLOCK@[9; 12)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) "\n"
@ -32,6 +33,7 @@ SOURCE_FILE@[0; 95)
LITERAL@[29; 33)
TRUE_KW@[29; 33) "true"
WHITESPACE@[33; 34) " "
BLOCK_EXPR@[34; 51)
BLOCK@[34; 51)
L_CURLY@[34; 35) "{"
WHITESPACE@[35; 44) "\n "
@ -42,6 +44,7 @@ SOURCE_FILE@[0; 95)
WHITESPACE@[51; 52) " "
ELSE_KW@[52; 56) "else"
WHITESPACE@[56; 57) " "
BLOCK_EXPR@[57; 78)
BLOCK@[57; 78)
L_CURLY@[57; 58) "{"
WHITESPACE@[58; 67) "\n "
@ -67,6 +70,7 @@ SOURCE_FILE@[0; 95)
L_PAREN@[88; 89) "("
R_PAREN@[89; 90) ")"
WHITESPACE@[90; 91) " "
BLOCK_EXPR@[91; 94)
BLOCK@[91; 94)
L_CURLY@[91; 92) "{"
WHITESPACE@[92; 93) "\n"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 42)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 41)
BLOCK@[10; 41)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -24,6 +24,7 @@ SOURCE_FILE@[0; 23)
NAME_REF@[18; 19)
IDENT@[18; 19) "T"
WHITESPACE@[19; 20) " "
BLOCK_EXPR@[20; 22)
BLOCK@[20; 22)
L_CURLY@[20; 21) "{"
R_CURLY@[21; 22) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 56)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 55)
BLOCK@[9; 55)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -19,6 +19,7 @@ SOURCE_FILE@[0; 47)
IDENT@[12; 15) "i32"
R_PAREN@[15; 16) ")"
WHITESPACE@[16; 17) " "
BLOCK_EXPR@[17; 46)
BLOCK@[17; 46)
L_CURLY@[17; 18) "{"
WHITESPACE@[18; 23) "\n "

View File

@ -32,6 +32,7 @@ SOURCE_FILE@[0; 183)
NAME_REF@[39; 46)
IDENT@[39; 46) "ScopeId"
WHITESPACE@[46; 47) " "
BLOCK_EXPR@[47; 161)
BLOCK@[47; 161)
L_CURLY@[47; 48) "{"
WHITESPACE@[48; 57) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 139)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 138)
BLOCK@[9; 138)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "
@ -60,6 +61,7 @@ SOURCE_FILE@[0; 139)
LITERAL@[83; 87)
TRUE_KW@[83; 87) "true"
WHITESPACE@[87; 88) " "
BLOCK_EXPR@[88; 90)
BLOCK@[88; 90)
L_CURLY@[88; 89) "{"
R_CURLY@[89; 90) "}"
@ -75,6 +77,7 @@ SOURCE_FILE@[0; 139)
LITERAL@[109; 113)
TRUE_KW@[109; 113) "true"
WHITESPACE@[113; 114) " "
BLOCK_EXPR@[114; 116)
BLOCK@[114; 116)
L_CURLY@[114; 115) "{"
R_CURLY@[115; 116) "}"
@ -85,6 +88,7 @@ SOURCE_FILE@[0; 139)
LOOP_EXPR@[129; 136)
LOOP_KW@[129; 133) "loop"
WHITESPACE@[133; 134) " "
BLOCK_EXPR@[134; 136)
BLOCK@[134; 136)
L_CURLY@[134; 135) "{"
R_CURLY@[135; 136) "}"

View File

@ -11,6 +11,7 @@ SOURCE_FILE@[0; 16)
L_PAREN@[10; 11) "("
R_PAREN@[11; 12) ")"
WHITESPACE@[12; 13) " "
BLOCK_EXPR@[13; 15)
BLOCK@[13; 15)
L_CURLY@[13; 14) "{"
R_CURLY@[14; 15) "}"

View File

@ -25,6 +25,7 @@ SOURCE_FILE@[0; 22)
IDENT@[15; 16) "y"
R_PAREN@[16; 17) ")"
WHITESPACE@[17; 18) " "
BLOCK_EXPR@[18; 21)
BLOCK@[18; 21)
L_CURLY@[18; 19) "{"
WHITESPACE@[19; 20) "\n"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 112)
L_PAREN@[4; 5) "("
R_PAREN@[5; 6) ")"
WHITESPACE@[6; 7) " "
BLOCK_EXPR@[7; 33)
BLOCK@[7; 33)
L_CURLY@[7; 8) "{"
WHITESPACE@[8; 9) " "
@ -50,6 +51,7 @@ SOURCE_FILE@[0; 112)
L_PAREN@[38; 39) "("
R_PAREN@[39; 40) ")"
WHITESPACE@[40; 41) " "
BLOCK_EXPR@[41; 68)
BLOCK@[41; 68)
L_CURLY@[41; 42) "{"
WHITESPACE@[42; 43) " "
@ -99,6 +101,7 @@ SOURCE_FILE@[0; 112)
L_PAREN@[73; 74) "("
R_PAREN@[74; 75) ")"
WHITESPACE@[75; 76) " "
BLOCK_EXPR@[76; 111)
BLOCK@[76; 111)
L_CURLY@[76; 77) "{"
WHITESPACE@[77; 78) " "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 94)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 55)
BLOCK@[10; 55)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -61,6 +61,7 @@ SOURCE_FILE@[0; 240)
L_PAREN@[48; 49) "("
R_PAREN@[49; 50) ")"
WHITESPACE@[50; 51) " "
BLOCK_EXPR@[51; 53)
BLOCK@[51; 53)
L_CURLY@[51; 52) "{"
R_CURLY@[52; 53) "}"
@ -74,6 +75,7 @@ SOURCE_FILE@[0; 240)
L_PAREN@[62; 63) "("
R_PAREN@[63; 64) ")"
WHITESPACE@[64; 65) " "
BLOCK_EXPR@[65; 239)
BLOCK@[65; 239)
L_CURLY@[65; 66) "{"
WHITESPACE@[66; 71) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 575)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 574)
BLOCK@[10; 574)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -20,6 +20,7 @@ SOURCE_FILE@[0; 30)
LIFETIME@[23; 25) "\'a"
R_ANGLE@[25; 26) ">"
WHITESPACE@[26; 27) "\n"
BLOCK_EXPR@[27; 29)
BLOCK@[27; 29)
L_CURLY@[27; 28) "{"
R_CURLY@[28; 29) "}"

View File

@ -73,6 +73,7 @@ SOURCE_FILE@[0; 349)
L_PAREN@[125; 126) "("
R_PAREN@[126; 127) ")"
WHITESPACE@[127; 128) " "
BLOCK_EXPR@[128; 348)
BLOCK@[128; 348)
L_CURLY@[128; 129) "{"
WHITESPACE@[129; 134) "\n "

View File

@ -19,6 +19,7 @@ SOURCE_FILE@[0; 24)
IDENT@[10; 11) "A"
R_PAREN@[11; 12) ")"
WHITESPACE@[12; 13) " "
BLOCK_EXPR@[13; 23)
BLOCK@[13; 23)
L_CURLY@[13; 14) "{"
WHITESPACE@[14; 19) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 350)
L_PAREN@[8; 9) "("
R_PAREN@[9; 10) ")"
WHITESPACE@[10; 11) " "
BLOCK_EXPR@[11; 349)
BLOCK@[11; 349)
L_CURLY@[11; 12) "{"
WHITESPACE@[12; 17) "\n "
@ -49,6 +50,7 @@ SOURCE_FILE@[0; 350)
LITERAL@[137; 141)
TRUE_KW@[137; 141) "true"
WHITESPACE@[141; 142) " "
BLOCK_EXPR@[142; 257)
BLOCK@[142; 257)
L_CURLY@[142; 143) "{"
WHITESPACE@[143; 152) "\n "
@ -87,6 +89,7 @@ SOURCE_FILE@[0; 350)
LITERAL@[268; 272)
TRUE_KW@[268; 272) "true"
WHITESPACE@[272; 273) " "
BLOCK_EXPR@[273; 347)
BLOCK@[273; 347)
L_CURLY@[273; 274) "{"
WHITESPACE@[274; 283) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 293)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 292)
BLOCK@[9; 292)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 89)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 88)
BLOCK@[9; 88)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 91)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 89)
BLOCK@[10; 89)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 30)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 29)
BLOCK@[10; 29)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -7,6 +7,7 @@ SOURCE_FILE@[0; 33)
PARAM_LIST@[6; 8)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
BLOCK_EXPR@[8; 10)
BLOCK@[8; 10)
L_CURLY@[8; 9) "{"
R_CURLY@[9; 10) "}"
@ -27,6 +28,7 @@ SOURCE_FILE@[0; 33)
PARAM_LIST@[28; 30)
L_PAREN@[28; 29) "("
R_PAREN@[29; 30) ")"
BLOCK_EXPR@[30; 32)
BLOCK@[30; 32)
L_CURLY@[30; 31) "{"
R_CURLY@[31; 32) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 30)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 29)
BLOCK@[9; 29)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) " "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 21)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 20)
BLOCK@[9; 20)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) " "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 48)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 47)
BLOCK@[9; 47)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 14) "\n "
@ -44,6 +45,7 @@ SOURCE_FILE@[0; 48)
LITERAL@[37; 41)
TRUE_KW@[37; 41) "true"
WHITESPACE@[41; 42) " "
BLOCK_EXPR@[42; 44)
BLOCK@[42; 44)
L_CURLY@[42; 43) "{"
R_CURLY@[43; 44) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 47)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 46)
BLOCK@[9; 46)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -13,6 +13,7 @@ SOURCE_FILE@[0; 50)
L_PAREN@[19; 20) "("
R_PAREN@[20; 21) ")"
WHITESPACE@[21; 22) " "
BLOCK_EXPR@[22; 24)
BLOCK@[22; 24)
L_CURLY@[22; 23) "{"
R_CURLY@[23; 24) "}"
@ -31,6 +32,7 @@ SOURCE_FILE@[0; 50)
L_PAREN@[44; 45) "("
R_PAREN@[45; 46) ")"
WHITESPACE@[46; 47) " "
BLOCK_EXPR@[47; 49)
BLOCK@[47; 49)
L_CURLY@[47; 48) "{"
R_CURLY@[48; 49) "}"

View File

@ -44,6 +44,7 @@ SOURCE_FILE@[0; 62)
L_PAREN@[54; 55) "("
R_PAREN@[55; 56) ")"
WHITESPACE@[56; 57) " "
BLOCK_EXPR@[57; 59)
BLOCK@[57; 59)
L_CURLY@[57; 58) "{"
R_CURLY@[58; 59) "}"

View File

@ -50,6 +50,7 @@ SOURCE_FILE@[0; 83)
L_PAREN@[56; 57) "("
R_PAREN@[57; 58) ")"
WHITESPACE@[58; 59) " "
BLOCK_EXPR@[59; 61)
BLOCK@[59; 61)
L_CURLY@[59; 60) "{"
R_CURLY@[60; 61) "}"

View File

@ -54,6 +54,7 @@ SOURCE_FILE@[0; 49)
IDENT@[40; 43) "str"
R_PAREN@[43; 44) ")"
WHITESPACE@[44; 45) "\n"
BLOCK_EXPR@[45; 48)
BLOCK@[45; 48)
L_CURLY@[45; 46) "{"
WHITESPACE@[46; 47) " "

View File

@ -31,6 +31,7 @@ SOURCE_FILE@[0; 28)
PARAM_LIST@[23; 25)
L_PAREN@[23; 24) "("
R_PAREN@[24; 25) ")"
BLOCK_EXPR@[25; 27)
BLOCK@[25; 27)
L_CURLY@[25; 26) "{"
R_CURLY@[26; 27) "}"

View File

@ -22,6 +22,7 @@ SOURCE_FILE@[0; 128)
SELF_KW@[18; 22) "self"
R_PAREN@[22; 23) ")"
WHITESPACE@[23; 24) " "
BLOCK_EXPR@[24; 26)
BLOCK@[24; 26)
L_CURLY@[24; 25) "{"
R_CURLY@[25; 26) "}"
@ -39,6 +40,7 @@ SOURCE_FILE@[0; 128)
COMMA@[41; 42) ","
R_PAREN@[42; 43) ")"
WHITESPACE@[43; 44) " "
BLOCK_EXPR@[44; 46)
BLOCK@[44; 46)
L_CURLY@[44; 45) "{"
R_CURLY@[45; 46) "}"
@ -58,6 +60,7 @@ SOURCE_FILE@[0; 128)
COMMA@[64; 65) ","
R_PAREN@[65; 66) ")"
WHITESPACE@[66; 67) " "
BLOCK_EXPR@[67; 69)
BLOCK@[67; 69)
L_CURLY@[67; 68) "{"
R_CURLY@[68; 69) "}"
@ -91,6 +94,7 @@ SOURCE_FILE@[0; 128)
IDENT@[96; 99) "i32"
R_PAREN@[99; 100) ")"
WHITESPACE@[100; 101) " "
BLOCK_EXPR@[101; 103)
BLOCK@[101; 103)
L_CURLY@[101; 102) "{"
R_CURLY@[102; 103) "}"
@ -108,6 +112,7 @@ SOURCE_FILE@[0; 128)
SELF_KW@[117; 121) "self"
R_PAREN@[121; 122) ")"
WHITESPACE@[122; 123) " "
BLOCK_EXPR@[123; 125)
BLOCK@[123; 125)
L_CURLY@[123; 124) "{"
R_CURLY@[124; 125) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 103)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 102)
BLOCK@[9; 102)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 26)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 25)
BLOCK@[9; 25)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "
@ -15,6 +16,7 @@ SOURCE_FILE@[0; 26)
LOOP_EXPR@[15; 22)
LOOP_KW@[15; 19) "loop"
WHITESPACE@[19; 20) " "
BLOCK_EXPR@[20; 22)
BLOCK@[20; 22)
L_CURLY@[20; 21) "{"
R_CURLY@[21; 22) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 48)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 47)
BLOCK@[9; 47)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,12 +8,14 @@ SOURCE_FILE@[0; 69)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 68)
BLOCK@[9; 68)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "
LOOP_EXPR@[15; 66)
LOOP_KW@[15; 19) "loop"
WHITESPACE@[19; 20) " "
BLOCK_EXPR@[20; 66)
BLOCK@[20; 66)
L_CURLY@[20; 21) "{"
WHITESPACE@[21; 30) "\n "

View File

@ -31,6 +31,7 @@ SOURCE_FILE@[0; 69)
IDENT@[25; 29) "Self"
R_PAREN@[29; 30) ")"
WHITESPACE@[30; 31) " "
BLOCK_EXPR@[31; 33)
BLOCK@[31; 33)
L_CURLY@[31; 32) "{"
R_CURLY@[32; 33) "}"
@ -64,6 +65,7 @@ SOURCE_FILE@[0; 69)
R_ANGLE@[61; 62) ">"
R_PAREN@[62; 63) ")"
WHITESPACE@[63; 64) " "
BLOCK_EXPR@[64; 66)
BLOCK@[64; 66)
L_CURLY@[64; 65) "{"
R_CURLY@[65; 66) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 44)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 43)
BLOCK@[9; 43)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -54,6 +54,7 @@ SOURCE_FILE@[0; 89)
L_PAREN@[60; 61) "("
R_PAREN@[61; 62) ")"
WHITESPACE@[62; 63) " "
BLOCK_EXPR@[63; 65)
BLOCK@[63; 65)
L_CURLY@[63; 64) "{"
R_CURLY@[64; 65) "}"
@ -70,6 +71,7 @@ SOURCE_FILE@[0; 89)
SELF_KW@[78; 82) "self"
R_PAREN@[82; 83) ")"
WHITESPACE@[83; 84) " "
BLOCK_EXPR@[84; 86)
BLOCK@[84; 86)
L_CURLY@[84; 85) "{"
R_CURLY@[85; 86) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 39)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 38)
BLOCK@[10; 38)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 97)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 96)
BLOCK@[9; 96)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 52)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 51)
BLOCK@[10; 51)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 89)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 88)
BLOCK@[9; 88)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 197)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 37)
BLOCK@[9; 37)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) " "
@ -35,6 +36,7 @@ SOURCE_FILE@[0; 197)
NAME_REF@[28; 32)
IDENT@[28; 32) "None"
WHITESPACE@[32; 33) " "
BLOCK_EXPR@[33; 35)
BLOCK@[33; 35)
L_CURLY@[33; 34) "{"
R_CURLY@[34; 35) "}"
@ -50,6 +52,7 @@ SOURCE_FILE@[0; 197)
L_PAREN@[44; 45) "("
R_PAREN@[45; 46) ")"
WHITESPACE@[46; 47) " "
BLOCK_EXPR@[47; 196)
BLOCK@[47; 196)
L_CURLY@[47; 48) "{"
WHITESPACE@[48; 53) "\n "
@ -90,6 +93,7 @@ SOURCE_FILE@[0; 197)
NAME_REF@[80; 84)
IDENT@[80; 84) "None"
WHITESPACE@[84; 85) " "
BLOCK_EXPR@[85; 87)
BLOCK@[85; 87)
L_CURLY@[85; 86) "{"
R_CURLY@[86; 87) "}"
@ -121,6 +125,7 @@ SOURCE_FILE@[0; 197)
NAME_REF@[111; 115)
IDENT@[111; 115) "None"
WHITESPACE@[115; 116) " "
BLOCK_EXPR@[116; 118)
BLOCK@[116; 118)
L_CURLY@[116; 117) "{"
R_CURLY@[117; 118) "}"
@ -162,6 +167,7 @@ SOURCE_FILE@[0; 197)
NAME_REF@[153; 157)
IDENT@[153; 157) "None"
WHITESPACE@[157; 158) " "
BLOCK_EXPR@[158; 160)
BLOCK@[158; 160)
L_CURLY@[158; 159) "{"
R_CURLY@[159; 160) "}"
@ -192,6 +198,7 @@ SOURCE_FILE@[0; 197)
NAME_REF@[187; 191)
IDENT@[187; 191) "None"
WHITESPACE@[191; 192) " "
BLOCK_EXPR@[192; 194)
BLOCK@[192; 194)
L_CURLY@[192; 193) "{"
R_CURLY@[193; 194) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 70)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 69)
BLOCK@[9; 69)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "
@ -19,6 +20,7 @@ SOURCE_FILE@[0; 70)
LITERAL@[21; 25)
TRUE_KW@[21; 25) "true"
WHITESPACE@[25; 26) " "
BLOCK_EXPR@[26; 28)
BLOCK@[26; 28)
L_CURLY@[26; 27) "{"
R_CURLY@[27; 28) "}"
@ -57,6 +59,7 @@ SOURCE_FILE@[0; 70)
L_PAREN@[61; 62) "("
R_PAREN@[62; 63) ")"
WHITESPACE@[63; 64) " "
BLOCK_EXPR@[64; 66)
BLOCK@[64; 66)
L_CURLY@[64; 65) "{"
R_CURLY@[65; 66) "}"

View File

@ -8,12 +8,14 @@ SOURCE_FILE@[0; 102)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 101)
BLOCK@[9; 101)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "
LOOP_EXPR@[15; 99)
LOOP_KW@[15; 19) "loop"
WHITESPACE@[19; 20) " "
BLOCK_EXPR@[20; 99)
BLOCK@[20; 99)
L_CURLY@[20; 21) "{"
WHITESPACE@[21; 30) "\n "

View File

@ -15,6 +15,7 @@ SOURCE_FILE@[0; 30)
L_PAREN@[24; 25) "("
R_PAREN@[25; 26) ")"
WHITESPACE@[26; 27) " "
BLOCK_EXPR@[27; 29)
BLOCK@[27; 29)
L_CURLY@[27; 28) "{"
R_CURLY@[28; 29) "}"

View File

@ -41,6 +41,7 @@ SOURCE_FILE@[0; 71)
L_PAREN@[33; 34) "("
R_PAREN@[34; 35) ")"
WHITESPACE@[35; 36) " "
BLOCK_EXPR@[36; 70)
BLOCK@[36; 70)
L_CURLY@[36; 37) "{"
WHITESPACE@[37; 38) " "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 21)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 20)
BLOCK@[9; 20)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) " "

View File

@ -11,6 +11,7 @@ SOURCE_FILE@[0; 71)
L_PAREN@[13; 14) "("
R_PAREN@[14; 15) ")"
WHITESPACE@[15; 16) " "
BLOCK_EXPR@[16; 19)
BLOCK@[16; 19)
L_CURLY@[16; 17) "{"
WHITESPACE@[17; 18) " "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 118)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 117)
BLOCK@[9; 117)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 21)
L_PAREN@[4; 5) "("
R_PAREN@[5; 6) ")"
WHITESPACE@[6; 7) " "
BLOCK_EXPR@[7; 20)
BLOCK@[7; 20)
L_CURLY@[7; 8) "{"
WHITESPACE@[8; 9) " "
@ -20,6 +21,7 @@ SOURCE_FILE@[0; 21)
L_PAREN@[13; 14) "("
R_PAREN@[14; 15) ")"
WHITESPACE@[15; 16) " "
BLOCK_EXPR@[16; 18)
BLOCK@[16; 18)
L_CURLY@[16; 17) "{"
R_CURLY@[17; 18) "}"

View File

@ -40,6 +40,7 @@ SOURCE_FILE@[0; 35)
PARAM_LIST@[30; 32)
L_PAREN@[30; 31) "("
R_PAREN@[31; 32) ")"
BLOCK_EXPR@[32; 34)
BLOCK@[32; 34)
L_CURLY@[32; 33) "{"
R_CURLY@[33; 34) "}"

View File

@ -34,6 +34,7 @@ SOURCE_FILE@[0; 58)
LIFETIME@[20; 22) "\'f"
R_ANGLE@[22; 23) ">"
WHITESPACE@[23; 24) " "
BLOCK_EXPR@[24; 26)
BLOCK@[24; 26)
L_CURLY@[24; 25) "{"
R_CURLY@[25; 26) "}"
@ -75,6 +76,7 @@ SOURCE_FILE@[0; 58)
LIFETIME@[51; 53) "\'f"
R_ANGLE@[53; 54) ">"
WHITESPACE@[54; 55) " "
BLOCK_EXPR@[55; 57)
BLOCK@[55; 57)
L_CURLY@[55; 56) "{"
R_CURLY@[56; 57) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 91)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 90)
BLOCK@[9; 90)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 113)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 112)
BLOCK@[10; 112)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -104,6 +104,7 @@ SOURCE_FILE@[0; 116)
TYPE_BOUND@[110; 112)
LIFETIME@[110; 112) "\'a"
WHITESPACE@[112; 113) "\n"
BLOCK_EXPR@[113; 115)
BLOCK@[113; 115)
L_CURLY@[113; 114) "{"
R_CURLY@[114; 115) "}"

View File

@ -10,6 +10,7 @@ SOURCE_FILE@[0; 18)
L_PAREN@[12; 13) "("
R_PAREN@[13; 14) ")"
WHITESPACE@[14; 15) " "
BLOCK_EXPR@[15; 17)
BLOCK@[15; 17)
L_CURLY@[15; 16) "{"
R_CURLY@[16; 17) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 112)
L_PAREN@[7; 8) "("
R_PAREN@[8; 9) ")"
WHITESPACE@[9; 10) " "
BLOCK_EXPR@[10; 111)
BLOCK@[10; 111)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 83)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 82)
BLOCK@[9; 82)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 112)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 111)
BLOCK@[9; 111)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 70)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 11)
BLOCK@[9; 11)
L_CURLY@[9; 10) "{"
R_CURLY@[10; 11) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 107)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 106)
BLOCK@[9; 106)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "
@ -19,6 +20,7 @@ SOURCE_FILE@[0; 107)
LITERAL@[18; 22)
TRUE_KW@[18; 22) "true"
WHITESPACE@[22; 23) " "
BLOCK_EXPR@[23; 25)
BLOCK@[23; 25)
L_CURLY@[23; 24) "{"
R_CURLY@[24; 25) "}"
@ -32,12 +34,14 @@ SOURCE_FILE@[0; 107)
LITERAL@[34; 38)
TRUE_KW@[34; 38) "true"
WHITESPACE@[38; 39) " "
BLOCK_EXPR@[39; 41)
BLOCK@[39; 41)
L_CURLY@[39; 40) "{"
R_CURLY@[40; 41) "}"
WHITESPACE@[41; 42) " "
ELSE_KW@[42; 46) "else"
WHITESPACE@[46; 47) " "
BLOCK_EXPR@[47; 49)
BLOCK@[47; 49)
L_CURLY@[47; 48) "{"
R_CURLY@[48; 49) "}"
@ -51,6 +55,7 @@ SOURCE_FILE@[0; 107)
LITERAL@[58; 62)
TRUE_KW@[58; 62) "true"
WHITESPACE@[62; 63) " "
BLOCK_EXPR@[63; 65)
BLOCK@[63; 65)
L_CURLY@[63; 64) "{"
R_CURLY@[64; 65) "}"
@ -64,12 +69,14 @@ SOURCE_FILE@[0; 107)
LITERAL@[74; 79)
FALSE_KW@[74; 79) "false"
WHITESPACE@[79; 80) " "
BLOCK_EXPR@[80; 82)
BLOCK@[80; 82)
L_CURLY@[80; 81) "{"
R_CURLY@[81; 82) "}"
WHITESPACE@[82; 83) " "
ELSE_KW@[83; 87) "else"
WHITESPACE@[87; 88) " "
BLOCK_EXPR@[88; 90)
BLOCK@[88; 90)
L_CURLY@[88; 89) "{"
R_CURLY@[89; 90) "}"
@ -86,6 +93,7 @@ SOURCE_FILE@[0; 107)
NAME_REF@[99; 100)
IDENT@[99; 100) "S"
WHITESPACE@[100; 101) " "
BLOCK_EXPR@[101; 103)
BLOCK@[101; 103)
L_CURLY@[101; 102) "{"
R_CURLY@[102; 103) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 167)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 166)
BLOCK@[9; 166)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 46)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 45)
BLOCK@[9; 45)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 47)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 46)
BLOCK@[9; 46)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 40)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 39)
BLOCK@[9; 39)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 84)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 83)
BLOCK@[9; 83)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 65)
L_PAREN@[4; 5) "("
R_PAREN@[5; 6) ")"
WHITESPACE@[6; 7) " "
BLOCK_EXPR@[7; 9)
BLOCK@[7; 9)
L_CURLY@[7; 8) "{"
R_CURLY@[8; 9) "}"
@ -21,6 +22,7 @@ SOURCE_FILE@[0; 65)
L_PAREN@[14; 15) "("
R_PAREN@[15; 16) ")"
WHITESPACE@[16; 17) " "
BLOCK_EXPR@[17; 31)
BLOCK@[17; 31)
L_CURLY@[17; 18) "{"
WHITESPACE@[18; 19) " "
@ -47,6 +49,7 @@ SOURCE_FILE@[0; 65)
L_PAREN@[36; 37) "("
R_PAREN@[37; 38) ")"
WHITESPACE@[38; 39) " "
BLOCK_EXPR@[39; 48)
BLOCK@[39; 48)
L_CURLY@[39; 40) "{"
WHITESPACE@[40; 41) " "
@ -71,6 +74,7 @@ SOURCE_FILE@[0; 65)
L_PAREN@[53; 54) "("
R_PAREN@[54; 55) ")"
WHITESPACE@[55; 56) " "
BLOCK_EXPR@[56; 64)
BLOCK@[56; 64)
L_CURLY@[56; 57) "{"
WHITESPACE@[57; 58) " "

View File

@ -33,6 +33,7 @@ SOURCE_FILE@[0; 29)
NAME_REF@[21; 25)
IDENT@[21; 25) "Copy"
WHITESPACE@[25; 26) " "
BLOCK_EXPR@[26; 28)
BLOCK@[26; 28)
L_CURLY@[26; 27) "{"
R_CURLY@[27; 28) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 21)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 20)
BLOCK@[9; 20)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 26)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 25)
BLOCK@[9; 25)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 11) " "

View File

@ -88,6 +88,7 @@ SOURCE_FILE@[0; 200)
NAME_REF@[68; 76)
IDENT@[68; 76) "Iterator"
WHITESPACE@[76; 77) " "
BLOCK_EXPR@[77; 79)
BLOCK@[77; 79)
L_CURLY@[77; 78) "{"
R_CURLY@[78; 79) "}"
@ -153,6 +154,7 @@ SOURCE_FILE@[0; 200)
NAME_REF@[123; 131)
IDENT@[123; 131) "Iterator"
WHITESPACE@[131; 132) " "
BLOCK_EXPR@[132; 134)
BLOCK@[132; 134)
L_CURLY@[132; 133) "{"
R_CURLY@[133; 134) "}"
@ -234,6 +236,7 @@ SOURCE_FILE@[0; 200)
NAME_REF@[188; 196)
IDENT@[188; 196) "Iterator"
WHITESPACE@[196; 197) " "
BLOCK_EXPR@[197; 199)
BLOCK@[197; 199)
L_CURLY@[197; 198) "{"
R_CURLY@[198; 199) "}"

View File

@ -8,6 +8,7 @@ SOURCE_FILE@[0; 52)
L_PAREN@[6; 7) "("
R_PAREN@[7; 8) ")"
WHITESPACE@[8; 9) " "
BLOCK_EXPR@[9; 51)
BLOCK@[9; 51)
L_CURLY@[9; 10) "{"
WHITESPACE@[10; 15) "\n "

Some files were not shown because too many files have changed in this diff Show More