aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2020-11-15 13:48:23 +0100
committerDanielGavin <danielgavin5@hotmail.com>2020-11-15 13:48:23 +0100
commit9a3ecb59bc74a9c60964bfd0300d2d977c426a07 (patch)
tree021ceba0e5841c89ec993098e47b47e71fafa483 /src/server
parent4bae0e4fb64df97a28187898e606dc8dfb30c8d9 (diff)
type inference for proc calls with multiple returns
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin47
-rw-r--r--src/server/documents.odin2
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);
}