mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-01 07:48:45 +00:00
e12a001b55
Previously it was one level above, and that caused problems with macros that expand to it, because macros expect to get only one top-level node.
344 lines
7.2 KiB
Rust
344 lines
7.2 KiB
Rust
use expect_test::expect;
|
|
|
|
use crate::TopEntryPoint;
|
|
|
|
#[test]
|
|
fn source_file() {
|
|
check(
|
|
TopEntryPoint::SourceFile,
|
|
"",
|
|
expect![[r#"
|
|
SOURCE_FILE
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::SourceFile,
|
|
"struct S;",
|
|
expect![[r#"
|
|
SOURCE_FILE
|
|
STRUCT
|
|
STRUCT_KW "struct"
|
|
WHITESPACE " "
|
|
NAME
|
|
IDENT "S"
|
|
SEMICOLON ";"
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::SourceFile,
|
|
"@error@",
|
|
expect![[r#"
|
|
SOURCE_FILE
|
|
ERROR
|
|
AT "@"
|
|
MACRO_CALL
|
|
PATH
|
|
PATH_SEGMENT
|
|
NAME_REF
|
|
IDENT "error"
|
|
ERROR
|
|
AT "@"
|
|
error 0: expected an item
|
|
error 6: expected BANG
|
|
error 6: expected `{`, `[`, `(`
|
|
error 6: expected SEMICOLON
|
|
error 6: expected an item
|
|
"#]],
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn macro_stmt() {
|
|
check(
|
|
TopEntryPoint::MacroStmts,
|
|
"",
|
|
expect![[r#"
|
|
MACRO_STMTS
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::MacroStmts,
|
|
"#!/usr/bin/rust",
|
|
expect![[r##"
|
|
MACRO_STMTS
|
|
ERROR
|
|
SHEBANG "#!/usr/bin/rust"
|
|
error 0: expected expression, item or let statement
|
|
"##]],
|
|
);
|
|
check(
|
|
TopEntryPoint::MacroStmts,
|
|
"let x = 1 2 struct S;",
|
|
expect![[r#"
|
|
MACRO_STMTS
|
|
LET_STMT
|
|
LET_KW "let"
|
|
WHITESPACE " "
|
|
IDENT_PAT
|
|
NAME
|
|
IDENT "x"
|
|
WHITESPACE " "
|
|
EQ "="
|
|
WHITESPACE " "
|
|
LITERAL
|
|
INT_NUMBER "1"
|
|
WHITESPACE " "
|
|
EXPR_STMT
|
|
LITERAL
|
|
INT_NUMBER "2"
|
|
WHITESPACE " "
|
|
STRUCT
|
|
STRUCT_KW "struct"
|
|
WHITESPACE " "
|
|
NAME
|
|
IDENT "S"
|
|
SEMICOLON ";"
|
|
"#]],
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn macro_items() {
|
|
check(
|
|
TopEntryPoint::MacroItems,
|
|
"",
|
|
expect![[r#"
|
|
MACRO_ITEMS
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::MacroItems,
|
|
"#!/usr/bin/rust",
|
|
expect![[r##"
|
|
MACRO_ITEMS
|
|
ERROR
|
|
SHEBANG "#!/usr/bin/rust"
|
|
error 0: expected an item
|
|
"##]],
|
|
);
|
|
check(
|
|
TopEntryPoint::MacroItems,
|
|
"struct S; foo!{}",
|
|
expect![[r#"
|
|
MACRO_ITEMS
|
|
STRUCT
|
|
STRUCT_KW "struct"
|
|
WHITESPACE " "
|
|
NAME
|
|
IDENT "S"
|
|
SEMICOLON ";"
|
|
WHITESPACE " "
|
|
MACRO_CALL
|
|
PATH
|
|
PATH_SEGMENT
|
|
NAME_REF
|
|
IDENT "foo"
|
|
BANG "!"
|
|
TOKEN_TREE
|
|
L_CURLY "{"
|
|
R_CURLY "}"
|
|
"#]],
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn macro_pattern() {
|
|
check(
|
|
TopEntryPoint::Pattern,
|
|
"",
|
|
expect![[r#"
|
|
ERROR
|
|
error 0: expected pattern
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::Pattern,
|
|
"Some(_)",
|
|
expect![[r#"
|
|
TUPLE_STRUCT_PAT
|
|
PATH
|
|
PATH_SEGMENT
|
|
NAME_REF
|
|
IDENT "Some"
|
|
L_PAREN "("
|
|
WILDCARD_PAT
|
|
UNDERSCORE "_"
|
|
R_PAREN ")"
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::Pattern,
|
|
"None leftover tokens",
|
|
expect![[r#"
|
|
ERROR
|
|
IDENT_PAT
|
|
NAME
|
|
IDENT "None"
|
|
WHITESPACE " "
|
|
IDENT "leftover"
|
|
WHITESPACE " "
|
|
IDENT "tokens"
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::Pattern,
|
|
"@err",
|
|
expect![[r#"
|
|
ERROR
|
|
ERROR
|
|
AT "@"
|
|
IDENT "err"
|
|
error 0: expected pattern
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::Pattern,
|
|
"| 42 | 43",
|
|
expect![[r#"
|
|
OR_PAT
|
|
PIPE "|"
|
|
WHITESPACE " "
|
|
LITERAL_PAT
|
|
LITERAL
|
|
INT_NUMBER "42"
|
|
WHITESPACE " "
|
|
PIPE "|"
|
|
WHITESPACE " "
|
|
LITERAL_PAT
|
|
LITERAL
|
|
INT_NUMBER "43"
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::Pattern,
|
|
"| 42",
|
|
expect![[r#"
|
|
OR_PAT
|
|
PIPE "|"
|
|
WHITESPACE " "
|
|
LITERAL_PAT
|
|
LITERAL
|
|
INT_NUMBER "42"
|
|
"#]],
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn type_() {
|
|
check(
|
|
TopEntryPoint::Type,
|
|
"",
|
|
expect![[r#"
|
|
ERROR
|
|
error 0: expected type
|
|
"#]],
|
|
);
|
|
|
|
check(
|
|
TopEntryPoint::Type,
|
|
"Option<!>",
|
|
expect![[r#"
|
|
PATH_TYPE
|
|
PATH
|
|
PATH_SEGMENT
|
|
NAME_REF
|
|
IDENT "Option"
|
|
GENERIC_ARG_LIST
|
|
L_ANGLE "<"
|
|
TYPE_ARG
|
|
NEVER_TYPE
|
|
BANG "!"
|
|
R_ANGLE ">"
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::Type,
|
|
"() () ()",
|
|
expect![[r#"
|
|
ERROR
|
|
TUPLE_TYPE
|
|
L_PAREN "("
|
|
R_PAREN ")"
|
|
WHITESPACE " "
|
|
L_PAREN "("
|
|
R_PAREN ")"
|
|
WHITESPACE " "
|
|
L_PAREN "("
|
|
R_PAREN ")"
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::Type,
|
|
"$$$",
|
|
expect![[r#"
|
|
ERROR
|
|
ERROR
|
|
DOLLAR "$"
|
|
DOLLAR "$"
|
|
DOLLAR "$"
|
|
error 0: expected type
|
|
"#]],
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn expr() {
|
|
check(
|
|
TopEntryPoint::Expr,
|
|
"",
|
|
expect![[r#"
|
|
ERROR
|
|
error 0: expected expression
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::Expr,
|
|
"2 + 2 == 5",
|
|
expect![[r#"
|
|
BIN_EXPR
|
|
BIN_EXPR
|
|
LITERAL
|
|
INT_NUMBER "2"
|
|
WHITESPACE " "
|
|
PLUS "+"
|
|
WHITESPACE " "
|
|
LITERAL
|
|
INT_NUMBER "2"
|
|
WHITESPACE " "
|
|
EQ2 "=="
|
|
WHITESPACE " "
|
|
LITERAL
|
|
INT_NUMBER "5"
|
|
"#]],
|
|
);
|
|
check(
|
|
TopEntryPoint::Expr,
|
|
"let _ = 0;",
|
|
expect![[r#"
|
|
ERROR
|
|
LET_EXPR
|
|
LET_KW "let"
|
|
WHITESPACE " "
|
|
WILDCARD_PAT
|
|
UNDERSCORE "_"
|
|
WHITESPACE " "
|
|
EQ "="
|
|
WHITESPACE " "
|
|
LITERAL
|
|
INT_NUMBER "0"
|
|
SEMICOLON ";"
|
|
"#]],
|
|
);
|
|
}
|
|
|
|
#[track_caller]
|
|
fn check(entry: TopEntryPoint, input: &str, expect: expect_test::Expect) {
|
|
let (parsed, _errors) = super::parse(entry, input, crate::Edition::CURRENT);
|
|
expect.assert_eq(&parsed)
|
|
}
|