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

先读取 sln 项目里的文件,这里会读取到对应的项目,里面可以找到 在读取cs等文件,创建输出文件夹

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

如 xx.cs文件,然后读取 cs 文件里的代码 ,还有一些roslyn 读取 语法根,获取语义模型异步,获取文档范围 rangs,创建委托
部分该不太确定具体意义
SourceText res = await _document.GetTextAsync();
Root = await _document.GetSyntaxRootAsync();//获取语法根
SemanticModel = await _document.GetSemanticModelAsync();//获取语义模型异步

 


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

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

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

然后 判断 程序集 ISymbol 的种类
if ((symbol.Kind == SymbolKind.Event ||
symbol.Kind == SymbolKind.Field ||
symbol.Kind == SymbolKind.Method ||
symbol.Kind == SymbolKind.NamedType ||
symbol.Kind == SymbolKind.Property) &&
symbol.Locations.Length >= 1)

 

然后 生成链接
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 },
}
};

通过 stringbuild 拼接文本 生成html代码
<span class="comment">// <auto-generated/></span>

然后写入StreamWriter
2 没实现 (public class a)
则通过 stringbuild 拼接都出来的文本 生成html代码

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

然后写入StreamWriter

 

 

 

 

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

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

posted @ 2023-12-19 22:24  孤海飞雁  阅读(10)  评论(0编辑  收藏  举报