edits use source-root API

This commit is contained in:
Aleksey Kladov 2018-12-21 12:18:14 +03:00
parent 0063f03e86
commit b5b44659a4
4 changed files with 28 additions and 16 deletions

View file

@ -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 {

View file

@ -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,
},
}

View file

@ -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 }
}
};

View file

@ -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)
}
}