Browse Source

Made selectMethod use the priority of the member when selecting

Jared 5 years ago
parent
commit
b93a6bb5d1
No account linked to committer's email address

+ 24
- 10
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberGroup.java View File

@@ -5,26 +5,23 @@
5 5
  */
6 6
 package org.openzen.zenscript.codemodel.type.member;
7 7
 
8
-import java.util.ArrayList;
9
-import java.util.List;
10
-import java.util.Map;
11 8
 import org.openzen.zencode.shared.CodePosition;
12 9
 import org.openzen.zencode.shared.CompileException;
13 10
 import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.CompareType;
12
+import org.openzen.zenscript.codemodel.FunctionHeader;
14 13
 import org.openzen.zenscript.codemodel.expression.CallArguments;
14
+import org.openzen.zenscript.codemodel.expression.ConstExpression;
15 15
 import org.openzen.zenscript.codemodel.expression.Expression;
16 16
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
17 17
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
18
+import org.openzen.zenscript.codemodel.expression.InvalidExpression;
19
+import org.openzen.zenscript.codemodel.expression.PostCallExpression;
18 20
 import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
19 21
 import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
20 22
 import org.openzen.zenscript.codemodel.expression.SetterExpression;
21 23
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
22 24
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
23
-import org.openzen.zenscript.codemodel.CompareType;
24
-import org.openzen.zenscript.codemodel.FunctionHeader;
25
-import org.openzen.zenscript.codemodel.expression.ConstExpression;
26
-import org.openzen.zenscript.codemodel.expression.InvalidExpression;
27
-import org.openzen.zenscript.codemodel.expression.PostCallExpression;
28 25
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
29 26
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
30 27
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
@@ -35,6 +32,10 @@ import org.openzen.zenscript.codemodel.scope.TypeScope;
35 32
 import org.openzen.zenscript.codemodel.type.StoredType;
36 33
 import org.openzen.zenscript.codemodel.type.TypeID;
37 34
 
35
+import java.util.ArrayList;
36
+import java.util.List;
37
+import java.util.Map;
38
+
38 39
 /**
39 40
  *
40 41
  * @author Hoofdgebruiker
@@ -335,15 +336,28 @@ public class TypeMemberGroup {
335 336
 	
336 337
 	public FunctionalMemberRef selectMethod(CodePosition position, TypeScope scope, CallArguments arguments, boolean allowNonStatic, boolean allowStatic) throws CompileException {
337 338
 		// try to match with exact types
339
+        List<TypeMember<FunctionalMemberRef>> possibleMethods = new ArrayList<>();
338 340
 		for (TypeMember<FunctionalMemberRef> method : methods) {
339 341
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
340 342
 				continue;
341 343
 			
342 344
 			FunctionHeader header = method.member.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
343 345
 			if (header.matchesExactly(position, arguments, scope))
344
-				return method.member;
346
+			    possibleMethods.add(method);
345 347
 		}
346
-		
348
+        if (!possibleMethods.isEmpty()) {
349
+            TypeMember<FunctionalMemberRef> selectedMethod = null;
350
+            for (TypeMember<FunctionalMemberRef> method : possibleMethods) {
351
+                if (selectedMethod == null) {
352
+                    selectedMethod = method;
353
+                    continue;
354
+                }
355
+                
356
+                selectedMethod = selectedMethod.resolve(method);
357
+            }
358
+            if (selectedMethod != null)
359
+                return selectedMethod.member;
360
+        }
347 361
 		// try to match with approximate types
348 362
 		FunctionalMemberRef selected = null;
349 363
 		for (TypeMember<FunctionalMemberRef> method : methods) {

Loading…
Cancel
Save