Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking C# Syntax from the Command Line

Does anyone know of a way in the Microsoft .NET framework to check the syntax, and only the syntax, of a given C# file?

For a little background, what I am interested in doing is setting up syntastic to check the syntax of .cs files. Out of the box, syntastic uses the Mono C# compiler with its --parse flag to perform this operation but I can find no equivalent in the Microsoft .NET framework.

My first attempt to get this to work was to use csc /target:library /nologo in place of mcs --parse, but the problem is that this is called on a per-file basis. As a result, it reports missing namespaces (which exist in the full project build) instead of only syntactic errors.

like image 269
Michael Avatar asked Dec 10 '12 22:12

Michael


2 Answers

You can do this via the Roslyn CTP. It allows you to parse the .cs file entirely, and walk the full tree, looking for errors.

For details, I recommend downloading the Walkthrough: Getting Started with Syntax Analysis for C#, as it shows you the basic approach to looking at syntax trees in a C# file.

like image 94
Reed Copsey Avatar answered Sep 21 '22 10:09

Reed Copsey


I've used NRefactory before from the icsharpcode IDE. It's quick and easy for basic stuff.

see this article: Using NRefactory for analyzing C# code

I use it for creating VB.NET examples from C# examples. The method that does this is really straight-forward and can easily be adapted to your needs:

    private static void ConvertLanguage(TextReader input, TextWriter output, SupportedLanguage language, Action<string> onError)
    {
        using (IParser parser = ParserFactory.CreateParser(language, input))
        {
            parser.Parse();
            var specials = parser.Lexer.SpecialTracker.RetrieveSpecials();
            var result = parser.CompilationUnit;
            //if (parser.Errors.Count > 0)
            //    MessageBox.Show(parser.Errors.ErrorOutput, "Parse errors");

            IOutputAstVisitor outputVisitor;
            if (language == SupportedLanguage.CSharp)
                outputVisitor = new VBNetOutputVisitor();
            else
                outputVisitor = new CSharpOutputVisitor();

            outputVisitor.Options.IndentationChar = ' ';
            outputVisitor.Options.IndentSize = 4;
            outputVisitor.Options.TabSize = 4;

            using (SpecialNodesInserter.Install(specials, outputVisitor))
                result.AcceptVisitor(outputVisitor, null);

            if (outputVisitor.Errors.Count > 0 && onError != null)
                onError(outputVisitor.Errors.ErrorOutput);

            output.Write(outputVisitor.Text);
        }
    }

Note: The preceding code is from an older version and may not compile against the latest version of the NRefactory library.

like image 21
csharptest.net Avatar answered Sep 24 '22 10:09

csharptest.net