@@ -1831,18 +1831,20 @@ trait Applications extends Compatibility {
18311831     * 
18321832     *  In this case `b.M` would be regarded as more specific than `a.M`. 
18331833     */  
1834-     def  comparePrefixes (pre1 : Type , pre2 : Type ) = 
1834+     def  comparePrefixes  = 
1835+       val  pre1  =  widenPrefix(alt1)
1836+       val  pre2  =  widenPrefix(alt2)
18351837      val  winsPrefix1  =  isAsSpecificValueType(pre1, pre2)
18361838      val  winsPrefix2  =  isAsSpecificValueType(pre2, pre1)
18371839      if  winsPrefix1 ==  winsPrefix2 then  0 
18381840      else  if  winsPrefix1 then  1 
18391841      else  - 1 
18401842
1841-     def  compareWithTypes (tp1 : Type , tp2 : Type ) =  { 
1843+     def  compareWithTypes (tp1 : Type , tp2 : Type ) = 
18421844      val  ownerScore  =  compareOwner(alt1.symbol.maybeOwner, alt2.symbol.maybeOwner)
18431845
1844-       def  winsType1  =  isAsSpecific(alt1, tp1, alt2, tp2)
1845-       def  winsType2  =  isAsSpecific(alt2, tp2, alt1, tp1)
1846+       val  winsType1  =  isAsSpecific(alt1, tp1, alt2, tp2)
1847+       val  winsType2  =  isAsSpecific(alt2, tp2, alt1, tp1)
18461848
18471849      overload.println(i " compare( $alt1,  $alt2)?  $tp1  $tp2  $ownerScore  $winsType1  $winsType2" )
18481850      if  winsType1 &&  winsType2
@@ -1851,15 +1853,14 @@ trait Applications extends Compatibility {
18511853        //  alternatives are the same after following ExprTypes, pick one of them
18521854        //  (prefer the one that is not a method, but that's arbitrary).
18531855        if  alt1.widenExpr =:=  alt2 then  - 1  else  1 
1854-       else  if  ownerScore ==  1  then 
1855-         if  winsType1 ||  ! winsType2 then  1  else  0 
1856-       else  if  ownerScore ==  - 1  then 
1857-         if  winsType2 ||  ! winsType1 then  - 1  else  0 
1858-       else  if  winsType1 then 
1859-         if  winsType2 then  0  else  1 
1860-       else 
1861-         if  winsType2 then  - 1  else  0 
1862-     }
1856+       else  ownerScore match 
1857+         case   1  =>  if  winsType1 ||  ! winsType2 then   1  else  0 
1858+         case  - 1  =>  if  winsType2 ||  ! winsType1 then  - 1  else  0 
1859+         case   0  => 
1860+           if  winsType1 !=  winsType2 then  if  winsType1 then  1  else  - 1 
1861+           else  if  alt1.symbol ==  alt2.symbol then  comparePrefixes
1862+           else  0 
1863+     end  compareWithTypes 
18631864
18641865    if  alt1.symbol.is(ConstructorProxy ) &&  ! alt2.symbol.is(ConstructorProxy ) then  - 1 
18651866    else  if  alt2.symbol.is(ConstructorProxy ) &&  ! alt1.symbol.is(ConstructorProxy ) then  1 
@@ -1870,14 +1871,11 @@ trait Applications extends Compatibility {
18701871      val  strippedType2  =  stripImplicit(fullType2)
18711872
18721873      val  result  =  compareWithTypes(strippedType1, strippedType2)
1873-       if  result !=  0  then  result
1874-       else  if  strippedType1 eq fullType1 then 
1875-         if  strippedType2 eq fullType2 then 
1876-           if  alt1.symbol !=  alt2.symbol then  0     //  no implicits either side: it's a draw ...
1877-           else  comparePrefixes(                   //  ... unless the symbol is the same, in which case
1878-             widenPrefix(alt1), widenPrefix(alt2)) //  we compare prefixes
1874+       if  (result !=  0 ) result
1875+       else  if  (strippedType1 eq fullType1)
1876+         if  (strippedType2 eq fullType2) 0          //  no implicits either side: its' a draw
18791877        else  1                                     //  prefer 1st alternative with no implicits
1880-       else  if  strippedType2 eq fullType2  then   - 1   //  prefer 2nd alternative with no implicits
1878+       else  if  ( strippedType2 eq fullType2)  - 1       //  prefer 2nd alternative with no implicits
18811879      else  compareWithTypes(fullType1, fullType2) //  continue by comparing implicits parameters
18821880  }
18831881  end  compare 
0 commit comments