@@ -916,49 +916,49 @@ trait Implicits { self: Typer =>
916
916
* treated as a simple failure, with a warning that semantics will change.
917
917
* - otherwise add the failure to `rfailures` and continue testing the other candidates.
918
918
*/
919
- def rank (pending : List [Candidate ], found : SearchResult , rfailures : List [SearchFailure ]): SearchResult = {
920
- def recur (result : SearchResult , remaining : List [Candidate ], isNot : Boolean ): SearchResult = result match {
921
- case fail : SearchFailure =>
922
- if (isNot)
923
- recur(
924
- SearchSuccess (ref(defn.Not_value ), defn.Not_value .termRef, 0 )(
925
- ctx.typerState.fresh().setCommittable(true )),
926
- remaining, false )
927
- else if (fail.isAmbiguous)
928
- if (ctx.scala2Mode) {
929
- val result = rank(remaining, found, NoMatchingImplicitsFailure :: rfailures)
930
- if (result.isSuccess)
931
- warnAmbiguousNegation(fail.reason.asInstanceOf [AmbiguousImplicits ])
932
- result
933
- }
934
- else
935
- healAmbiguous(remaining, fail)
936
- else
937
- rank(remaining, found, fail :: rfailures)
938
- case best : SearchSuccess =>
939
- if (isNot)
940
- recur(NoMatchingImplicitsFailure , remaining, false )
941
- else if (ctx.mode.is(Mode .ImplicitExploration ) || isCoherent)
942
- best
943
- else disambiguate(found, best) match {
944
- case retained : SearchSuccess =>
945
- val newPending =
946
- if (retained eq found) remaining
947
- else remaining.filter(cand =>
948
- compareCandidate(retained, cand.ref, cand.level) <= 0 )
949
- rank(newPending, retained, rfailures)
919
+ def rank (pending : List [Candidate ], found : SearchResult , rfailures : List [SearchFailure ]): SearchResult =
920
+ pending match {
921
+ case cand :: remaining =>
922
+ negateIfNot(tryImplicit(cand)) match {
950
923
case fail : SearchFailure =>
951
- healAmbiguous(remaining, fail)
924
+ if (fail.isAmbiguous)
925
+ if (ctx.scala2Mode) {
926
+ val result = rank(remaining, found, NoMatchingImplicitsFailure :: rfailures)
927
+ if (result.isSuccess)
928
+ warnAmbiguousNegation(fail.reason.asInstanceOf [AmbiguousImplicits ])
929
+ result
930
+ }
931
+ else healAmbiguous(remaining, fail)
932
+ else rank(remaining, found, fail :: rfailures)
933
+ case best : SearchSuccess =>
934
+ if (ctx.mode.is(Mode .ImplicitExploration ) || isCoherent)
935
+ best
936
+ else disambiguate(found, best) match {
937
+ case retained : SearchSuccess =>
938
+ val newPending =
939
+ if (retained eq found) remaining
940
+ else remaining.filter(cand =>
941
+ compareCandidate(retained, cand.ref, cand.level) <= 0 )
942
+ rank(newPending, retained, rfailures)
943
+ case fail : SearchFailure =>
944
+ healAmbiguous(remaining, fail)
945
+ }
952
946
}
953
- }
954
- pending match {
955
- case cand :: pending1 =>
956
- recur(tryImplicit(cand), pending1, this .isNot)
957
947
case nil =>
958
948
if (rfailures.isEmpty) found
959
949
else found.recoverWith(_ => rfailures.reverse.maxBy(_.tree.treeSize))
960
950
}
961
- }
951
+
952
+ def negateIfNot (result : SearchResult ) =
953
+ if (isNot)
954
+ result match {
955
+ case _ : SearchFailure =>
956
+ SearchSuccess (ref(defn.Not_value ), defn.Not_value .termRef, 0 )(
957
+ ctx.typerState.fresh().setCommittable(true ))
958
+ case _ : SearchSuccess =>
959
+ NoMatchingImplicitsFailure
960
+ }
961
+ else result
962
962
963
963
def warnAmbiguousNegation (ambi : AmbiguousImplicits ) =
964
964
ctx.migrationWarning(
0 commit comments