Bladeren bron

Made selectMethod use the priority of the member when selecting

Jared 5 jaren geleden
bovenliggende
commit
b93a6bb5d1
No account linked to committer's email address

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

5
  */
5
  */
6
 package org.openzen.zenscript.codemodel.type.member;
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
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.CompileException;
9
 import org.openzen.zencode.shared.CompileException;
13
 import org.openzen.zencode.shared.CompileExceptionCode;
10
 import org.openzen.zencode.shared.CompileExceptionCode;
11
+import org.openzen.zenscript.codemodel.CompareType;
12
+import org.openzen.zenscript.codemodel.FunctionHeader;
14
 import org.openzen.zenscript.codemodel.expression.CallArguments;
13
 import org.openzen.zenscript.codemodel.expression.CallArguments;
14
+import org.openzen.zenscript.codemodel.expression.ConstExpression;
15
 import org.openzen.zenscript.codemodel.expression.Expression;
15
 import org.openzen.zenscript.codemodel.expression.Expression;
16
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
16
 import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
17
 import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
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
 import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
20
 import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
19
 import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
21
 import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
20
 import org.openzen.zenscript.codemodel.expression.SetterExpression;
22
 import org.openzen.zenscript.codemodel.expression.SetterExpression;
21
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
23
 import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
22
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
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
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
25
 import org.openzen.zenscript.codemodel.member.FunctionalMember;
29
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
26
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
30
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
27
 import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
35
 import org.openzen.zenscript.codemodel.type.StoredType;
32
 import org.openzen.zenscript.codemodel.type.StoredType;
36
 import org.openzen.zenscript.codemodel.type.TypeID;
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
  * @author Hoofdgebruiker
41
  * @author Hoofdgebruiker
335
 	
336
 	
336
 	public FunctionalMemberRef selectMethod(CodePosition position, TypeScope scope, CallArguments arguments, boolean allowNonStatic, boolean allowStatic) throws CompileException {
337
 	public FunctionalMemberRef selectMethod(CodePosition position, TypeScope scope, CallArguments arguments, boolean allowNonStatic, boolean allowStatic) throws CompileException {
337
 		// try to match with exact types
338
 		// try to match with exact types
339
+        List<TypeMember<FunctionalMemberRef>> possibleMethods = new ArrayList<>();
338
 		for (TypeMember<FunctionalMemberRef> method : methods) {
340
 		for (TypeMember<FunctionalMemberRef> method : methods) {
339
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
341
 			if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
340
 				continue;
342
 				continue;
341
 			
343
 			
342
 			FunctionHeader header = method.member.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
344
 			FunctionHeader header = method.member.getHeader().instanceForCall(position, scope.getTypeRegistry(), arguments);
343
 			if (header.matchesExactly(position, arguments, scope))
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
 		// try to match with approximate types
361
 		// try to match with approximate types
348
 		FunctionalMemberRef selected = null;
362
 		FunctionalMemberRef selected = null;
349
 		for (TypeMember<FunctionalMemberRef> method : methods) {
363
 		for (TypeMember<FunctionalMemberRef> method : methods) {

Laden…
Annuleren
Opslaan