|
374 | 374 | results = {},
|
375 | 375 | split = valLower.split("::");
|
376 | 376 |
|
377 |
| - // remove empty keywords |
378 |
| - for (var j = 0; j < split.length; ++j) { |
379 |
| - split[j].toLowerCase(); |
380 |
| - if (split[j] === "") { |
381 |
| - split.splice(j, 1); |
| 377 | + for (var z = 0; z < split.length; ++z) { |
| 378 | + if (split[z] === "") { |
| 379 | + split.slice(z, 1); |
| 380 | + z -= 1; |
382 | 381 | }
|
383 | 382 | }
|
384 | 383 |
|
|
405 | 404 | if (obj.generics &&
|
406 | 405 | obj.generics.length >= val.generics.length) {
|
407 | 406 | var elems = obj.generics.slice(0);
|
408 |
| - for (var y = 0; |
409 |
| - y < val.generics.length; |
410 |
| - ++y) { |
| 407 | + for (var y = 0; y < val.generics.length; ++y) { |
411 | 408 | // The point here is to find the type that matches the most.
|
412 | 409 | var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
|
413 | 410 | for (var x = 0; x < elems.length; ++x) {
|
|
529 | 526 | return literalSearch === true ? false : lev_distance;
|
530 | 527 | }
|
531 | 528 |
|
| 529 | + function checkPath(startsWith, ty) { |
| 530 | + var lev_total = 0; |
| 531 | + var path = ty.path.split("::"); |
| 532 | + if (startsWith.length > path.length) { |
| 533 | + return MAX_LEV_DISTANCE + 1; |
| 534 | + } |
| 535 | + for (var i = path.length - 1; i < startsWith.length; ++i) { |
| 536 | + var lev = levenshtein(startsWith[i], path[i]); |
| 537 | + if (lev > MAX_LEV_DISTANCE) { |
| 538 | + return MAX_LEV_DISTANCE + 1; |
| 539 | + } |
| 540 | + lev_total += lev; |
| 541 | + } |
| 542 | + return Math.round(lev_total / startsWith.length); |
| 543 | + } |
| 544 | + |
532 | 545 | function typePassesFilter(filter, type) {
|
533 | 546 | // No filter
|
534 | 547 | if (filter < 0) return true;
|
|
665 | 678 | query.search = val;
|
666 | 679 | // gather matching search results up to a certain maximum
|
667 | 680 | val = val.replace(/\_/g, "");
|
668 |
| - var valGenerics = extractGenerics(val); |
| 681 | + |
669 | 682 | var results_length = 0;
|
670 |
| - for (var i = 0; i < split.length; ++i) { |
671 |
| - for (var j = 0; j < nSearchWords; ++j) { |
672 |
| - var lev_distance; |
673 |
| - var ty = searchIndex[j]; |
674 |
| - if (!ty) { |
| 683 | + var valGenerics = extractGenerics(val); |
| 684 | + |
| 685 | + var paths = valLower.split("::"); |
| 686 | + var j; |
| 687 | + for (j = 0; j < paths.length; ++j) { |
| 688 | + if (paths[j] === "") { |
| 689 | + paths.splice(j, 1); |
| 690 | + j -= 1; |
| 691 | + } |
| 692 | + } |
| 693 | + val = paths[paths.length - 1]; |
| 694 | + var startsWith = paths.slice(0, paths.length > 1 ? paths.length - 1 : 1); |
| 695 | + |
| 696 | + for (j = 0; j < nSearchWords; ++j) { |
| 697 | + var lev_distance; |
| 698 | + var ty = searchIndex[j]; |
| 699 | + if (!ty) { |
| 700 | + continue; |
| 701 | + } |
| 702 | + var lev_add = 0; |
| 703 | + if (paths.length > 1) { |
| 704 | + var lev = checkPath(startsWith, ty); |
| 705 | + if (lev > MAX_LEV_DISTANCE) { |
675 | 706 | continue;
|
| 707 | + } else if (lev > 0) { |
| 708 | + lev_add = 1; |
676 | 709 | }
|
677 |
| - var returned = false; |
678 |
| - var in_args = false; |
679 |
| - var index = -1; |
680 |
| - // we want lev results to go lower than others |
681 |
| - var lev = MAX_LEV_DISTANCE; |
682 |
| - var fullId = itemTypes[ty.ty] + ty.path + ty.name; |
683 |
| - |
684 |
| - if (searchWords[j].indexOf(split[i]) > -1 || |
685 |
| - searchWords[j].indexOf(val) > -1 || |
686 |
| - searchWords[j].replace(/_/g, "").indexOf(val) > -1) |
687 |
| - { |
688 |
| - // filter type: ... queries |
689 |
| - if (typePassesFilter(typeFilter, ty) && |
690 |
| - results[fullId] === undefined) { |
691 |
| - index = searchWords[j].replace(/_/g, "").indexOf(val); |
692 |
| - } |
| 710 | + } |
| 711 | + |
| 712 | + var returned = false; |
| 713 | + var in_args = false; |
| 714 | + var index = -1; |
| 715 | + // we want lev results to go lower than others |
| 716 | + var lev = MAX_LEV_DISTANCE + 1; |
| 717 | + var fullId = itemTypes[ty.ty] + ty.path + ty.name; |
| 718 | + |
| 719 | + if (searchWords[j].indexOf(val) > -1 || |
| 720 | + searchWords[j].replace(/_/g, "").indexOf(val) > -1) |
| 721 | + { |
| 722 | + // filter type: ... queries |
| 723 | + if (typePassesFilter(typeFilter, ty) && |
| 724 | + results[fullId] === undefined) { |
| 725 | + index = searchWords[j].replace(/_/g, "").indexOf(val); |
693 | 726 | }
|
694 |
| - if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
695 |
| - if (typePassesFilter(typeFilter, ty) && |
696 |
| - (results[fullId] === undefined || |
697 |
| - results[fullId].lev > lev_distance)) { |
698 |
| - lev = Math.min(lev, lev_distance); |
699 |
| - index = Math.max(0, index); |
700 |
| - } |
| 727 | + } |
| 728 | + if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
| 729 | + if (typePassesFilter(typeFilter, ty) && |
| 730 | + (results[fullId] === undefined || |
| 731 | + results[fullId].lev > lev_distance)) { |
| 732 | + lev = Math.min(lev, lev_distance); |
| 733 | + index = Math.max(0, index); |
701 | 734 | }
|
702 |
| - if ((lev_distance = findArg(searchIndex[j], valGenerics)) |
703 |
| - <= MAX_LEV_DISTANCE) { |
704 |
| - if (typePassesFilter(typeFilter, ty) && |
705 |
| - (results[fullId] === undefined || |
706 |
| - results[fullId].lev > lev_distance)) { |
707 |
| - in_args = true; |
708 |
| - lev = Math.min(lev_distance, lev); |
709 |
| - index = Math.max(0, index); |
710 |
| - } |
| 735 | + } |
| 736 | + if ((lev_distance = findArg(searchIndex[j], valGenerics)) |
| 737 | + <= MAX_LEV_DISTANCE) { |
| 738 | + if (typePassesFilter(typeFilter, ty) && |
| 739 | + (results[fullId] === undefined || |
| 740 | + results[fullId].lev > lev_distance)) { |
| 741 | + in_args = true; |
| 742 | + lev = Math.min(lev_distance, lev); |
| 743 | + index = Math.max(0, index); |
711 | 744 | }
|
712 |
| - if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <= |
713 |
| - MAX_LEV_DISTANCE) { |
714 |
| - if (typePassesFilter(typeFilter, ty) && |
715 |
| - (results[fullId] === undefined || |
716 |
| - results[fullId].lev > lev_distance)) { |
717 |
| - returned = true; |
718 |
| - lev = Math.min(lev_distance, lev); |
719 |
| - index = Math.max(0, index); |
720 |
| - } |
| 745 | + } |
| 746 | + if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <= |
| 747 | + MAX_LEV_DISTANCE) { |
| 748 | + if (typePassesFilter(typeFilter, ty) && |
| 749 | + (results[fullId] === undefined || |
| 750 | + results[fullId].lev > lev_distance)) { |
| 751 | + returned = true; |
| 752 | + lev = Math.min(lev_distance, lev); |
| 753 | + index = Math.max(0, index); |
721 | 754 | }
|
722 |
| - if (index !== -1) { |
723 |
| - if (results[fullId] === undefined) { |
724 |
| - results[fullId] = { |
725 |
| - id: j, |
726 |
| - index: index, |
727 |
| - lev: lev, |
728 |
| - in_args: in_args, |
729 |
| - returned: returned, |
730 |
| - }; |
731 |
| - results_length += 1; |
732 |
| - } else { |
733 |
| - if (results[fullId].lev > lev) { |
734 |
| - results[fullId].lev = lev; |
735 |
| - } |
736 |
| - if (in_args === true) { |
737 |
| - results[fullId].in_args = true; |
738 |
| - } |
739 |
| - if (returned === true) { |
740 |
| - results[fullId].returned = true; |
741 |
| - } |
| 755 | + } |
| 756 | + lev += lev_add; |
| 757 | + if (index !== -1) { |
| 758 | + if (results[fullId] === undefined) { |
| 759 | + results[fullId] = { |
| 760 | + id: j, |
| 761 | + index: index, |
| 762 | + lev: lev, |
| 763 | + in_args: in_args, |
| 764 | + returned: returned, |
| 765 | + }; |
| 766 | + results_length += 1; |
| 767 | + } else { |
| 768 | + if (results[fullId].lev > lev) { |
| 769 | + results[fullId].lev = lev; |
| 770 | + } |
| 771 | + if (in_args === true) { |
| 772 | + results[fullId].in_args = true; |
| 773 | + } |
| 774 | + if (returned === true) { |
| 775 | + results[fullId].returned = true; |
742 | 776 | }
|
743 | 777 | }
|
744 |
| - if (results_length === max) { |
745 |
| - break; |
746 |
| - } |
| 778 | + } |
| 779 | + if (results_length === max) { |
| 780 | + break; |
747 | 781 | }
|
748 | 782 | }
|
749 | 783 | }
|
|
834 | 868 | var result = results[i];
|
835 | 869 |
|
836 | 870 | // this validation does not make sense when searching by types
|
837 |
| - if (result.dontValidate) { |
| 871 | + if (result.dontValidate || result.returned === true && result.param === true) { |
838 | 872 | continue;
|
839 | 873 | }
|
840 | 874 | var name = result.item.name.toLowerCase(),
|
841 | 875 | path = result.item.path.toLowerCase(),
|
842 | 876 | parent = result.item.parent;
|
843 | 877 |
|
844 |
| - if (result.returned === false && result.param === false && |
845 |
| - validateResult(name, path, split, parent) === false) |
846 |
| - { |
| 878 | + if (validateResult(name, path, split, parent) === false) { |
847 | 879 | result.id = -1;
|
848 | 880 | }
|
849 | 881 | }
|
|
0 commit comments