edits use source-root API
This commit is contained in:
parent
0063f03e86
commit
b5b44659a4
@ -368,10 +368,11 @@ impl AnalysisImpl {
|
||||
.collect::<Vec<_>>();
|
||||
if let Some(m) = source_binder::module_from_file_id(&*self.db, file_id)? {
|
||||
for (name_node, problem) in m.problems(&*self.db) {
|
||||
let source_root = self.db.file_source_root(file_id);
|
||||
let diag = match problem {
|
||||
Problem::UnresolvedModule { candidate } => {
|
||||
let create_file = FileSystemEdit::CreateFile {
|
||||
anchor: file_id,
|
||||
source_root,
|
||||
path: candidate.clone(),
|
||||
};
|
||||
let fix = SourceChange {
|
||||
@ -388,11 +389,12 @@ impl AnalysisImpl {
|
||||
}
|
||||
Problem::NotDirOwner { move_to, candidate } => {
|
||||
let move_file = FileSystemEdit::MoveFile {
|
||||
file: file_id,
|
||||
path: move_to.clone(),
|
||||
src: file_id,
|
||||
dst_source_root: source_root,
|
||||
dst_path: move_to.clone(),
|
||||
};
|
||||
let create_file = FileSystemEdit::CreateFile {
|
||||
anchor: file_id,
|
||||
source_root,
|
||||
path: move_to.join(candidate),
|
||||
};
|
||||
let fix = SourceChange {
|
||||
|
@ -173,12 +173,13 @@ pub struct SourceFileEdit {
|
||||
#[derive(Debug)]
|
||||
pub enum FileSystemEdit {
|
||||
CreateFile {
|
||||
anchor: FileId,
|
||||
source_root: SourceRootId,
|
||||
path: RelativePathBuf,
|
||||
},
|
||||
MoveFile {
|
||||
file: FileId,
|
||||
path: RelativePathBuf,
|
||||
src: FileId,
|
||||
dst_source_root: SourceRootId,
|
||||
dst_path: RelativePathBuf,
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -283,16 +283,17 @@ impl TryConvWith for FileSystemEdit {
|
||||
type Output = req::FileSystemEdit;
|
||||
fn try_conv_with(self, world: &ServerWorld) -> Result<req::FileSystemEdit> {
|
||||
let res = match self {
|
||||
FileSystemEdit::CreateFile { anchor, path } => {
|
||||
let uri = world.file_id_to_uri(anchor)?;
|
||||
let path = &path.as_str()[3..]; // strip `../` b/c url is weird
|
||||
let uri = uri.join(path)?;
|
||||
FileSystemEdit::CreateFile { source_root, path } => {
|
||||
let uri = world.path_to_uri(source_root, &path)?;
|
||||
req::FileSystemEdit::CreateFile { uri }
|
||||
}
|
||||
FileSystemEdit::MoveFile { file, path } => {
|
||||
let src = world.file_id_to_uri(file)?;
|
||||
let path = &path.as_str()[3..]; // strip `../` b/c url is weird
|
||||
let dst = src.join(path)?;
|
||||
FileSystemEdit::MoveFile {
|
||||
src,
|
||||
dst_source_root,
|
||||
dst_path,
|
||||
} => {
|
||||
let src = world.file_id_to_uri(src)?;
|
||||
let dst = world.path_to_uri(dst_source_root, &dst_path)?;
|
||||
req::FileSystemEdit::MoveFile { src, dst }
|
||||
}
|
||||
};
|
||||
|
@ -8,7 +8,7 @@ use ra_analysis::{
|
||||
Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, LibraryData,
|
||||
SourceRootId
|
||||
};
|
||||
use ra_vfs::{Vfs, VfsChange, VfsFile};
|
||||
use ra_vfs::{Vfs, VfsChange, VfsFile, VfsRoot};
|
||||
use rustc_hash::FxHashMap;
|
||||
use relative_path::RelativePathBuf;
|
||||
use parking_lot::RwLock;
|
||||
@ -183,4 +183,12 @@ impl ServerWorld {
|
||||
.map_err(|_| format_err!("can't convert path to url: {}", path.display()))?;
|
||||
Ok(url)
|
||||
}
|
||||
|
||||
pub fn path_to_uri(&self, root: SourceRootId, path: &RelativePathBuf) -> Result<Url> {
|
||||
let base = self.vfs.read().root2path(VfsRoot(root.0));
|
||||
let path = path.to_path(base);
|
||||
let url = Url::from_file_path(&path)
|
||||
.map_err(|_| format_err!("can't convert path to url: {}", path.display()))?;
|
||||
Ok(url)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user