Merge branch 'master' of https://github.com/LDSpits/rust-analyzer into feature/workspace-directory

This commit is contained in:
Lucas Spits 2019-03-11 20:41:48 +01:00
commit de4ad44282
No known key found for this signature in database
GPG Key ID: AE25DF7B645AA2B0
14 changed files with 175 additions and 70 deletions

55
.vscode/tasks.json vendored
View File

@ -10,7 +10,10 @@
"problemMatcher": { "problemMatcher": {
"owner": "typescript", "owner": "typescript",
"pattern": "$tsc", "pattern": "$tsc",
"fileLocation": ["relative", "${workspaceRoot}/editors/code"] "fileLocation": [
"relative",
"${workspaceRoot}/editors/code"
]
}, },
"path": "editors/code/" "path": "editors/code/"
}, },
@ -18,30 +21,40 @@
"label": "Build Lsp", "label": "Build Lsp",
"type": "shell", "type": "shell",
"command": "cargo build", "command": "cargo build",
"problemMatcher": { "problemMatcher": "$rustc"
"owner": "rust",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": [
{
"regexp": "^(warning|warn|error)(?:\\[(.*?)\\])?: (.*)$",
"severity": 1,
"code": 2,
"message": 3
},
{
"regexp": "^[\\s->=]*(.*?):(\\d*):(\\d*)\\s*$",
"file": 1,
"line": 2,
"column": 3
}
]
}
}, },
{ {
"label": "Build All", "label": "Build All",
"group": "build", "group": "build",
"dependsOn": ["Build Extension", "Build Lsp"], "dependsOn": [
"Build Extension",
"Build Lsp"
],
"problemMatcher": [] "problemMatcher": []
},
{
"label": "cargo watch",
"group": "build",
"isBackground": true,
"type": "shell",
"command": "cargo",
"args": [
"watch"
],
"problemMatcher": "$rustc-watch"
},
{
"label": "cargo watch tests",
"group": "build",
"isBackground": true,
"type": "shell",
"command": "cargo",
"args": [
"watch",
"-x",
"check --tests"
],
"problemMatcher": "$rustc-watch"
} }
] ]
} }

View File

