about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustdoc/html/static/js/search.js44
-rw-r--r--tests/rustdoc-js/generics2.js22
-rw-r--r--tests/rustdoc-js/generics2.rs13
3 files changed, 49 insertions, 30 deletions
diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index 38391436aea..a2aa50194e4 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -1349,24 +1349,16 @@ function initSearch(rawSearchIndex) {
                         continue;
                     }
                     if (fnType.id < 0 && queryElem.id < 0) {
-                        if (mgens === null) {
-                            mgens = new Map();
+                        if (mgens && mgens.has(fnType.id) &&
+                            mgens.get(fnType.id) !== queryElem.id) {
+                            continue;
                         }
-                        const alreadyAssigned = mgens.has(fnType.id);
-                        if (alreadyAssigned) {
-                            if (mgens.get(fnType.id) !== queryElem.id) {
-                                continue;
-                            }
-                        } else {
-                            mgens.set(fnType.id, queryElem.id);
-                        }
-                        if (!solutionCb || solutionCb(mgens)) {
+                        const mgensScratch = new Map(mgens);
+                        mgensScratch.set(fnType.id, queryElem.id);
+                        if (!solutionCb || solutionCb(mgensScratch)) {
                             return true;
                         }
-                        if (!alreadyAssigned) {
-                            mgens.delete(fnType.id);
-                        }
-                    } else if (!solutionCb || solutionCb(mgens)) {
+                    } else if (!solutionCb || solutionCb(mgens ? new Map(mgens) : null)) {
                         // unifyFunctionTypeIsMatchCandidate already checks that ids match
                         return true;
                     }
@@ -1376,34 +1368,26 @@ function initSearch(rawSearchIndex) {
                         continue;
                     }
                     if (fnType.id < 0) {
-                        if (mgens === null) {
-                            mgens = new Map();
-                        }
-                        const alreadyAssigned = mgens.has(fnType.id);
-                        if (alreadyAssigned) {
-                            if (mgens.get(fnType.id) !== 0) {
-                                continue;
-                            }
-                        } else {
-                            mgens.set(fnType.id, 0);
+                        if (mgens && mgens.has(fnType.id) &&
+                            mgens.get(fnType.id) !== 0) {
+                            continue;
                         }
+                        const mgensScratch = new Map(mgens);
+                        mgensScratch.set(fnType.id, 0);
                         if (unifyFunctionTypes(
                             whereClause[(-fnType.id) - 1],
                             queryElems,
                             whereClause,
-                            mgens,
+                            mgensScratch,
                             solutionCb
                         )) {
                             return true;
                         }
-                        if (!alreadyAssigned) {
-                            mgens.delete(fnType.id);
-                        }
                     } else if (unifyFunctionTypes(
                         fnType.generics,
                         queryElems,
                         whereClause,
-                        mgens,
+                        mgens ? new Map(mgens) : null,
                         solutionCb
                     )) {
                         return true;
diff --git a/tests/rustdoc-js/generics2.js b/tests/rustdoc-js/generics2.js
new file mode 100644
index 00000000000..f08704349a4
--- /dev/null
+++ b/tests/rustdoc-js/generics2.js
@@ -0,0 +1,22 @@
+// exact-check
+
+const EXPECTED = [
+    {
+        'query': 'outside<U>, outside<V> -> outside<W>',
+        'others': [],
+    },
+    {
+        'query': 'outside<V>, outside<U> -> outside<W>',
+        'others': [],
+    },
+    {
+        'query': 'outside<U>, outside<U> -> outside<W>',
+        'others': [],
+    },
+    {
+        'query': 'outside<U>, outside<U> -> outside<U>',
+        'others': [
+            {"path": "generics2", "name": "should_match_3"}
+        ],
+    },
+];
diff --git a/tests/rustdoc-js/generics2.rs b/tests/rustdoc-js/generics2.rs
new file mode 100644
index 00000000000..1177ade6831
--- /dev/null
+++ b/tests/rustdoc-js/generics2.rs
@@ -0,0 +1,13 @@
+pub struct Outside<T>(T);
+
+pub fn no_match<U, V>(a: Outside<U>, b: Outside<V>) -> (Outside<U>, Outside<V>) {
+    unimplemented!();
+}
+
+pub fn no_match_2<U, V>(a: Outside<V>, b: Outside<U>) -> (Outside<U>, Outside<V>) {
+    unimplemented!();
+}
+
+pub fn should_match_3<U>(a: Outside<U>, b: Outside<U>) -> (Outside<U>, Outside<U>) {
+    unimplemented!();
+}