SourceBrowser 的源码流程(待继续细化)

发布时间 2023-12-19 22:29:03作者: 孤海飞雁
先读取 sln 项目里的文件,csorpj,在读取cs等文件,创建输出文件夹

会生成一个类似集合对象,里面有你的代码文件,然后遍历集合,找出代码文件

如 xx.cs文件,然后读取 cs 文件里的代码  ,还有一些roslyn  读取 语法根,获取语义模型异步,获取文档范围 rangs
部分该不太确定具体意义

根据 cs文件名称创建 html文件,
然后通过 StreamWriter( html文件地址) 写入数据待文件

然后读取rangs  中的 text, 理解文本所在的位置,读取这个位置的文本[0-20]  为 // <auto-generated/>
有实现则会生成链接连接到实现处,没有则展示

检查这个文本有没有实现
1 有实现(例如 A a=new() 自定义对象)
会先获取 当前 rangs 里 获取 token,然后 rang,token  去获取 GetSymbol  获取 符号们就是有没有实现(此处系统的如system.write() 等 要有 网上的程序集集合才能获取到)
    
然后 判断 程序集 ISymbol 的种类

var typeSymbol = symbol as ITypeSymbol;
            string symbolId = SymbolIdService.GetId(symbol);
            var location = symbol.Locations[0];
            string destinationAssemblyName = null;
            if (location.IsInSource)
            {
                //生成有元数据的链接
                result = GenerateHyperlink(symbol, symbolId, location.SourceTree, out destinationAssemblyName);
            }

然后 生成链接
链接主要有  程序cs名称,加上 ISymbol   生成的 的id (由程序名称的 MD5 获取 hash 在转化字符 )
链接例子:  A.cs.html#666fbff426dc92fc
        return new HtmlElementInfo
        {
            Name = "a",
            Attributes =
                {
                    { "href", href },
                }
        };


2 没实现  (public class a)
则通过 stringbuild  拼接文本  生成html代码

<span class="comment">// <auto-generated/></span>

然后写入









在读取 项目里的所有cs文件并创建对应html,

遍历读取cs文件,有些类,方法 有实现的添加链接并写入