aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_analysis/src/lib.rs')
-rw-r--r--crates/ra_analysis/src/lib.rs99
1 files changed, 65 insertions, 34 deletions
diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs
index 7078e2d31..a67cac21e 100644
--- a/crates/ra_analysis/src/lib.rs
+++ b/crates/ra_analysis/src/lib.rs
@@ -6,23 +6,30 @@ extern crate relative_path;
6extern crate rustc_hash; 6extern crate rustc_hash;
7extern crate salsa; 7extern crate salsa;
8 8
9mod input;
9mod db; 10mod db;
10mod descriptors; 11mod descriptors;
11mod imp; 12mod imp;
12mod roots;
13mod symbol_index; 13mod symbol_index;
14mod completion; 14mod completion;
15 15
16use std::{fmt::Debug, sync::Arc}; 16use std::{
17 fmt,
18 sync::Arc,
19};
17 20
18use ra_syntax::{AtomEdit, File, TextRange, TextUnit}; 21use ra_syntax::{AtomEdit, File, TextRange, TextUnit};
19use relative_path::{RelativePath, RelativePathBuf}; 22use relative_path::RelativePathBuf;
20use rustc_hash::FxHashMap; 23use rayon::prelude::*;
21 24
22use crate::imp::{AnalysisHostImpl, AnalysisImpl, FileResolverImp}; 25use crate::{
26 imp::{AnalysisHostImpl, AnalysisImpl, FileResolverImp},
27 symbol_index::SymbolIndex,
28};
23 29
24pub use crate::{ 30pub use crate::{
25 descriptors::FnDescriptor, 31 descriptors::FnDescriptor,
32 input::{FileId, FileResolver, CrateGraph, CrateId}
26}; 33};
27pub use ra_editor::{ 34pub use ra_editor::{
28 CompletionItem, FileSymbol, Fold, FoldKind, HighlightedRange, LineIndex, Runnable, 35 CompletionItem, FileSymbol, Fold, FoldKind, HighlightedRange, LineIndex, Runnable,
@@ -43,20 +50,52 @@ impl std::fmt::Display for Canceled {
43impl std::error::Error for Canceled { 50impl std::error::Error for Canceled {
44} 51}
45 52
46#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] 53#[derive(Default)]
47pub struct FileId(pub u32); 54pub struct AnalysisChange {
48 55 files_added: Vec<(FileId, String)>,
49#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] 56 files_changed: Vec<(FileId, String)>,
50pub struct CrateId(pub u32); 57 files_removed: Vec<(FileId)>,
58 libraries_added: Vec<LibraryData>,
59 crate_graph: Option<CrateGraph>,
60 file_resolver: Option<FileResolverImp>,
61}
51 62
52#[derive(Debug, Clone, Default)] 63impl fmt::Debug for AnalysisChange {
53pub struct CrateGraph { 64 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
54 pub crate_roots: FxHashMap<CrateId, FileId>, 65 fmt.debug_struct("AnalysisChange")
66 .field("files_added", &self.files_added.len())
67 .field("files_changed", &self.files_changed.len())
68 .field("files_removed", &self.files_removed.len())
69 .field("libraries_added", &self.libraries_added.len())
70 .field("crate_graph", &self.crate_graph)
71 .field("file_resolver", &self.file_resolver)
72 .finish()
73 }
55} 74}
56 75
57pub trait FileResolver: Debug + Send + Sync + 'static { 76
58 fn file_stem(&self, file_id: FileId) -> String; 77impl AnalysisChange {
59 fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option<FileId>; 78 pub fn new() -> AnalysisChange {
79 AnalysisChange::default()
80 }
81 pub fn add_file(&mut self, file_id: FileId, text: String) {
82 self.files_added.push((file_id, text))
83 }
84 pub fn change_file(&mut self, file_id: FileId, new_text: String) {
85 self.files_changed.push((file_id, new_text))
86 }
87 pub fn remove_file(&mut self, file_id: FileId) {
88 self.files_removed.push(file_id)
89 }
90 pub fn add_library(&mut self, data: LibraryData) {
91 self.libraries_added.push(data)
92 }
93 pub fn set_crate_graph(&mut self, graph: CrateGraph) {
94 self.crate_graph = Some(graph);
95 }
96 pub fn set_file_resolver(&mut self, file_resolver: Arc<FileResolver>) {
97 self.file_resolver = Some(FileResolverImp::new(file_resolver));
98 }
60} 99}
61 100
62#[derive(Debug)] 101#[derive(Debug)]
@@ -75,20 +114,8 @@ impl AnalysisHost {
75 imp: self.imp.analysis(), 114 imp: self.imp.analysis(),
76 } 115 }
77 } 116 }
78 pub fn change_file(&mut self, file_id: FileId, text: Option<String>) { 117 pub fn apply_change(&mut self, change: AnalysisChange) {
79 self.change_files(::std::iter::once((file_id, text))); 118 self.imp.apply_change(change)
80 }
81 pub fn change_files(&mut self, mut changes: impl Iterator<Item = (FileId, Option<String>)>) {
82 self.imp.change_files(&mut changes)
83 }
84 pub fn set_file_resolver(&mut self, resolver: Arc<FileResolver>) {
85 self.imp.set_file_resolver(FileResolverImp::new(resolver));
86 }
87 pub fn set_crate_graph(&mut self, graph: CrateGraph) {
88 self.imp.set_crate_graph(graph)
89 }
90 pub fn add_library(&mut self, data: LibraryData) {
91 self.imp.add_library(data.root)
92 } 119 }
93} 120}
94 121
@@ -266,14 +293,18 @@ impl Analysis {
266 293
267#[derive(Debug)] 294#[derive(Debug)]
268pub struct LibraryData { 295pub struct LibraryData {
269 root: roots::ReadonlySourceRoot, 296 files: Vec<(FileId, String)>,
297 file_resolver: FileResolverImp,
298 symbol_index: SymbolIndex,
270} 299}
271 300
272impl LibraryData { 301impl LibraryData {
273 pub fn prepare(files: Vec<(FileId, String)>, file_resolver: Arc<FileResolver>) -> LibraryData { 302 pub fn prepare(files: Vec<(FileId, String)>, file_resolver: Arc<FileResolver>) -> LibraryData {
274 let file_resolver = FileResolverImp::new(file_resolver); 303 let symbol_index = SymbolIndex::for_files(files.par_iter().map(|(file_id, text)| {
275 let root = roots::ReadonlySourceRoot::new(files, file_resolver); 304 let file = File::parse(text);
276 LibraryData { root } 305 (*file_id, file)
306 }));
307 LibraryData { files, file_resolver: FileResolverImp::new(file_resolver), symbol_index }
277 } 308 }
278} 309}
279 310