diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2020-11-15 13:48:23 +0100 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2020-11-15 13:48:23 +0100 |
| commit | 9a3ecb59bc74a9c60964bfd0300d2d977c426a07 (patch) | |
| tree | 021ceba0e5841c89ec993098e47b47e71fafa483 /src/server | |
| parent | 4bae0e4fb64df97a28187898e606dc8dfb30c8d9 (diff) | |
type inference for proc calls with multiple returns
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 47 | ||||
| -rw-r--r-- | src/server/documents.odin | 2 |
2 files changed, 30 insertions, 19 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index dbc8388..7d07e23 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -347,36 +347,45 @@ get_locals_value_decl :: proc(file: ast.File, value_decl: ast.Value_Decl, ast_co using ast; - if len(value_decl.names) == len(value_decl.values) { + if value_decl.type != nil { + str := common.get_ast_node_string(value_decl.names[0], file.src); + ast_context.locals[str] = value_decl.type; + return; + } - for name, i in value_decl.names { + ast_context.use_locals = true; + ast_context.use_globals = true; - str := common.get_ast_node_string(name, file.src); + results := make([dynamic]^Expr, context.temp_allocator); - if value_decl.type != nil { - ast_context.locals[str] = value_decl.type; - } + for value in value_decl.values { - else { - ast_context.locals[str] = value_decl.values[i]; - } - } + switch v in value.derived { + case Call_Expr: - } + if symbol, ok := resolve_type_expression(ast_context, v.expr, false); ok { - else { + if procedure, ok := symbol.value.(index.SymbolProcedureValue); ok { - //if there is more names to be assigned then values, it could be procedure call, map gets + for ret in procedure.return_types { + append(&results, ret.type); + } - for value in value_decl.values { + } - switch v in value.derived { - case Call_Expr: - fmt.println(); - fmt.println(); - fmt.println(v); } + case Comp_Lit: + append(&results, v.type); + } + + } + + if len(value_decl.names) == len(results) { + + for name, i in value_decl.names { + str := common.get_ast_node_string(name, file.src); + ast_context.locals[str] = results[i]; } } diff --git a/src/server/documents.odin b/src/server/documents.odin index 689e1c0..35c0940 100644 --- a/src/server/documents.odin +++ b/src/server/documents.odin @@ -201,6 +201,8 @@ document_apply_changes :: proc(uri_string: string, changes: [dynamic] TextDocume } + //log.info(string(document.text[:document.used_text])); + return document_refresh(document, config, writer, true); } |