Fixed for zig master branch
This commit is contained in:
		
							parent
							
								
									1c725f85aa
								
							
						
					
					
						commit
						bda78e1f76
					
				
							
								
								
									
										127
									
								
								src/analysis.zig
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								src/analysis.zig
									
									
									
									
									
								
							@ -299,28 +299,22 @@ fn findReturnStatementInternal(
 | 
			
		||||
    var result: ?*ast.Node.ControlFlowExpression = null;
 | 
			
		||||
    var child_idx: usize = 0;
 | 
			
		||||
    while (base_node.iterate(child_idx)) |child_node| : (child_idx += 1) {
 | 
			
		||||
        switch (child_node.tag) {
 | 
			
		||||
            .ControlFlowExpression => blk: {
 | 
			
		||||
                const cfe = child_node.castTag(.ControlFlowExpression).?;
 | 
			
		||||
                if (cfe.kind != .Return) break :blk;
 | 
			
		||||
 | 
			
		||||
                // If we are calling ourselves recursively, ignore this return.
 | 
			
		||||
                if (cfe.rhs) |rhs| {
 | 
			
		||||
                    if (rhs.castTag(.Call)) |call_node| {
 | 
			
		||||
                        if (call_node.lhs.tag == .Identifier) {
 | 
			
		||||
                            if (std.mem.eql(u8, getDeclName(tree, call_node.lhs).?, getDeclName(tree, &fn_decl.base).?)) {
 | 
			
		||||
                                continue;
 | 
			
		||||
                            }
 | 
			
		||||
        if (child_node.castTag(.Return)) |cfe| {
 | 
			
		||||
            // If we are calling ourselves recursively, ignore this return.
 | 
			
		||||
            if (cfe.getRHS()) |rhs| {
 | 
			
		||||
                if (rhs.castTag(.Call)) |call_node| {
 | 
			
		||||
                    if (call_node.lhs.tag == .Identifier) {
 | 
			
		||||
                        if (std.mem.eql(u8, getDeclName(tree, call_node.lhs).?, getDeclName(tree, &fn_decl.base).?)) {
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
                if (already_found.*) return null;
 | 
			
		||||
                already_found.* = true;
 | 
			
		||||
                result = cfe;
 | 
			
		||||
                continue;
 | 
			
		||||
            },
 | 
			
		||||
            else => {},
 | 
			
		||||
            if (already_found.*) return null;
 | 
			
		||||
            already_found.* = true;
 | 
			
		||||
            result = cfe;
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        result = findReturnStatementInternal(tree, fn_decl, child_node, already_found);
 | 
			
		||||
@ -345,7 +339,7 @@ fn resolveReturnType(
 | 
			
		||||
        // If this is a type function and it only contains a single return statement that returns
 | 
			
		||||
        // a container declaration, we will return that declaration.
 | 
			
		||||
        const ret = findReturnStatement(handle.tree, fn_decl) orelse return null;
 | 
			
		||||
        if (ret.rhs) |rhs| {
 | 
			
		||||
        if (ret.getRHS()) |rhs| {
 | 
			
		||||
            return try resolveTypeOfNodeInternal(store, arena, .{
 | 
			
		||||
                .node = rhs,
 | 
			
		||||
                .handle = handle,
 | 
			
		||||
@ -665,7 +659,7 @@ pub fn resolveTypeOfNodeInternal(
 | 
			
		||||
                .node = slice.lhs,
 | 
			
		||||
                .handle = handle,
 | 
			
		||||
            }, bound_type_params)) orelse return null;
 | 
			
		||||
            return try resolveBracketAccessType(store, arena, left_type, .Range, bound_type_params); 
 | 
			
		||||
            return try resolveBracketAccessType(store, arena, left_type, .Range, bound_type_params);
 | 
			
		||||
        },
 | 
			
		||||
        .Deref, .UnwrapOptional => {
 | 
			
		||||
            const suffix = node.cast(ast.Node.SimpleSuffixOp).?;
 | 
			
		||||
@ -677,7 +671,7 @@ pub fn resolveTypeOfNodeInternal(
 | 
			
		||||
                .UnwrapOptional => try resolveUnwrapOptionalType(store, arena, left_type, bound_type_params),
 | 
			
		||||
                .Deref => try resolveDerefType(store, arena, left_type, bound_type_params),
 | 
			
		||||
                else => unreachable,
 | 
			
		||||
            }; 
 | 
			
		||||
            };
 | 
			
		||||
        },
 | 
			
		||||
        .ArrayAccess => {
 | 
			
		||||
            const arr_acc = node.castTag(.ArrayAccess).?;
 | 
			
		||||
@ -1337,7 +1331,96 @@ pub fn documentPositionContext(arena: *std.heap.ArenaAllocator, document: types.
 | 
			
		||||
 | 
			
		||||
fn addOutlineNodes(allocator: *std.mem.Allocator, tree: *ast.Tree, child: *ast.Node, context: *GetDocumentSymbolsContext) anyerror!void {
 | 
			
		||||
    switch (child.tag) {
 | 
			
		||||
        .StringLiteral, .IntegerLiteral, .BuiltinCall, .Call, .Identifier, .Add, .AddWrap, .ArrayCat, .ArrayMult, .Assign, .AssignBitAnd, .AssignBitOr, .AssignBitShiftLeft, .AssignBitShiftRight, .AssignBitXor, .AssignDiv, .AssignSub, .AssignSubWrap, .AssignMod, .AssignAdd, .AssignAddWrap, .AssignMul, .AssignMulWrap, .BangEqual, .BitAnd, .BitOr, .BitShiftLeft, .BitShiftRight, .BitXor, .BoolAnd, .BoolOr, .Div, .EqualEqual, .ErrorUnion, .GreaterOrEqual, .GreaterThan, .LessOrEqual, .LessThan, .MergeErrorSets, .Mod, .Mul, .MulWrap, .Period, .Range, .Sub, .SubWrap, .OrElse, .AddressOf, .Await, .BitNot, .BoolNot, .OptionalType, .Negation, .NegationWrap, .Resume, .Try, .ArrayType, .ArrayTypeSentinel, .PtrType, .SliceType, .Slice, .Deref, .UnwrapOptional, .ArrayAccess, .ControlFlowExpression, .ArrayInitializerDot, .SwitchElse, .SwitchCase, .For, .EnumLiteral, .PointerIndexPayload, .StructInitializerDot, .PointerPayload, .While, .Switch, .Else, .BoolLiteral, .NullLiteral, .Defer, .StructInitializer, .FieldInitializer, .If, .MultilineStringLiteral, .UndefinedLiteral, .AnyType, .Block, .ErrorSetDecl => return,
 | 
			
		||||
        .StringLiteral,
 | 
			
		||||
        .IntegerLiteral,
 | 
			
		||||
        .BuiltinCall,
 | 
			
		||||
        .Call,
 | 
			
		||||
        .Identifier,
 | 
			
		||||
        .Add,
 | 
			
		||||
        .AddWrap,
 | 
			
		||||
        .ArrayCat,
 | 
			
		||||
        .ArrayMult,
 | 
			
		||||
        .Assign,
 | 
			
		||||
        .AssignBitAnd,
 | 
			
		||||
        .AssignBitOr,
 | 
			
		||||
        .AssignBitShiftLeft,
 | 
			
		||||
        .AssignBitShiftRight,
 | 
			
		||||
        .AssignBitXor,
 | 
			
		||||
        .AssignDiv,
 | 
			
		||||
        .AssignSub,
 | 
			
		||||
        .AssignSubWrap,
 | 
			
		||||
        .AssignMod,
 | 
			
		||||
        .AssignAdd,
 | 
			
		||||
        .AssignAddWrap,
 | 
			
		||||
        .AssignMul,
 | 
			
		||||
        .AssignMulWrap,
 | 
			
		||||
        .BangEqual,
 | 
			
		||||
        .BitAnd,
 | 
			
		||||
        .BitOr,
 | 
			
		||||
        .BitShiftLeft,
 | 
			
		||||
        .BitShiftRight,
 | 
			
		||||
        .BitXor,
 | 
			
		||||
        .BoolAnd,
 | 
			
		||||
        .BoolOr,
 | 
			
		||||
        .Div,
 | 
			
		||||
        .EqualEqual,
 | 
			
		||||
        .ErrorUnion,
 | 
			
		||||
        .GreaterOrEqual,
 | 
			
		||||
        .GreaterThan,
 | 
			
		||||
        .LessOrEqual,
 | 
			
		||||
        .LessThan,
 | 
			
		||||
        .MergeErrorSets,
 | 
			
		||||
        .Mod,
 | 
			
		||||
        .Mul,
 | 
			
		||||
        .MulWrap,
 | 
			
		||||
        .Period,
 | 
			
		||||
        .Range,
 | 
			
		||||
        .Sub,
 | 
			
		||||
        .SubWrap,
 | 
			
		||||
        .OrElse,
 | 
			
		||||
        .AddressOf,
 | 
			
		||||
        .Await,
 | 
			
		||||
        .BitNot,
 | 
			
		||||
        .BoolNot,
 | 
			
		||||
        .OptionalType,
 | 
			
		||||
        .Negation,
 | 
			
		||||
        .NegationWrap,
 | 
			
		||||
        .Resume,
 | 
			
		||||
        .Try,
 | 
			
		||||
        .ArrayType,
 | 
			
		||||
        .ArrayTypeSentinel,
 | 
			
		||||
        .PtrType,
 | 
			
		||||
        .SliceType,
 | 
			
		||||
        .Slice,
 | 
			
		||||
        .Deref,
 | 
			
		||||
        .UnwrapOptional,
 | 
			
		||||
        .ArrayAccess,
 | 
			
		||||
        .Return,
 | 
			
		||||
        .Break,
 | 
			
		||||
        .Continue,
 | 
			
		||||
        .ArrayInitializerDot,
 | 
			
		||||
        .SwitchElse,
 | 
			
		||||
        .SwitchCase,
 | 
			
		||||
        .For,
 | 
			
		||||
        .EnumLiteral,
 | 
			
		||||
        .PointerIndexPayload,
 | 
			
		||||
        .StructInitializerDot,
 | 
			
		||||
        .PointerPayload,
 | 
			
		||||
        .While,
 | 
			
		||||
        .Switch,
 | 
			
		||||
        .Else,
 | 
			
		||||
        .BoolLiteral,
 | 
			
		||||
        .NullLiteral,
 | 
			
		||||
        .Defer,
 | 
			
		||||
        .StructInitializer,
 | 
			
		||||
        .FieldInitializer,
 | 
			
		||||
        .If,
 | 
			
		||||
        .MultilineStringLiteral,
 | 
			
		||||
        .UndefinedLiteral,
 | 
			
		||||
        .AnyType,
 | 
			
		||||
        .Block,
 | 
			
		||||
        .ErrorSetDecl,
 | 
			
		||||
        => return,
 | 
			
		||||
 | 
			
		||||
        .ContainerDecl => {
 | 
			
		||||
            const decl = child.castTag(.ContainerDecl).?;
 | 
			
		||||
 | 
			
		||||
@ -296,9 +296,9 @@ fn symbolReferencesInternal(
 | 
			
		||||
            const grouped = node.cast(ast.Node.GroupedExpression).?;
 | 
			
		||||
            try symbolReferencesInternal(arena, store, .{ .node = grouped.expr, .handle = handle }, decl, encoding, context, handler);
 | 
			
		||||
        },
 | 
			
		||||
        .ControlFlowExpression => {
 | 
			
		||||
        .Return, .Break, .Continue => {
 | 
			
		||||
            const cfe = node.cast(ast.Node.ControlFlowExpression).?;
 | 
			
		||||
            if (cfe.rhs) |rhs| {
 | 
			
		||||
            if (cfe.getRHS()) |rhs| {
 | 
			
		||||
                try symbolReferencesInternal(arena, store, .{ .node = rhs, .handle = handle }, decl, encoding, context, handler);
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
@ -563,15 +563,15 @@ fn writeNodeTokens(builder: *Builder, arena: *std.heap.ArenaAllocator, store: *D
 | 
			
		||||
            const grouped_expr = node.cast(ast.Node.GroupedExpression).?;
 | 
			
		||||
            try await @asyncCall(child_frame, {}, writeNodeTokens, .{ builder, arena, store, grouped_expr.expr });
 | 
			
		||||
        },
 | 
			
		||||
        .ControlFlowExpression => {
 | 
			
		||||
        .Return, .Break, .Continue => {
 | 
			
		||||
            const cfe = node.cast(ast.Node.ControlFlowExpression).?;
 | 
			
		||||
            try writeToken(builder, cfe.ltoken, .keyword);
 | 
			
		||||
            switch (cfe.kind) {
 | 
			
		||||
                .Break => |label| if (label) |n| try writeToken(builder, n.firstToken(), .label),
 | 
			
		||||
                .Continue => |label| if (label) |n| try writeToken(builder, n.firstToken(), .label),
 | 
			
		||||
            switch (node.tag) {
 | 
			
		||||
                .Break => if (cfe.getLabel()) |n| try writeToken(builder, n, .label),
 | 
			
		||||
                .Continue => if (cfe.getLabel()) |n| try writeToken(builder, n, .label),
 | 
			
		||||
                else => {},
 | 
			
		||||
            }
 | 
			
		||||
            try await @asyncCall(child_frame, {}, writeNodeTokens, .{ builder, arena, store, cfe.rhs });
 | 
			
		||||
            try await @asyncCall(child_frame, {}, writeNodeTokens, .{ builder, arena, store, cfe.getRHS() });
 | 
			
		||||
        },
 | 
			
		||||
        .Suspend => {
 | 
			
		||||
            const suspend_node = node.cast(ast.Node.Suspend).?;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user