facebook / buck2

Build system, successor to Buck
https://buck2.build/
Apache License 2.0
3.51k stars 215 forks source link

rust-project: invalid method resolution for Jujutsu dep graph #747

Closed thoughtpolice closed 3 weeks ago

thoughtpolice commented 4 weeks ago

I have a port of Jujutsu to use Buck2 instead of Cargo in this branch, and rust-project can almost get it working inside vscode and similar tools. However, there seems to be a dependency graph bug that prevents it from actually working.

git clone https://github.com/martinvonz/jj
git checkout -b push-qvrktsnwpkzu origin/push-qvrktsnwpkzu

Put the following code inside .vscode/settings.json so that Visual Studio Code can open the project with Buck — I'll add this to the upstream branch after the next release on 9-1-2024, as it requires https://github.com/facebook/buck2/pull/745 (which was merged today):

diff --git a/.vscode/settings.json b/.vscode/settings.json
index 520f7a9f54..6972a4738c 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,4 +9,16 @@
         "BUILD": "starlark",
         "PACKAGE": "starlark",
     },
+    "rust-analyzer.workspace.discoverConfig": {
+        "command": [
+            "rust-project",
+            "develop-json",
+            "--sysroot-mode=rustc",
+            "{arg}",
+        ],
+        "progressLabel": "rust-analyzer (buck2)",
+        "filesToWatch": [
+            "BUILD"
+        ],
+    }
 }

Now open cli/src/cli_util.rs and notice the red squiggly lines:

image

The problem is this line:

        self.commit_summary_template().format(commit, formatter)

commit_summary_template() returns a TemplateRender which implements a Template trait containing a format() method: https://github.com/martinvonz/jj/blob/b05593fdf556f71da9fe636d573c98da36892dae/cli/src/templater.rs#L668

pub fn format(&self, context: &C, formatter: &mut dyn Formatter) -> io::Result<()>

However, with Buck, when I look at the original line in the editor, the error is under .format(), like in the above screenshot, because instead the call is resolved to a method in itertools instead https://docs.rs/itertools/latest/itertools/trait.Itertools.html#method.format — if I "Go to definition" on that bad method, it does in fact drop me inside the itertools source code, so it does in fact look like the behavior is self consistent if nothing else.

This seems to be the last major roadblock to getting rust-project working with Jujutsu, but it seems tricky, so I'm not sure what could be wrong. This may require further work in rust-analyzer upstream to fix too, but I think this is a useful and important test case, at least!

/cc @davidbarsky

thoughtpolice commented 3 weeks ago

This was actually a symptom of sysroot_src being improperly configured for rust-project, which is fixed by https://github.com/facebook/buck2/pull/756 (and it being OSS only would explain why much more complicated crate graphs worked just fine inside Meta)