aboutsummaryrefslogtreecommitdiff
path: root/crates/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/server/src')
-rw-r--r--crates/server/src/path_map.rs47
1 files changed, 46 insertions, 1 deletions
diff --git a/crates/server/src/path_map.rs b/crates/server/src/path_map.rs
index e198e165d..d2b811a3b 100644
--- a/crates/server/src/path_map.rs
+++ b/crates/server/src/path_map.rs
@@ -1,4 +1,4 @@
1use std::path::{PathBuf, Path}; 1use std::path::{PathBuf, Path, Component};
2use im; 2use im;
3use libanalysis::{FileId}; 3use libanalysis::{FileId};
4 4
@@ -36,6 +36,7 @@ impl PathMap {
36 36
37 pub fn resolve(&self, id: FileId, relpath: &Path) -> Option<FileId> { 37 pub fn resolve(&self, id: FileId, relpath: &Path) -> Option<FileId> {
38 let path = self.get_path(id).join(relpath); 38 let path = self.get_path(id).join(relpath);
39 let path = normalize(&path);
39 self.get_id(&path) 40 self.get_id(&path)
40 } 41 }
41 42
@@ -50,3 +51,47 @@ impl PathMap {
50 id 51 id
51 } 52 }
52} 53}
54
55fn normalize(path: &Path) -> PathBuf {
56 let mut components = path.components().peekable();
57 let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().cloned() {
58 components.next();
59 PathBuf::from(c.as_os_str())
60 } else {
61 PathBuf::new()
62 };
63
64 for component in components {
65 match component {
66 Component::Prefix(..) => unreachable!(),
67 Component::RootDir => {
68 ret.push(component.as_os_str());
69 }
70 Component::CurDir => {}
71 Component::ParentDir => {
72 ret.pop();
73 }
74 Component::Normal(c) => {
75 ret.push(c);
76 }
77 }
78 }
79 ret
80}
81
82#[cfg(test)]
83mod test {
84 use super::*;
85
86 #[test]
87 fn test_resolve() {
88 let mut m = PathMap::new();
89 let id1 = m.get_or_insert(PathBuf::from("/foo"));
90 let id2 = m.get_or_insert(PathBuf::from("/foo/bar.rs"));
91 assert_eq!(
92 m.resolve(id1, &PathBuf::from("bar.rs")),
93 Some(id2),
94 )
95 }
96}
97