zigtools / zls

A Zig language server supporting Zig developers with features like autocomplete and goto definition
MIT License
2.99k stars 297 forks source link

Rename of enum field does not rename references. #2048

Open smallkirby opened 1 month ago

smallkirby commented 1 month ago

Zig Version

0.14.0-dev.1820+ea527f7a8

ZLS Version

0.14.0-dev.167+063d7ff

Client / Code Editor / Extensions

Visual Studio Code-1.94.0

Steps to Reproduce and Observed Behavior

Init new project with zig init. Edit main.zig as follows:

const std = @import("std");
const log = std.log;

const SomeEnum = enum(u8) {
    zero,
    one,
    two,
};

pub fn main() !void {
    const e = SomeEnum.two;
    switch (e) {
        .zero => log.info("zero", .{}),
        .one => log.info("one", .{}),
        .two => log.info("two", .{}),
    }
}

Right click the field of enum SomeEnum, for example zero, to rename. Enter new name and press enter. The field name is successfully renamed but its usages, .zero in the switch in this example, are not renamed.

Expected Behavior

Enum field itself and all the usages are renamed.

Relevant log output

No response

Notes

This would be the continuation of #2042. By #2043, the rename operation itself stopped failing. But it still does not work as expected.

srijan-paul commented 1 month ago

So this one is a little harder to tackle, because ZLS cannot infer enum types like the zig compiler can, and the compiler itself does not expose an API to query type information after the Sema phase. Though maybe in cases like this where there can only be one obvious type that .zero belongs to, we can use the AST to find references? Worth trying.