1522 } |
1522 } |
1523 if (m1SignatureMoreSpecific) return m1; |
1523 if (m1SignatureMoreSpecific) return m1; |
1524 if (m2SignatureMoreSpecific) return m2; |
1524 if (m2SignatureMoreSpecific) return m2; |
1525 return ambiguityError(m1, m2); |
1525 return ambiguityError(m1, m2); |
1526 case AMBIGUOUS: |
1526 case AMBIGUOUS: |
1527 //check if m1 is more specific than all ambiguous methods in m2 |
1527 //compare m1 to ambiguous methods in m2 |
1528 AmbiguityError e = (AmbiguityError)m2.baseSymbol(); |
1528 AmbiguityError e = (AmbiguityError)m2.baseSymbol(); |
|
1529 boolean m1MoreSpecificThanAnyAmbiguous = true; |
|
1530 boolean allAmbiguousMoreSpecificThanM1 = true; |
1529 for (Symbol s : e.ambiguousSyms) { |
1531 for (Symbol s : e.ambiguousSyms) { |
1530 if (mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs) != m1) { |
1532 Symbol moreSpecific = mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs); |
1531 return e.addAmbiguousSymbol(m1); |
1533 m1MoreSpecificThanAnyAmbiguous &= moreSpecific == m1; |
1532 } |
1534 allAmbiguousMoreSpecificThanM1 &= moreSpecific == s; |
1533 } |
1535 } |
1534 return m1; |
1536 if (m1MoreSpecificThanAnyAmbiguous) |
|
1537 return m1; |
|
1538 //if m1 is more specific than some ambiguous methods, but other ambiguous methods are |
|
1539 //more specific than m1, add it as a new ambiguous method: |
|
1540 if (!allAmbiguousMoreSpecificThanM1) |
|
1541 e.addAmbiguousSymbol(m1); |
|
1542 return e; |
1535 default: |
1543 default: |
1536 throw new AssertionError(); |
1544 throw new AssertionError(); |
1537 } |
1545 } |
1538 } |
1546 } |
1539 //where |
1547 //where |