|
377 | 377 | results = {}, |
378 | 378 | split = valLower.split("::"); |
379 | 379 |
|
380 | | - // remove empty keywords |
381 | | - for (var j = 0; j < split.length; ++j) { |
382 | | - split[j].toLowerCase(); |
383 | | - if (split[j] === "") { |
384 | | - split.splice(j, 1); |
| 380 | + for (var z = 0; z < split.length; ++z) { |
| 381 | + if (split[z] === "") { |
| 382 | + split.splice(z, 1); |
| 383 | + z -= 1; |
385 | 384 | } |
386 | 385 | } |
387 | 386 |
|
|
408 | 407 | if (obj.generics && |
409 | 408 | obj.generics.length >= val.generics.length) { |
410 | 409 | var elems = obj.generics.slice(0); |
411 | | - for (var y = 0; |
412 | | - y < val.generics.length; |
413 | | - ++y) { |
| 410 | + for (var y = 0; y < val.generics.length; ++y) { |
414 | 411 | // The point here is to find the type that matches the most. |
415 | 412 | var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1}; |
416 | 413 | for (var x = 0; x < elems.length; ++x) { |
|
532 | 529 | return literalSearch === true ? false : lev_distance; |
533 | 530 | } |
534 | 531 |
|
| 532 | + function checkPath(startsWith, lastElem, ty) { |
| 533 | + var ret_lev = MAX_LEV_DISTANCE + 1; |
| 534 | + var path = ty.path.split("::"); |
| 535 | + |
| 536 | + if (ty.parent && ty.parent.name) { |
| 537 | + path.push(ty.parent.name.toLowerCase()); |
| 538 | + } |
| 539 | + |
| 540 | + if (startsWith.length > path.length) { |
| 541 | + return MAX_LEV_DISTANCE + 1; |
| 542 | + } |
| 543 | + for (var i = 0; i < path.length; ++i) { |
| 544 | + if (i + startsWith.length > path.length) { |
| 545 | + break; |
| 546 | + } |
| 547 | + var lev_total = 0; |
| 548 | + var aborted = false; |
| 549 | + for (var x = 0; x < startsWith.length; ++x) { |
| 550 | + var lev = levenshtein(path[i + x], startsWith[x]); |
| 551 | + if (lev > MAX_LEV_DISTANCE) { |
| 552 | + aborted = true; |
| 553 | + break; |
| 554 | + } |
| 555 | + lev_total += lev; |
| 556 | + } |
| 557 | + if (aborted === false) { |
| 558 | + var extra = MAX_LEV_DISTANCE + 1; |
| 559 | + if (i + startsWith.length < path.length) { |
| 560 | + extra = levenshtein(path[i + startsWith.length], lastElem); |
| 561 | + } |
| 562 | + if (extra > MAX_LEV_DISTANCE) { |
| 563 | + extra = levenshtein(ty.name, lastElem); |
| 564 | + } |
| 565 | + if (extra < MAX_LEV_DISTANCE + 1) { |
| 566 | + lev_total += extra; |
| 567 | + ret_lev = Math.min(ret_lev, |
| 568 | + Math.round(lev_total / (startsWith.length + 1))); |
| 569 | + } |
| 570 | + } |
| 571 | + } |
| 572 | + return ret_lev; |
| 573 | + } |
| 574 | + |
535 | 575 | function typePassesFilter(filter, type) { |
536 | 576 | // No filter |
537 | 577 | if (filter < 0) return true; |
|
668 | 708 | query.search = val; |
669 | 709 | // gather matching search results up to a certain maximum |
670 | 710 | val = val.replace(/\_/g, ""); |
671 | | - var valGenerics = extractGenerics(val); |
| 711 | + |
672 | 712 | var results_length = 0; |
673 | | - for (var i = 0; i < split.length; ++i) { |
674 | | - for (var j = 0; j < nSearchWords; ++j) { |
675 | | - var lev_distance; |
676 | | - var ty = searchIndex[j]; |
677 | | - if (!ty) { |
| 713 | + var valGenerics = extractGenerics(val); |
| 714 | + |
| 715 | + var paths = valLower.split("::"); |
| 716 | + var j; |
| 717 | + for (j = 0; j < paths.length; ++j) { |
| 718 | + if (paths[j] === "") { |
| 719 | + paths.splice(j, 1); |
| 720 | + j -= 1; |
| 721 | + } |
| 722 | + } |
| 723 | + val = paths[paths.length - 1]; |
| 724 | + var startsWith = paths.slice(0, paths.length > 1 ? paths.length - 1 : 1); |
| 725 | + |
| 726 | + for (j = 0; j < nSearchWords; ++j) { |
| 727 | + var lev_distance; |
| 728 | + var ty = searchIndex[j]; |
| 729 | + if (!ty) { |
| 730 | + continue; |
| 731 | + } |
| 732 | + var lev_add = 0; |
| 733 | + if (paths.length > 1) { |
| 734 | + var lev = checkPath(startsWith, paths[paths.length - 1], ty); |
| 735 | + if (lev > MAX_LEV_DISTANCE) { |
678 | 736 | continue; |
| 737 | + } else if (lev > 0) { |
| 738 | + lev_add = 1; |
679 | 739 | } |
680 | | - var returned = false; |
681 | | - var in_args = false; |
682 | | - var index = -1; |
683 | | - // we want lev results to go lower than others |
684 | | - var lev = MAX_LEV_DISTANCE; |
685 | | - var fullId = itemTypes[ty.ty] + ty.path + ty.name; |
686 | | - |
687 | | - if (searchWords[j].indexOf(split[i]) > -1 || |
688 | | - searchWords[j].indexOf(val) > -1 || |
689 | | - searchWords[j].replace(/_/g, "").indexOf(val) > -1) |
690 | | - { |
691 | | - // filter type: ... queries |
692 | | - if (typePassesFilter(typeFilter, ty) && |
693 | | - results[fullId] === undefined) { |
694 | | - index = searchWords[j].replace(/_/g, "").indexOf(val); |
695 | | - } |
| 740 | + } |
| 741 | + |
| 742 | + var returned = false; |
| 743 | + var in_args = false; |
| 744 | + var index = -1; |
| 745 | + // we want lev results to go lower than others |
| 746 | + var lev = MAX_LEV_DISTANCE + 1; |
| 747 | + var fullId = itemTypes[ty.ty] + ty.path + ty.name; |
| 748 | + |
| 749 | + if (searchWords[j].indexOf(val) > -1 || |
| 750 | + searchWords[j].replace(/_/g, "").indexOf(val) > -1) |
| 751 | + { |
| 752 | + // filter type: ... queries |
| 753 | + if (typePassesFilter(typeFilter, ty) && |
| 754 | + results[fullId] === undefined) { |
| 755 | + index = searchWords[j].replace(/_/g, "").indexOf(val); |
696 | 756 | } |
697 | | - if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
698 | | - if (typePassesFilter(typeFilter, ty) && |
699 | | - (results[fullId] === undefined || |
700 | | - results[fullId].lev > lev_distance)) { |
701 | | - lev = Math.min(lev, lev_distance); |
702 | | - index = Math.max(0, index); |
703 | | - } |
| 757 | + } |
| 758 | + if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
| 759 | + if (typePassesFilter(typeFilter, ty) && |
| 760 | + (results[fullId] === undefined || |
| 761 | + results[fullId].lev > lev_distance)) { |
| 762 | + lev = Math.min(lev, lev_distance); |
| 763 | + index = Math.max(0, index); |
704 | 764 | } |
705 | | - if ((lev_distance = findArg(searchIndex[j], valGenerics)) |
706 | | - <= MAX_LEV_DISTANCE) { |
707 | | - if (typePassesFilter(typeFilter, ty) && |
708 | | - (results[fullId] === undefined || |
709 | | - results[fullId].lev > lev_distance)) { |
710 | | - in_args = true; |
711 | | - lev = Math.min(lev_distance, lev); |
712 | | - index = Math.max(0, index); |
713 | | - } |
| 765 | + } |
| 766 | + if ((lev_distance = findArg(searchIndex[j], valGenerics)) |
| 767 | + <= MAX_LEV_DISTANCE) { |
| 768 | + if (typePassesFilter(typeFilter, ty) && |
| 769 | + (results[fullId] === undefined || |
| 770 | + results[fullId].lev > lev_distance)) { |
| 771 | + in_args = true; |
| 772 | + lev = Math.min(lev_distance, lev); |
| 773 | + index = Math.max(0, index); |
714 | 774 | } |
715 | | - if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <= |
716 | | - MAX_LEV_DISTANCE) { |
717 | | - if (typePassesFilter(typeFilter, ty) && |
718 | | - (results[fullId] === undefined || |
719 | | - results[fullId].lev > lev_distance)) { |
720 | | - returned = true; |
721 | | - lev = Math.min(lev_distance, lev); |
722 | | - index = Math.max(0, index); |
723 | | - } |
| 775 | + } |
| 776 | + if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <= |
| 777 | + MAX_LEV_DISTANCE) { |
| 778 | + if (typePassesFilter(typeFilter, ty) && |
| 779 | + (results[fullId] === undefined || |
| 780 | + results[fullId].lev > lev_distance)) { |
| 781 | + returned = true; |
| 782 | + lev = Math.min(lev_distance, lev); |
| 783 | + index = Math.max(0, index); |
724 | 784 | } |
725 | | - if (index !== -1) { |
726 | | - if (results[fullId] === undefined) { |
727 | | - results[fullId] = { |
728 | | - id: j, |
729 | | - index: index, |
730 | | - lev: lev, |
731 | | - in_args: in_args, |
732 | | - returned: returned, |
733 | | - }; |
734 | | - results_length += 1; |
735 | | - } else { |
736 | | - if (results[fullId].lev > lev) { |
737 | | - results[fullId].lev = lev; |
738 | | - } |
739 | | - if (in_args === true) { |
740 | | - results[fullId].in_args = true; |
741 | | - } |
742 | | - if (returned === true) { |
743 | | - results[fullId].returned = true; |
744 | | - } |
| 785 | + } |
| 786 | + lev += lev_add; |
| 787 | + if (index !== -1) { |
| 788 | + if (results[fullId] === undefined) { |
| 789 | + results[fullId] = { |
| 790 | + id: j, |
| 791 | + index: index, |
| 792 | + lev: lev, |
| 793 | + in_args: in_args, |
| 794 | + returned: returned, |
| 795 | + }; |
| 796 | + results_length += 1; |
| 797 | + } else { |
| 798 | + if (results[fullId].lev > lev) { |
| 799 | + results[fullId].lev = lev; |
| 800 | + } |
| 801 | + if (in_args === true) { |
| 802 | + results[fullId].in_args = true; |
| 803 | + } |
| 804 | + if (returned === true) { |
| 805 | + results[fullId].returned = true; |
745 | 806 | } |
746 | 807 | } |
747 | | - if (results_length === max) { |
748 | | - break; |
749 | | - } |
| 808 | + } |
| 809 | + if (results_length === max) { |
| 810 | + break; |
750 | 811 | } |
751 | 812 | } |
752 | 813 | } |
|
837 | 898 | var result = results[i]; |
838 | 899 |
|
839 | 900 | // this validation does not make sense when searching by types |
840 | | - if (result.dontValidate) { |
| 901 | + if (result.dontValidate || result.returned === true && result.param === true) { |
841 | 902 | continue; |
842 | 903 | } |
843 | 904 | var name = result.item.name.toLowerCase(), |
844 | 905 | path = result.item.path.toLowerCase(), |
845 | 906 | parent = result.item.parent; |
846 | 907 |
|
847 | | - if (result.returned === false && result.param === false && |
848 | | - validateResult(name, path, split, parent) === false) |
849 | | - { |
| 908 | + if (validateResult(name, path, split, parent) === false) { |
850 | 909 | result.id = -1; |
851 | 910 | } |
852 | 911 | } |
|
0 commit comments