|
@@ -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) {
|