.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 {
}
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 {
#[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,
},
}
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 }
}
};
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;
.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)
+ }
}