@@ -2862,8 +2862,8 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, options: ResolveOptions) Error
28622862 defer analyser .arena .free (lineage );
28632863
28642864 const tag = offsets .identifierTokenToNameSlice (tree , tree .nodeMainToken (node ));
2865- const decl = (try analyser .lookupSymbolFieldInit (handle , tag , node , lineage [1.. ])) orelse return Type .fromIP (analyser , .enum_literal_type , null );
2866- return decl .resolveType (analyser );
2865+ const decl , const type_maybe = (try analyser .lookupSymbolFieldInit (handle , tag , node , lineage [1.. ])) orelse return Type .fromIP (analyser , .enum_literal_type , null );
2866+ return type_maybe orelse decl .resolveType (analyser );
28672867 },
28682868
28692869 .unreachable_literal = > return Type .fromIP (analyser , .noreturn_type , null ),
@@ -4345,6 +4345,7 @@ pub const Type = struct {
43454345 }
43464346
43474347 pub fn resolveDeclLiteralResultType (ty : Type ) Type {
4348+ std .debug .assert (ty .is_type_val );
43484349 var result_type = ty ;
43494350 while (true ) {
43504351 result_type = switch (result_type .data ) {
@@ -6363,7 +6364,7 @@ pub fn lookupSymbolFieldInit(
63636364 field_name : []const u8 ,
63646365 node : Ast.Node.Index ,
63656366 ancestors : []const Ast.Node.Index ,
6366- ) Error ! ? DeclWithHandle {
6367+ ) Error ! ? struct { DeclWithHandle , ? Type } {
63676368 var container_type = (try analyser .resolveExpressionType (
63686369 handle ,
63696370 node ,
@@ -6385,27 +6386,38 @@ pub fn lookupSymbolFieldInit(
63856386 else = > false ,
63866387 };
63876388
6388- container_type = try container_type
6389- .resolveDeclLiteralResultType ()
6390- . instanceTypeVal (analyser ) orelse container_type ;
6389+ container_type = try container_type . typeOf ( analyser );
6390+ container_type = container_type .resolveDeclLiteralResultType ();
6391+ container_type = try container_type . instanceUnchecked (analyser );
63916392
63926393 if (is_struct_init ) {
6393- return try container_type .lookupSymbol (analyser , field_name );
6394+ const decl = try container_type .lookupSymbol (analyser , field_name ) orelse return null ;
6395+ return .{ decl , null };
6396+ }
6397+
6398+ switch (container_type .data ) {
6399+ .union_tag = > | t | {
6400+ const decl = try t .lookupSymbol (analyser , field_name ) orelse return null ;
6401+ return .{ decl , container_type };
6402+ },
6403+ else = > {},
63946404 }
63956405
63966406 switch (container_type .getContainerKind () orelse return null ) {
63976407 .keyword_struct , .keyword_opaque = > {},
6398- .keyword_enum = > if (try (try container_type .typeOf (analyser )).lookupSymbol (analyser , field_name )) | ty | return ty ,
6399- .keyword_union = > if (try container_type .lookupSymbol (analyser , field_name )) | ty | return ty ,
6408+ .keyword_enum = > if (try (try container_type .typeOf (analyser )).lookupSymbol (analyser , field_name )) | decl | return .{ decl , null } ,
6409+ .keyword_union = > if (try container_type .lookupSymbol (analyser , field_name )) | decl | return .{ decl , null } ,
64006410 else = > return null ,
64016411 }
64026412
64036413 // Assume we are doing decl literals
64046414 const decl = try (try container_type .typeOf (analyser )).lookupSymbol (analyser , field_name ) orelse return null ;
64056415 var resolved_type = try decl .resolveType (analyser ) orelse return null ;
64066416 resolved_type = try analyser .resolveReturnType (resolved_type ) orelse resolved_type ;
6417+ resolved_type = try resolved_type .typeOf (analyser );
64076418 resolved_type = resolved_type .resolveDeclLiteralResultType ();
6408- if (resolved_type .eql (container_type ) or resolved_type .eql (try container_type .typeOf (analyser ))) return decl ;
6419+ resolved_type = try resolved_type .instanceUnchecked (analyser );
6420+ if (resolved_type .eql (container_type )) return .{ decl , null };
64096421 return null ;
64106422}
64116423
@@ -6448,8 +6460,9 @@ pub fn resolveExpressionTypeFromAncestors(
64486460 const field_name_token = tree .firstToken (node ) - 2 ;
64496461 if (tree .tokenTag (field_name_token ) != .identifier ) return null ;
64506462 const field_name = offsets .identifierTokenToNameSlice (tree , field_name_token );
6451- if (try analyser .lookupSymbolFieldInit (handle , field_name , ancestors [0 ], ancestors [1.. ])) | field_decl | {
6452- return try field_decl .resolveType (analyser );
6463+ if (try analyser .lookupSymbolFieldInit (handle , field_name , ancestors [0 ], ancestors [1.. ])) | field | {
6464+ const decl , const type_maybe = field ;
6465+ return type_maybe orelse try decl .resolveType (analyser );
64536466 }
64546467 }
64556468 },
@@ -6591,8 +6604,8 @@ pub fn resolveExpressionTypeFromAncestors(
65916604
65926605 var fn_type = if (tree .nodeTag (call .ast .fn_expr ) == .enum_literal ) blk : {
65936606 const field_name = offsets .identifierTokenToNameSlice (tree , tree .nodeMainToken (call .ast .fn_expr ));
6594- const decl = try analyser .lookupSymbolFieldInit (handle , field_name , call .ast .fn_expr , ancestors ) orelse return null ;
6595- const ty = try decl .resolveType (analyser ) orelse return null ;
6607+ const decl , const type_maybe = try analyser .lookupSymbolFieldInit (handle , field_name , call .ast .fn_expr , ancestors ) orelse return null ;
6608+ const ty = type_maybe orelse try decl .resolveType (analyser ) orelse return null ;
65966609 break :blk try analyser .resolveFuncProtoOfCallable (ty ) orelse return null ;
65976610 } else blk : {
65986611 const ty = try analyser .resolveTypeOfNode (.of (call .ast .fn_expr , handle )) orelse return null ;
@@ -6852,7 +6865,7 @@ pub fn getSymbolEnumLiteral(
68526865 handle : * DocumentStore.Handle ,
68536866 source_index : usize ,
68546867 name : []const u8 ,
6855- ) Error ! ? DeclWithHandle {
6868+ ) Error ! ? struct { DeclWithHandle , ? Type } {
68566869 const tracy_zone = tracy .trace (@src ());
68576870 defer tracy_zone .end ();
68586871
0 commit comments