Checking C# Syntax from the Command Line
c#, syntastic, syntax-checking, vim
Solution
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.
Problem
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.