@ -550,7 +550,7 @@ The Some variant
fn test_hover_infer_associated_method_result() { fn test_hover_infer_associated_method_result() {
let (analysis, position) = single_file_with_position( let (analysis, position) = single_file_with_position(
" "
struct Thing { x: u32 }; struct Thing { x: u32 }
impl Thing { impl Thing {
fn new() -> Thing { fn new() -> Thing {
@ -616,7 +616,7 @@ The Some variant
fn test_hover_self() { fn test_hover_self() {
let (analysis, position) = single_file_with_position( let (analysis, position) = single_file_with_position(
" "
struct Thing { x: u32 }; struct Thing { x: u32 }
impl Thing { impl Thing {
fn new() -> Self { fn new() -> Self {
Self<|> { x: 0 } Self<|> { x: 0 }
@ -630,7 +630,7 @@ The Some variant
let (analysis, position) = single_file_with_position( let (analysis, position) = single_file_with_position(
" "
struct Thing { x: u32 }; struct Thing { x: u32 }
impl Thing { impl Thing {
fn new() -> Self<|> { fn new() -> Self<|> {
Self { x: 0 } Self { x: 0 }
@ -644,7 +644,7 @@ The Some variant
let (analysis, position) = single_file_with_position( let (analysis, position) = single_file_with_position(
" "
enum Thing { A }; enum Thing { A }
impl Thing { impl Thing {
pub fn new() -> Self<|> { pub fn new() -> Self<|> {
Thing::A Thing::A
@ -658,7 +658,7 @@ The Some variant
let (analysis, position) = single_file_with_position( let (analysis, position) = single_file_with_position(
" "
enum Thing { A }; enum Thing { A }
impl Thing { impl Thing {
pub fn thing(a: Self<|>) { pub fn thing(a: Self<|>) {
} }

View File

@ -1,39 +1,61 @@
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
/// Client provided initialization options /// Client provided initialization options
#[derive(Deserialize, Clone, Copy, Debug)] #[derive(Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase", default)]
pub struct InitializationOptions { pub struct InitializationOptions {
/// Whether the client supports our custom highlighting publishing decorations. /// Whether the client supports our custom highlighting publishing decorations.
/// This is different to the highlightingOn setting, which is whether the user /// This is different to the highlightingOn setting, which is whether the user
/// wants our custom highlighting to be used. /// wants our custom highlighting to be used.
/// ///
/// Defaults to `true` /// Defaults to `false`
#[serde(default = "bool_true", deserialize_with = "nullable_bool_true")] #[serde(deserialize_with = "nullable_bool_false")]
pub publish_decorations: bool, pub publish_decorations: bool,
/// Whether or not the workspace loaded notification should be sent /// Whether or not the workspace loaded notification should be sent
/// ///
/// Defaults to `true` /// Defaults to `true`
#[serde(default = "bool_true", deserialize_with = "nullable_bool_true")] #[serde(deserialize_with = "nullable_bool_true")]
pub show_workspace_loaded: bool, pub show_workspace_loaded: bool,
} }
impl Default for InitializationOptions { impl Default for InitializationOptions {
fn default() -> InitializationOptions { fn default() -> InitializationOptions {
InitializationOptions { publish_decorations: true, show_workspace_loaded: true } InitializationOptions { publish_decorations: false, show_workspace_loaded: true }
} }
} }
fn bool_true() -> bool { /// Deserializes a null value to a bool false by default
true fn nullable_bool_false<'de, D>(deserializer: D) -> Result<bool, D::Error>
} where
D: Deserializer<'de>,
/// Deserializes a null value to a bool true by default {
fn nullable_bool_true<'de, D>(deserializer: D) -> Result<bool, D::Error> let opt = Option::deserialize(deserializer)?;
where Ok(opt.unwrap_or(false))
D: Deserializer<'de>, }
{
let opt = Option::deserialize(deserializer)?; /// Deserializes a null value to a bool true by default
Ok(opt.unwrap_or(true)) fn nullable_bool_true<'de, D>(deserializer: D) -> Result<bool, D::Error>
} where
D: Deserializer<'de>,
{
let opt = Option::deserialize(deserializer)?;
Ok(opt.unwrap_or(true))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn deserialize_init_options_defaults() {
// check that null == default for both fields
let default = InitializationOptions::default();
assert_eq!(default, serde_json::from_str(r#"{}"#).unwrap());
assert_eq!(
default,
serde_json::from_str(r#"{"publishDecorations":null, "showWorkspaceLoaded":null}"#)
.unwrap()
);
}
}

View File

@ -93,6 +93,11 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
} }
} }
ASYNC_KW if la == L_CURLY => {
let m = p.start();
p.bump();
block_expr(p, Some(m))
}
MATCH_KW => match_expr(p), MATCH_KW => match_expr(p),
UNSAFE_KW if la == L_CURLY => { UNSAFE_KW if la == L_CURLY => {
let m = p.start(); let m = p.start();

View File

@ -86,9 +86,15 @@ pub(super) fn maybe_item(p: &mut Parser, flavor: ItemFlavor) -> MaybeItem {
} }
let mut has_mods = false; let mut has_mods = false;
// modifiers
has_mods |= p.eat(CONST_KW);
// modifiers
// test_err async_without_semicolon
// fn foo() { let _ = async {} }
has_mods |= p.eat(CONST_KW);
if p.at(ASYNC_KW) && p.nth(1) != L_CURLY {
p.eat(ASYNC_KW);
has_mods = true;
}
// test_err unsafe_block_in_mod // test_err unsafe_block_in_mod
// fn foo(){} unsafe { } fn bar(){} // fn foo(){} unsafe { } fn bar(){}
if p.at(UNSAFE_KW) && p.nth(1) != L_CURLY { if p.at(UNSAFE_KW) && p.nth(1) != L_CURLY {
@ -110,6 +116,9 @@ pub(super) fn maybe_item(p: &mut Parser, flavor: ItemFlavor) -> MaybeItem {
// items // items
let kind = match p.current() { let kind = match p.current() {
// test async_fn
// async fn foo() {}
// test extern_fn // test extern_fn
// extern fn foo() {} // extern fn foo() {}

View File

@ -66,6 +66,7 @@ pub enum SyntaxKind {
SHR, SHR,
SHLEQ, SHLEQ,
SHREQ, SHREQ,
ASYNC_KW,
USE_KW, USE_KW,
FN_KW, FN_KW,
STRUCT_KW, STRUCT_KW,
@ -233,6 +234,7 @@ use self::SyntaxKind::*;
impl SyntaxKind { impl SyntaxKind {
pub fn is_keyword(self) -> bool { pub fn is_keyword(self) -> bool {
match self { match self {
| ASYNC_KW
| USE_KW | USE_KW
| FN_KW | FN_KW
| STRUCT_KW | STRUCT_KW
@ -403,6 +405,7 @@ impl SyntaxKind {
SHR => &SyntaxInfo { name: "SHR" }, SHR => &SyntaxInfo { name: "SHR" },
SHLEQ => &SyntaxInfo { name: "SHLEQ" }, SHLEQ => &SyntaxInfo { name: "SHLEQ" },
SHREQ => &SyntaxInfo { name: "SHREQ" }, SHREQ => &SyntaxInfo { name: "SHREQ" },
ASYNC_KW => &SyntaxInfo { name: "ASYNC_KW" },
USE_KW => &SyntaxInfo { name: "USE_KW" }, USE_KW => &SyntaxInfo { name: "USE_KW" },
FN_KW => &SyntaxInfo { name: "FN_KW" }, FN_KW => &SyntaxInfo { name: "FN_KW" },
STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" }, STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" },
@ -570,6 +573,7 @@ impl SyntaxKind {
} }
pub fn from_keyword(ident: &str) -> Option<SyntaxKind> { pub fn from_keyword(ident: &str) -> Option<SyntaxKind> {
let kw = match ident { let kw = match ident {
"async" => ASYNC_KW,
"use" => USE_KW, "use" => USE_KW,
"fn" => FN_KW, "fn" => FN_KW,
"struct" => STRUCT_KW, "struct" => STRUCT_KW,

View File

@ -59,6 +59,7 @@ Grammar(
[">>=", "SHREQ"], [">>=", "SHREQ"],
], ],
keywords: [ keywords: [
"async",
"use", "use",
"fn", "fn",
"struct", "struct",

View File

@ -1,3 +1,3 @@
fn use struct trait enum impl true false as extern crate async fn use struct trait enum impl true false as extern crate
mod pub self super in where for loop while if match const mod pub self super in where for loop while if match const
static mut type ref let else move return static mut type ref let else move return

View File

@ -1,3 +1,5 @@
ASYNC_KW 5 "async"
WHITESPACE 1 " "
FN_KW 2 "fn" FN_KW 2 "fn"
WHITESPACE 1 " " WHITESPACE 1 " "
USE_KW 3 "use" USE_KW 3 "use"

View File

@ -0,0 +1 @@
fn foo() { let _ = async {} }

View File

@ -0,0 +1,31 @@
SOURCE_FILE@[0; 30)
FN_DEF@[0; 29)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 29)
L_CURLY@[9; 10)
WHITESPACE@[10; 11)
LET_STMT@[11; 27)
LET_KW@[11; 14)
WHITESPACE@[14; 15)
PLACEHOLDER_PAT@[15; 16)
UNDERSCORE@[15; 16)
WHITESPACE@[16; 17)
EQ@[17; 18)
WHITESPACE@[18; 19)
BLOCK_EXPR@[19; 27)
ASYNC_KW@[19; 24)
WHITESPACE@[24; 25)
BLOCK@[25; 27)
L_CURLY@[25; 26)
R_CURLY@[26; 27)
err: `expected SEMI`
WHITESPACE@[27; 28)
R_CURLY@[28; 29)
WHITESPACE@[29; 30)

View File

@ -0,0 +1 @@
async fn foo() {}

View File

@ -0,0 +1,16 @@
SOURCE_FILE@[0; 18)
FN_DEF@[0; 17)
ASYNC_KW@[0; 5)
WHITESPACE@[5; 6)
FN_KW@[6; 8)
WHITESPACE@[8; 9)
NAME@[9; 12)
IDENT@[9; 12) "foo"
PARAM_LIST@[12; 14)
L_PAREN@[12; 13)
R_PAREN@[13; 14)
WHITESPACE@[14; 15)
BLOCK@[15; 17)
L_CURLY@[15; 16)
R_CURLY@[16; 17)
WHITESPACE@[17; 18)

View File

@ -215,8 +215,8 @@
"${workspaceRoot}" "${workspaceRoot}"
], ],
"background": { "background": {
"beginsPattern": "^\\[Running ", "beginsPattern": "^\\[Running\\b",
"endsPattern": "^(\\[Finished running\\]|To learn more, run the command again with --verbose\\.)$" "endsPattern": "^\\[Finished running\\b"
}, },
"pattern": "$rustc" "pattern": "$rustc"
} }