diff --git a/Cargo.lock b/Cargo.lock index 949a58e86e..c445439b10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -679,7 +679,6 @@ version = "0.1.0" dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "ra_arena 0.1.0", - "ra_editor 0.1.0", "ra_syntax 0.1.0", "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -712,7 +711,6 @@ dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "ra_arena 0.1.0", "ra_db 0.1.0", - "ra_editor 0.1.0", "ra_syntax 0.1.0", "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -736,7 +734,6 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "ra_analysis 0.1.0", - "ra_editor 0.1.0", "ra_syntax 0.1.0", "ra_text_edit 0.1.0", "ra_vfs 0.1.0", diff --git a/crates/ra_analysis/src/call_info.rs b/crates/ra_analysis/src/call_info.rs index 1dac955843..27b760780c 100644 --- a/crates/ra_analysis/src/call_info.rs +++ b/crates/ra_analysis/src/call_info.rs @@ -5,8 +5,8 @@ use ra_syntax::{ AstNode, SyntaxNode, TextUnit, TextRange, SyntaxKind::FN_DEF, ast::{self, ArgListOwner, DocCommentsOwner}, + algo::find_node_at_offset, }; -use ra_editor::find_node_at_offset; use crate::{FilePosition, CallInfo, db::RootDatabase}; diff --git a/crates/ra_analysis/src/completion/completion_context.rs b/crates/ra_analysis/src/completion/completion_context.rs index 988c21c58d..01786bb69e 100644 --- a/crates/ra_analysis/src/completion/completion_context.rs +++ b/crates/ra_analysis/src/completion/completion_context.rs @@ -1,9 +1,8 @@ -use ra_editor::find_node_at_offset; use ra_text_edit::AtomTextEdit; use ra_syntax::{ AstNode, SyntaxNode, SourceFile, TextUnit, TextRange, ast, - algo::{find_leaf_at_offset, find_covering_node}, + algo::{find_leaf_at_offset, find_covering_node, find_node_at_offset}, SyntaxKind::*, }; use hir::source_binder; diff --git a/crates/ra_analysis/src/db.rs b/crates/ra_analysis/src/db.rs index 1709be5cf4..9d46609ecf 100644 --- a/crates/ra_analysis/src/db.rs +++ b/crates/ra_analysis/src/db.rs @@ -1,10 +1,9 @@ use std::{fmt, sync::Arc}; -use salsa::{self, Database}; -use ra_db::{LocationIntener, BaseDatabase}; -use crate::{ - symbol_index, -}; +use salsa::{self, Database}; +use ra_db::{LocationIntener, BaseDatabase, FileId}; + +use crate::{symbol_index, LineIndex}; #[derive(Debug)] pub(crate) struct RootDatabase { @@ -71,6 +70,19 @@ impl AsRef> for RootDatabas } } +salsa::query_group! { + pub(crate) trait LineIndexDatabase: ra_db::FilesDatabase + BaseDatabase { + fn line_index(file_id: FileId) -> Arc { + type LineIndexQuery; + } + } +} + +fn line_index(db: &impl ra_db::FilesDatabase, file_id: FileId) -> Arc { + let text = db.file_text(file_id); + Arc::new(LineIndex::new(&*text)) +} + salsa::database_storage! { pub(crate) struct RootDatabaseStorage for RootDatabase { impl ra_db::FilesDatabase { @@ -84,7 +96,9 @@ salsa::database_storage! { } impl ra_db::SyntaxDatabase { fn source_file() for ra_db::SourceFileQuery; - fn file_lines() for ra_db::FileLinesQuery; + } + impl LineIndexDatabase { + fn line_index() for LineIndexQuery; } impl symbol_index::SymbolsDatabase { fn file_symbols() for symbol_index::FileSymbolsQuery; diff --git a/crates/ra_analysis/src/goto_defenition.rs b/crates/ra_analysis/src/goto_defenition.rs index 0bcf13ebde..fcd8d315e2 100644 --- a/crates/ra_analysis/src/goto_defenition.rs +++ b/crates/ra_analysis/src/goto_defenition.rs @@ -1,7 +1,8 @@ use ra_db::{FileId, Cancelable, SyntaxDatabase}; -use ra_syntax::{TextRange, AstNode, ast, SyntaxKind::{NAME, MODULE}}; - -use ra_editor::find_node_at_offset; +use ra_syntax::{ + TextRange, AstNode, ast, SyntaxKind::{NAME, MODULE}, + algo::find_node_at_offset, +}; use crate::{FilePosition, NavigationTarget, db::RootDatabase}; diff --git a/crates/ra_analysis/src/hover.rs b/crates/ra_analysis/src/hover.rs index 5607c3ef31..475524ee18 100644 --- a/crates/ra_analysis/src/hover.rs +++ b/crates/ra_analysis/src/hover.rs @@ -1,9 +1,8 @@ use ra_db::{Cancelable, SyntaxDatabase}; -use ra_editor::find_node_at_offset; use ra_syntax::{ AstNode, SyntaxNode, TreePtr, ast::{self, NameOwner}, - algo::{find_covering_node, find_leaf_at_offset, visit::{visitor, Visitor}}, + algo::{find_covering_node, find_node_at_offset, find_leaf_at_offset, visit::{visitor, Visitor}}, }; use crate::{db::RootDatabase, RangeInfo, FilePosition, FileRange, NavigationTarget}; diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index b3f75fdbeb..2b9963b3c2 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs @@ -6,10 +6,11 @@ use hir::{ self, Problem, source_binder, }; use ra_db::{FilesDatabase, SourceRoot, SourceRootId, SyntaxDatabase}; -use ra_editor::{self, find_node_at_offset, assists, LocalEdit, Severity}; +use ra_editor::{self, assists, LocalEdit, Severity}; use ra_syntax::{ TextRange, AstNode, SourceFile, ast::{self, NameOwner}, + algo::find_node_at_offset, SyntaxKind::*, }; diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index 771a349c8c..48df08416b 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs @@ -29,22 +29,27 @@ use std::{fmt, sync::Arc}; use ra_syntax::{SmolStr, SourceFile, TreePtr, SyntaxKind, TextRange, TextUnit}; use ra_text_edit::TextEdit; +use ra_db::{SyntaxDatabase, FilesDatabase, LocalSyntaxPtr}; use rayon::prelude::*; use relative_path::RelativePathBuf; use rustc_hash::FxHashMap; use salsa::ParallelDatabase; -use crate::symbol_index::{FileSymbol, SymbolIndex}; +use crate::{ + symbol_index::{FileSymbol, SymbolIndex}, + db::LineIndexDatabase, +}; pub use crate::{ completion::{CompletionItem, CompletionItemKind, InsertText}, runnables::{Runnable, RunnableKind}, }; -pub use ra_editor::{Fold, FoldKind, HighlightedRange, LineIndex, Severity, StructureNode}; - +pub use ra_editor::{ + Fold, FoldKind, HighlightedRange, Severity, StructureNode, + LineIndex, LineCol, translate_offset_with_edit, +}; pub use ra_db::{ - Cancelable, Canceled, CrateGraph, CrateId, FileId, FilePosition, FileRange, FilesDatabase, - LocalSyntaxPtr, SourceRootId, SyntaxDatabase, + Cancelable, Canceled, CrateGraph, CrateId, FileId, FilePosition, FileRange, SourceRootId }; #[derive(Default)] @@ -322,7 +327,7 @@ impl Analysis { /// Gets the file's `LineIndex`: data structure to convert between absolute /// offsets and line/column representation. pub fn file_line_index(&self, file_id: FileId) -> Arc { - self.db.file_lines(file_id) + self.db.line_index(file_id) } /// Selects the next syntactic nodes encopasing the range. pub fn extend_selection(&self, frange: FileRange) -> TextRange { diff --git a/crates/ra_db/Cargo.toml b/crates/ra_db/Cargo.toml index c43e650517..2c1f94ad07 100644 --- a/crates/ra_db/Cargo.toml +++ b/crates/ra_db/Cargo.toml @@ -11,5 +11,4 @@ rustc-hash = "1.0" parking_lot = "0.7.0" ra_arena = { path = "../ra_arena" } ra_syntax = { path = "../ra_syntax" } -ra_editor = { path = "../ra_editor" } test_utils = { path = "../test_utils" } diff --git a/crates/ra_db/src/lib.rs b/crates/ra_db/src/lib.rs index 732899718c..f56f70983a 100644 --- a/crates/ra_db/src/lib.rs +++ b/crates/ra_db/src/lib.rs @@ -5,9 +5,6 @@ mod input; mod loc2id; pub mod mock; -use std::sync::Arc; - -use ra_editor::LineIndex; use ra_syntax::{TextUnit, TextRange, SourceFile, TreePtr}; pub use crate::{ @@ -36,9 +33,6 @@ salsa::query_group! { fn source_file(file_id: FileId) -> TreePtr { type SourceFileQuery; } - fn file_lines(file_id: FileId) -> Arc { - type FileLinesQuery; - } } } @@ -46,10 +40,6 @@ fn source_file(db: &impl SyntaxDatabase, file_id: FileId) -> TreePtr let text = db.file_text(file_id); SourceFile::parse(&*text) } -fn file_lines(db: &impl SyntaxDatabase, file_id: FileId) -> Arc { - let text = db.file_text(file_id); - Arc::new(LineIndex::new(&*text)) -} #[derive(Clone, Copy, Debug)] pub struct FilePosition { diff --git a/crates/ra_editor/src/assists.rs b/crates/ra_editor/src/assists.rs index f839f6a7ab..83eabfc859 100644 --- a/crates/ra_editor/src/assists.rs +++ b/crates/ra_editor/src/assists.rs @@ -14,13 +14,11 @@ mod replace_if_let_with_match; use ra_text_edit::{TextEdit, TextEditBuilder}; use ra_syntax::{ Direction, SyntaxNode, TextUnit, TextRange, SourceFile, AstNode, - algo::{find_leaf_at_offset, find_covering_node, LeafAtOffset}, + algo::{find_leaf_at_offset, find_node_at_offset, find_covering_node, LeafAtOffset}, ast::{self, AstToken}, }; use itertools::Itertools; -use crate::find_node_at_offset; - pub use self::{ flip_comma::flip_comma, add_derive::add_derive, diff --git a/crates/ra_editor/src/lib.rs b/crates/ra_editor/src/lib.rs index 6731260a31..5a6af19b7c 100644 --- a/crates/ra_editor/src/lib.rs +++ b/crates/ra_editor/src/lib.rs @@ -120,10 +120,6 @@ pub fn syntax_tree(file: &SourceFile) -> String { ::ra_syntax::utils::dump_tree(file.syntax()) } -pub fn find_node_at_offset(syntax: &SyntaxNode, offset: TextUnit) -> Option<&N> { - find_leaf_at_offset(syntax, offset).find_map(|leaf| leaf.ancestors().find_map(N::cast)) -} - #[cfg(test)] mod tests { use ra_syntax::AstNode; diff --git a/crates/ra_editor/src/typing.rs b/crates/ra_editor/src/typing.rs index 5b260d2ac7..576caf6bec 100644 --- a/crates/ra_editor/src/typing.rs +++ b/crates/ra_editor/src/typing.rs @@ -2,7 +2,7 @@ use std::mem; use itertools::Itertools; use ra_syntax::{ - algo::{find_covering_node, find_leaf_at_offset, LeafAtOffset}, + algo::{find_node_at_offset, find_covering_node, find_leaf_at_offset, LeafAtOffset}, ast, text_utils::intersect, AstNode, Direction, SourceFile, SyntaxKind, @@ -11,7 +11,7 @@ use ra_syntax::{ }; use ra_text_edit::text_utils::contains_offset_nonstrict; -use crate::{find_node_at_offset, LocalEdit, TextEditBuilder}; +use crate::{LocalEdit, TextEditBuilder}; pub fn join_lines(file: &SourceFile, range: TextRange) -> LocalEdit { let range = if range.is_empty() { diff --git a/crates/ra_hir/Cargo.toml b/crates/ra_hir/Cargo.toml index 245a21ce37..5a8fdbfc68 100644 --- a/crates/ra_hir/Cargo.toml +++ b/crates/ra_hir/Cargo.toml @@ -14,7 +14,6 @@ parking_lot = "0.7.0" ena = "0.11" ra_syntax = { path = "../ra_syntax" } ra_arena = { path = "../ra_arena" } -ra_editor = { path = "../ra_editor" } ra_db = { path = "../ra_db" } test_utils = { path = "../test_utils" } diff --git a/crates/ra_hir/src/code_model_impl/function/scope.rs b/crates/ra_hir/src/code_model_impl/function/scope.rs index 699784f71f..ebf6edc1ba 100644 --- a/crates/ra_hir/src/code_model_impl/function/scope.rs +++ b/crates/ra_hir/src/code_model_impl/function/scope.rs @@ -308,8 +308,7 @@ pub struct ReferenceDescriptor { #[cfg(test)] mod tests { - use ra_editor::find_node_at_offset; - use ra_syntax::SourceFile; + use ra_syntax::{SourceFile, algo::find_node_at_offset}; use test_utils::{extract_offset, assert_eq_text}; use crate::expr; diff --git a/crates/ra_hir/src/mock.rs b/crates/ra_hir/src/mock.rs index c9af38009d..0fae7de82a 100644 --- a/crates/ra_hir/src/mock.rs +++ b/crates/ra_hir/src/mock.rs @@ -215,7 +215,6 @@ salsa::database_storage! { } impl ra_db::SyntaxDatabase { fn source_file() for ra_db::SourceFileQuery; - fn file_lines() for ra_db::FileLinesQuery; } impl db::HirDatabase { fn hir_source_file() for db::HirSourceFileQuery; diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 59a8037618..4b0400cd08 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -6,10 +6,10 @@ /// So, this modules should not be used during hir construction, it exists /// purely for "IDE needs". use ra_db::{FileId, FilePosition, Cancelable}; -use ra_editor::find_node_at_offset; use ra_syntax::{ SmolStr, TextRange, SyntaxNode, ast::{self, AstNode, NameOwner}, + algo::find_node_at_offset, }; use crate::{ diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index 8adeedddb3..90ba393ce9 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs @@ -1049,6 +1049,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { } pub fn infer(db: &impl HirDatabase, def_id: DefId) -> Cancelable> { + db.check_canceled()?; let function = Function::new(def_id); // TODO: consts also need inference let body = function.body(db)?; let scopes = db.fn_scopes(def_id)?; diff --git a/crates/ra_lsp_server/Cargo.toml b/crates/ra_lsp_server/Cargo.toml index 8bd4caa53d..b9fd61105c 100644 --- a/crates/ra_lsp_server/Cargo.toml +++ b/crates/ra_lsp_server/Cargo.toml @@ -28,7 +28,6 @@ parking_lot = "0.7.0" thread_worker = { path = "../thread_worker" } ra_syntax = { path = "../ra_syntax" } -ra_editor = { path = "../ra_editor" } ra_text_edit = { path = "../ra_text_edit" } ra_analysis = { path = "../ra_analysis" } gen_lsp_server = { path = "../gen_lsp_server" } diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs index e8eb3940f9..b3f8c83ccd 100644 --- a/crates/ra_lsp_server/src/conv.rs +++ b/crates/ra_lsp_server/src/conv.rs @@ -7,8 +7,8 @@ use languageserver_types::{ use ra_analysis::{ CompletionItem, CompletionItemKind, FileId, FilePosition, FileRange, FileSystemEdit, InsertText, NavigationTarget, SourceChange, SourceFileEdit, + LineCol, LineIndex, translate_offset_with_edit }; -use ra_editor::{translate_offset_with_edit, LineCol, LineIndex}; use ra_syntax::{SyntaxKind, TextRange, TextUnit}; use ra_text_edit::{AtomTextEdit, TextEdit}; diff --git a/crates/ra_syntax/src/algo.rs b/crates/ra_syntax/src/algo.rs index 13f50d2ef8..45747e21d4 100644 --- a/crates/ra_syntax/src/algo.rs +++ b/crates/ra_syntax/src/algo.rs @@ -2,7 +2,7 @@ pub mod visit; use rowan::TransparentNewType; -use crate::{SyntaxNode, TextRange, TextUnit}; +use crate::{SyntaxNode, TextRange, TextUnit, AstNode}; pub use rowan::LeafAtOffset; @@ -16,6 +16,19 @@ pub fn find_leaf_at_offset(node: &SyntaxNode, offset: TextUnit) -> LeafAtOffset< } } +/// Finds a node of specific Ast type at offset. Note that this is slightly +/// impercise: if the cursor is strictly betwen two nodes of the desired type, +/// as in +/// +/// ```no-run +/// struct Foo {}|struct Bar; +/// ``` +/// +/// then the left node will be silently prefered. +pub fn find_node_at_offset(syntax: &SyntaxNode, offset: TextUnit) -> Option<&N> { + find_leaf_at_offset(syntax, offset).find_map(|leaf| leaf.ancestors().find_map(N::cast)) +} + pub fn find_covering_node(root: &SyntaxNode, range: TextRange) -> &SyntaxNode { SyntaxNode::from_repr(root.0.covering_node(range)) }