diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index b01b596da682e..3b84ae2bed060 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -3639,7 +3639,7 @@ class DocSearch {
if (contains.length === 0) {
return 0;
}
- const maxPathEditDistance = Math.floor(
+ const maxPathEditDistance = parsedQuery.literalSearch ? 0 : Math.floor(
contains.reduce((acc, next) => acc + next.length, 0) / 3,
);
let ret_dist = maxPathEditDistance + 1;
@@ -3650,7 +3650,9 @@ class DocSearch {
let dist_total = 0;
for (let x = 0; x < clength; ++x) {
const [p, c] = [path[i + x], contains[x]];
- if (Math.floor((p.length - c.length) / 3) <= maxPathEditDistance &&
+ if (parsedQuery.literalSearch && p !== c) {
+ continue pathiter;
+ } else if (Math.floor((p.length - c.length) / 3) <= maxPathEditDistance &&
p.indexOf(c) !== -1
) {
// discount distance on substring match
diff --git a/tests/rustdoc-js/literal-path.js b/tests/rustdoc-js/literal-path.js
new file mode 100644
index 0000000000000..ea999ea1a6f0a
--- /dev/null
+++ b/tests/rustdoc-js/literal-path.js
@@ -0,0 +1,23 @@
+// exact-check
+
+// This test ensures that literal search is always applied on elements of the path.
+
+const EXPECTED = [
+ {
+ 'query': '"some::path"',
+ 'others': [
+ { 'path': 'literal_path::some', 'name': 'Path' },
+ ],
+ },
+ {
+ 'query': '"somea::path"',
+ 'others': [
+ { 'path': 'literal_path::somea', 'name': 'Path' },
+ ],
+ },
+ {
+ 'query': '"soma::path"',
+ 'others': [
+ ],
+ },
+];
diff --git a/tests/rustdoc-js/literal-path.rs b/tests/rustdoc-js/literal-path.rs
new file mode 100644
index 0000000000000..fa7685fd966a1
--- /dev/null
+++ b/tests/rustdoc-js/literal-path.rs
@@ -0,0 +1,7 @@
+pub mod some {
+ pub struct Path;
+}
+
+pub mod somea {
+ pub struct Path;
+}