static void Main(string[] args) { if (args == null || args.Length != 2) { Console.WriteLine("Usage: cs2html [.cs file path] [Save path]"); return; } var code = ""; Console.WriteLine("Input: {0}", args[0]); Console.WriteLine("SavePath: {0}", args[1]); var hoge = new StreamReader(args[0]); hoge.Close(); using (var reader = new StreamReader(args[0])) { code = reader.ReadToEnd(); } var builder = new HtmlBuilder(args[0]); var walker = new SampleSyntaxWalker(); walker.Analyze(code, builder); using (var writer = new StreamWriter(args[1])) { writer.WriteLine(builder.BuildHtml()); } Console.WriteLine("Finished!"); }
/// <summary> /// コードの解析を行い、builderに記録します /// </summary> public void Analyze(string code, HtmlBuilder builder) { this.builder = builder; // コードを解析して構文木を作成 var tree = CSharpSyntaxTree.ParseText(code); // 解析結果から診断を取得 foreach (var item in tree.GetDiagnostics()) { this.builder.AppendSyntaxDiagnostic(item); } // コンパイル環境を用意 var compilation = CSharpCompilation.Create("sample", syntaxTrees: new[] { tree }, references: new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }); // セマンティックモデル(構文木を走査してNameSyntaxなどの意味を解釈したもの)を取得 semanticModel = compilation.GetSemanticModel(tree); // 解析結果から診断を取得 foreach (var item in compilation.GetDiagnostics()) { this.builder.AppendSemanticDiagnostic(item); } // 各トークンを見ていく foreach (var token in tree.GetRoot().DescendantTokens()) { this.VisitToken(token); } // 初期化 this.builder = null; this.semanticModel = null; }