diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-04-12 13:06:43 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-04-12 13:06:43 +0000 |
commit | 2d6dc41d0f5985b278969131edbce4703d674a8f (patch) | |
tree | 00c7a0c94a2fbd9d6c96ae281a57008caca27646 /src | |
parent | 1e7cdd7520000aa7a052b0e756bd6c6d717f3281 (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.java | 9 |
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; |