ilya-biryukov added inline comments.

================
Comment at: clangd/BuildSystem.h:29
+/// Default compilation database used by clangd, based on the build system.
+class Integration : public GlobalCompilationDatabase {
+public:
----------------
klimek wrote:
> ilya-biryukov wrote:
> > klimek wrote:
> > > 'Integration' is a bit of a weird name, as it doesn't tell me what it 
> > > does.
> > > What I'd have expected is an abstraction like 'Workspace' (which I 
> > > believe is a domain term in IDEs) that would:
> > > -> be in some form coupled to 1 build system
> > > -> provide a file system view on the workspace
> > > -> provide the ability to watch for changed files
> > > 
> > > Then the BuildSystem would:
> > > -> provide the ability to watch for changed inputs / commands
> > > -> provide the ability to "prepare all inputs"
> > > -> potentially provide the ability to get a build graph
> > > 
> > > If Integration wants to be that, it should:
> > > - not extend GlobalCompilationDatabase
> > > - not have getCompileCommand itself
> > > 'Integration' is a bit of a weird name, as it doesn't tell me what it 
> > > does.
> > It is, sorry about that. This is not final. I intended to put this into the 
> > 'buildsystem' namespace, so it'd be used as 'buildsystem::Integration', 
> > which would make more sense.
> > 
> > > What I'd have expected is an abstraction like 'Workspace' (which I 
> > > believe is a domain term in IDEs) that would:
> > > -> be in some form coupled to 1 build system
> > > -> provide a file system view on the workspace
> > > -> provide the ability to watch for changed files
> > The abstraction you're looking for is called `BuildSystem` in this patch.
> > It is decoupled from watching for files (this is handled by 
> > FileSystemProvider), it can watch files internally but tells the users 
> > about the changes in terms of source files that had their inputs changed.
> > 
> > > Then the BuildSystem would:
> > > -> provide the ability to watch for changed inputs / commands
> > > -> provide the ability to "prepare all inputs"
> > This is exactly what `BuildSystem` does.
> > 
> > > -> potentially provide the ability to get a build graph
> > I was thinking about this as well, but still not sure if this information 
> > is better inferred by clangd when running the compiler, so decided to leave 
> > it out until we have a use-case for that.
> > 
> > 
> > > If Integration wants to be that, it should:
> > > not extend GlobalCompilationDatabase
> > > not have getCompileCommand itself
> > There is a discrepancy between the needs of the build system 
> > implementations and what clangd has at the protocol level.
> > - At the protocol level, clangd operates on the files and it needs to 
> > provide features on a per-file manner: get diagnostics for a file, run code 
> > completion in a file, format a file, etc.
> > - At the build system implementation level, we care about different things: 
> > discovering which build system is used, watching for changes to important 
> > files (`BUILD`, `CMakeLists.txt`, `compiler_commands.json`, etc.), 
> > reporting those changes to the build system users, building the generated 
> > files, providing compile commands, adding build depenndecies, etc.
> > 
> > `buildsystem::Integration` serves as a layer that ties those two together 
> > and provides an interface that higher layers of clangd are more comfortable 
> > with, e.g. a file-based interface that `GlobalCompilatioDatabase` provides.
> > 
> > My initial goal was to **replace** the `GlobalCompilationDatabase` with 
> > `Integration` and make it a non-abstract class, making it clear it just 
> > wraps build system integration into a form that's a bit more convenient for 
> > clangd uses. This turned out to be some work (we have `OverlayCDB` and test 
> > compilation databases that rely on this interface, so it's some work and 
> > it's not clear if that would make the code simpler at the end, so I decided 
> > to postpone it for now.
> > 
> So, I would still vote for separating a Workspace from a BuildSystem, as I'd 
> expect a Workspace over time to grow VCS capabilities, and I'd expect having 
> one abstractions that covers both builds and VCSs confusing.
> 
> I now understand the "Integration" layer better, but it still looks like it's 
> doing too many things:
> specificially, it seems like it's basically at the same time a single view of 
> all build systems / workspaces AND the thing that manages them - and I'd 
> definitely split that up; that is, both of these are useful but they should 
> be different classes.
> So, I would still vote for separating a Workspace from a BuildSystem, as I'd 
> expect a Workspace over time to grow VCS capabilities, and I'd expect having 
> one abstractions that covers both builds and VCSs confusing.

That makes sense to me too, but I don't have the full understanding of the VCS 
capabilities we might want to have. Something that popped up before in various 
discussions was tracking a changing VCS branch to keep separate versions of the 
index to hotswap. Will have to think more about it, thanks for the input.

> specificially, it seems like it's basically at the same time a single view of 
> all build systems / workspaces AND the thing that manages them - and I'd 
> definitely split that up; that is, both of these are useful but they should 
> be different classes.
That makes total sense, the implementation is actually split even though it's 
not visible in this patch: the private `Discovery` class handles the loading of 
the build system tree, etc.


Repository:
  rCTE Clang Tools Extra

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D54952/new/

https://reviews.llvm.org/D54952



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to