Fixed enum completion generation
This commit is contained in:
		
							parent
							
								
									4e753338af
								
							
						
					
					
						commit
						962327425d
					
				@ -2662,6 +2662,29 @@ fn makeScopeInternal(
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const container_decl = switch (node_tag) {
 | 
				
			||||||
 | 
					            .container_decl, .container_decl_trailing => tree.containerDecl(node_idx),
 | 
				
			||||||
 | 
					            .container_decl_arg, .container_decl_arg_trailing => tree.containerDeclArg(node_idx),
 | 
				
			||||||
 | 
					            .container_decl_two, .container_decl_two_trailing => blk: {
 | 
				
			||||||
 | 
					                var buffer: [2]ast.Node.Index = undefined;
 | 
				
			||||||
 | 
					                break :blk tree.containerDeclTwo(&buffer, node_idx);
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            .tagged_union, .tagged_union_trailing => tree.taggedUnion(node_idx),
 | 
				
			||||||
 | 
					            .tagged_union_enum_tag, .tagged_union_enum_tag_trailing => tree.taggedUnionEnumTag(node_idx),
 | 
				
			||||||
 | 
					            .tagged_union_two, .tagged_union_two_trailing => blk: {
 | 
				
			||||||
 | 
					                var buffer: [2]ast.Node.Index = undefined;
 | 
				
			||||||
 | 
					                break :blk tree.taggedUnionTwo(&buffer, node_idx);
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            else => null,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Only tagged unions and enums should pass this
 | 
				
			||||||
 | 
					        const can_have_enum_completions = if (container_decl) |container| blk: {
 | 
				
			||||||
 | 
					            const kind = token_tags[container.ast.main_token];
 | 
				
			||||||
 | 
					            break :blk kind != .keyword_struct and
 | 
				
			||||||
 | 
					                (kind != .keyword_union or container.ast.enum_token != null or container.ast.arg != 0);
 | 
				
			||||||
 | 
					        } else false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (ast_decls) |*ptr_decl| {
 | 
					        for (ast_decls) |*ptr_decl| {
 | 
				
			||||||
            const decl = ptr_decl.*;
 | 
					            const decl = ptr_decl.*;
 | 
				
			||||||
            if (tags[decl] == .@"usingnamespace") {
 | 
					            if (tags[decl] == .@"usingnamespace") {
 | 
				
			||||||
@ -2682,6 +2705,8 @@ fn makeScopeInternal(
 | 
				
			|||||||
                try tests.append(allocator, decl);
 | 
					                try tests.append(allocator, decl);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (!can_have_enum_completions)
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const container_field = switch (tags[decl]) {
 | 
					            const container_field = switch (tags[decl]) {
 | 
				
			||||||
                .container_field => tree.containerField(decl),
 | 
					                .container_field => tree.containerField(decl),
 | 
				
			||||||
@ -2691,35 +2716,6 @@ fn makeScopeInternal(
 | 
				
			|||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (container_field) |field| {
 | 
					            if (container_field) |field| {
 | 
				
			||||||
                const empty_field = field.ast.type_expr == 0 and field.ast.value_expr == 0;
 | 
					 | 
				
			||||||
                if (empty_field and node_tag == .root) {
 | 
					 | 
				
			||||||
                    continue;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                const container_decl = switch (node_tag) {
 | 
					 | 
				
			||||||
                    .container_decl, .container_decl_trailing => tree.containerDecl(node_idx),
 | 
					 | 
				
			||||||
                    .container_decl_arg, .container_decl_arg_trailing => tree.containerDeclArg(node_idx),
 | 
					 | 
				
			||||||
                    .container_decl_two, .container_decl_two_trailing => blk: {
 | 
					 | 
				
			||||||
                        var buffer: [2]ast.Node.Index = undefined;
 | 
					 | 
				
			||||||
                        break :blk tree.containerDeclTwo(&buffer, node_idx);
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    .tagged_union, .tagged_union_trailing => tree.taggedUnion(node_idx),
 | 
					 | 
				
			||||||
                    .tagged_union_enum_tag, .tagged_union_enum_tag_trailing => tree.taggedUnionEnumTag(node_idx),
 | 
					 | 
				
			||||||
                    .tagged_union_two, .tagged_union_two_trailing => blk: {
 | 
					 | 
				
			||||||
                        var buffer: [2]ast.Node.Index = undefined;
 | 
					 | 
				
			||||||
                        break :blk tree.taggedUnionTwo(&buffer, node_idx);
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    else => null,
 | 
					 | 
				
			||||||
                };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (container_decl) |container| {
 | 
					 | 
				
			||||||
                    const kind = token_tags[container.ast.main_token];
 | 
					 | 
				
			||||||
                    if (empty_field and
 | 
					 | 
				
			||||||
                        (kind == .keyword_struct or (kind == .keyword_union and container.ast.arg == 0)))
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (!std.mem.eql(u8, name, "_")) {
 | 
					                if (!std.mem.eql(u8, name, "_")) {
 | 
				
			||||||
                    try enum_completions.put(allocator, .{
 | 
					                    try enum_completions.put(allocator, .{
 | 
				
			||||||
                        .label = name,
 | 
					                        .label = name,
 | 
				
			||||||
@ -2731,7 +2727,6 @@ fn makeScopeInternal(
 | 
				
			|||||||
                    }, {});
 | 
					                    }, {});
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (try scopes.items[scope_idx].decls.fetchPut(name, .{ .ast_node = decl })) |existing| {
 | 
					            if (try scopes.items[scope_idx].decls.fetchPut(name, .{ .ast_node = decl })) |existing| {
 | 
				
			||||||
                // TODO Record a redefinition error.
 | 
					                // TODO Record a redefinition error.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user