phmonte / Buildalyzer

A utility to perform design-time builds of .NET projects without having to think too hard about it.
MIT License
610 stars 94 forks source link

Making the library language-agnostic #278

Open LPeter1997 opened 4 months ago

LPeter1997 commented 4 months ago

Hey, this looks like a lovely library, than you for easing the pain of setting up design-time builds!

We are working on a new .NET language, Draco and we'd love to use this library to extract references for example for our language server. Unfortunately from what I gathered, the library has only the 3 main .NET langs hardcoded for command parsing: C#, VB and F#, so we can't exactly extract that data for a custom language.

Is there any chance for this limitation to be eliminated? While I didn't dig deep into the library, I imagine we'd need to introduce an interface like so:

interface ICommandParser
{
    // Lang name tag, optional
    string Language { get; }

    // Returns true, if this parser can handle the compiler that's being invoked. Replaces ProcessFscCommandLine, ProcessCscCommandLine, ...
    bool IsLanguageCompilerInvocation(object sender, BuildMessageEventArgs e);

    // Replaces Compiler.CommandLine.Parse
    CompilerCommand Parse(DirectoryInfo? baseDir, string commandLine);
}

And then have a collection of these language parsers, AnalyzerManager or AnalyzerManagerOptions looks like an OK place for this. By default, the existing languages (C#, VB and F#) would have an implementation for this interface, but consumers of the package could implement this interface for any language they'd want.

Let me know what you think!

phmonte commented 3 months ago

Hello @LPeter1997 , I don't see any problems, this limitation exists because we use msbuild, as you said, it is necessary to implement the equivalent methods for other languages.

phmonte commented 2 months ago

@LPeter1997 have you seen Corniel's implementation? Do you think it makes sense to you?