summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-04-12 13:06:43 +0000
committerRich Hickey <richhickey@gmail.com>2009-04-12 13:06:43 +0000
commit2d6dc41d0f5985b278969131edbce4703d674a8f (patch)
tree00c7a0c94a2fbd9d6c96ae281a57008caca27646 /src
parent1e7cdd7520000aa7a052b0e756bd6c6d717f3281 (diff)
Choose most specific return type on multiple exact arg matches [issue 77]
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index e683da91..6e31e35f 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -2024,6 +2024,7 @@ static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, I
//presumes matching lengths
int matchIdx = -1;
boolean tied = false;
+ boolean foundExact = false;
for(int i = 0; i < paramlists.size(); i++)
{
boolean match = true;
@@ -2040,8 +2041,12 @@ static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, I
match = Reflector.paramArgTypeMatch(pclass, aclass);
}
if(exact == argexprs.count())
- return i;
- if(match)
+ {
+ if(!foundExact || matchIdx == -1 || rets.get(matchIdx).isAssignableFrom(rets.get(i)))
+ matchIdx = i;
+ foundExact = true;
+ }
+ else if(match && !foundExact)
{
if(matchIdx == -1)
matchIdx = i;