Example #1
0
        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!");
        }
Example #2
0
        /// <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;
        }