aboutsummaryrefslogtreecommitdiff
path: root/src/server/analysis.odin
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin@Daniels-MacBook-Air.local>2023-06-18 12:39:21 +0200
committerDaniel Gavin <danielgavin@Daniels-MacBook-Air.local>2023-06-18 12:39:21 +0200
commitaa191c9a55cec48025dbc125be4bd51d5a7545b0 (patch)
treedaa71f05aab10d92a81588b4922a9fc8b60fa527 /src/server/analysis.odin
parentb36ed688de204602303f40bab29359d3e984c9ed (diff)
Make sure that sliced expressions return slices.
Diffstat (limited to 'src/server/analysis.odin')
-rw-r--r--src/server/analysis.odin31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index 5d9fbe6..a312d6a 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1244,7 +1244,7 @@ internal_resolve_type_expression :: proc(
case ^Paren_Expr:
return internal_resolve_type_expression(ast_context, v.expr)
case ^Slice_Expr:
- return internal_resolve_type_expression(ast_context, v.expr)
+ return resolve_slice_expression(ast_context, v)
case ^Tag_Expr:
return internal_resolve_type_expression(ast_context, v.expr)
case ^Helper_Type:
@@ -1983,6 +1983,35 @@ expand_struct_usings :: proc(
return {names = names[:], types = types[:], ranges = ranges[:]}
}
+resolve_slice_expression :: proc(
+ ast_context: ^AstContext,
+ slice_expr: ^ast.Slice_Expr,
+) -> (
+ symbol: Symbol,
+ ok: bool,
+) {
+ symbol = resolve_type_expression(ast_context, slice_expr.expr) or_return
+
+ expr: ^ast.Expr
+
+ #partial switch v in symbol.value {
+ case SymbolSliceValue:
+ expr = v.expr
+ case SymbolFixedArrayValue:
+ expr = v.expr
+ case SymbolDynamicArrayValue:
+ expr = v.expr
+ case:
+ return {}, false
+ }
+
+ symbol.value = SymbolSliceValue {
+ expr = expr,
+ }
+
+ return symbol, true
+}
+
resolve_comp_literal :: proc(
ast_context: ^AstContext,
position_context: ^DocumentPositionContext,