aboutsummaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2022-01-09 13:51:08 +0100
committerDaniel Gavin <danielgavin5@hotmail.com>2022-01-09 13:51:08 +0100
commit04e2312b458d0448bf39bd94a1770c0710c8f255 (patch)
tree8ad7a37f848abca2ff7b96439b66608b7e4d6216 /src/analysis
parent93df32b34b80da4d62644004160294d1d068a934 (diff)
parent0896e76ad5f604a2111d3f37f13f14f890a1e160 (diff)
Merge branch 'master' into refractor-analysis
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/analysis.odin19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/analysis/analysis.odin b/src/analysis/analysis.odin
index c0da0b6..bf5dd57 100644
--- a/src/analysis/analysis.odin
+++ b/src/analysis/analysis.odin
@@ -566,7 +566,7 @@ is_symbol_same_typed :: proc(ast_context: ^AstContext, a, b: index.Symbol, flags
case index.SymbolBasicValue:
return a.name == b.name && a.pkg == b.pkg
case index.SymbolStructValue, index.SymbolEnumValue, index.SymbolUnionValue, index.SymbolBitSetValue:
- return a.name == b.name && a.pkg == b.pkg;
+ return a.name == b.name && a.pkg == b.pkg;
case index.SymbolSliceValue:
b_value := b.value.(index.SymbolSliceValue);
@@ -696,7 +696,7 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
next_fn: if f, ok := resolve_type_expression(ast_context, arg_expr); ok {
- if ast_context.call == nil || len(ast_context.call.args) == 0 {
+ if call_expr == nil || len(call_expr.args) == 0 {
append(&candidates, f);
break next_fn;
}
@@ -740,7 +740,6 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
} else {
break next_fn;
}
-
} else {
call_symbol, ok = resolve_type_expression(ast_context, arg);
}
@@ -749,6 +748,15 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
break next_fn;
}
+ if p, ok := call_symbol.value.(index.SymbolProcedureValue); ok {
+ if len(p.return_types) != 1 {
+ break next_fn;
+ }
+ if s, ok := resolve_type_expression(ast_context, p.return_types[0].type); ok {
+ call_symbol = s;
+ }
+ }
+
if procedure.arg_types[i].type != nil {
arg_symbol, ok = resolve_type_expression(ast_context, procedure.arg_types[i].type);
} else {
@@ -761,15 +769,14 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou
if !is_symbol_same_typed(ast_context, call_symbol, arg_symbol, procedure.arg_types[i].flags) {
break next_fn;
- }
-
+ }
}
append(&candidates, f);
}
}
}
-
+
if len(candidates) > 1 {
return index.Symbol {
type = candidates[0].type,