aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2020-11-28 15:28:47 +0100
committerDanielGavin <danielgavin5@hotmail.com>2020-11-28 15:28:47 +0100
commite2b3dcb0a48d957dfb019e05c6ecbb5017330505 (patch)
tree7218b40081f22a5e3e5b3c3280659f588acb91c0 /src/server
parent83d18bc43bb3ecaa8ba2f8e9896a5e8334209069 (diff)
support using on struct variables.
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin55
1 files changed, 26 insertions, 29 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 39539b5..682ebd7 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -643,26 +643,15 @@ resolve_type_identifier :: proc(ast_context: ^AstContext, node: ast.Ident, expec
case Proc_Group:
return resolve_function_overload(ast_context, v);
case Selector_Expr:
-
- if ident, ok := v.expr.derived.(Ident); ok {
-
- if selector, ok := resolve_type_identifier(ast_context, ident); ok {
-
- if value, ok := selector.value.(index.SymbolPackageValue); ok {
- return resolve_symbol_return(ast_context, index.lookup(v.field.name, selector.scope));
- }
-
- }
-
- }
-
- return index.Symbol {}, false;
+ return resolve_type_expression(ast_context, local, false);
case Array_Type:
return make_symbol_generic_from_ast(ast_context, local), true;
case Dynamic_Array_Type:
return make_symbol_generic_from_ast(ast_context, local), true;
case Index_Expr:
return resolve_type_expression(ast_context, local, false);
+ case Pointer_Type:
+ return resolve_type_expression(ast_context, local, false);
case:
log.errorf("default type node kind: %T", v);
return make_symbol_generic_from_ast(ast_context, local), true;
@@ -690,25 +679,15 @@ resolve_type_identifier :: proc(ast_context: ^AstContext, node: ast.Ident, expec
case Proc_Group:
return resolve_function_overload(ast_context, v);
case Selector_Expr:
- if ident, ok := v.expr.derived.(Ident); ok {
-
- if selector, ok := resolve_type_identifier(ast_context, ident); ok {
-
- if value, ok := selector.value.(index.SymbolPackageValue); ok {
- return resolve_symbol_return(ast_context, index.lookup(v.field.name, selector.scope));
- }
-
- }
-
- }
-
- return index.Symbol {}, false;
+ return resolve_type_expression(ast_context, local, false);
case Array_Type:
return make_symbol_generic_from_ast(ast_context, global), true;
case Dynamic_Array_Type:
return make_symbol_generic_from_ast(ast_context, global), true;
case Index_Expr:
return resolve_type_expression(ast_context, global, false);
+ case Pointer_Type:
+ return resolve_type_expression(ast_context, local, false);
case:
log.errorf("default type node kind: %T", v);
return make_symbol_generic_from_ast(ast_context, global), true;
@@ -1111,10 +1090,28 @@ get_locals_using_stmt :: proc(file: ast.File, stmt: ast.Using_Stmt, ast_context:
for u in stmt.list {
- if ident, ok := u.derived.(ast.Ident); ok {
- append(&ast_context.usings, ident.name);
+ if symbol, ok := resolve_type_expression(ast_context, u, false); ok {
+
+ #partial switch v in symbol.value {
+ case index.SymbolPackageValue:
+ if ident, ok := u.derived.(ast.Ident); ok {
+ append(&ast_context.usings, ident.name);
+ }
+ case index.SymbolStructValue:
+ for name, i in v.names {
+ selector := index.new_type(ast.Selector_Expr, v.types[i].pos, v.types[i].end, context.temp_allocator);
+ selector.expr = u;
+ selector.field = index.new_type(ast.Ident, v.types[i].pos, v.types[i].end, context.temp_allocator);
+ selector.field.name = name;
+ ast_context.locals[name] = selector;
+ }
+
+ }
+
+
}
+
}
}