分析 C# 代码以实现上下文感知语义突出显示
本文关键字:语义 显示 感知 上下文 代码 实现 分析 | 更新日期: 2023-09-27 18:35:34
我正在为 VS 开发一个语义高亮插件。在这里,您可以看到一个网络示例。
目标: 获取所有变量并为每个变量创建不同的分类。
问题: 从代码中获取变量,而无需编写 C# 词法分析器。
我目前的方法使用ITagger。我使用 ITagAggregator 来获取传递给 ITagger 的所有跨度的标签。然后我过滤它们并仅获得具有"标识符"分类的跨度,其中包括变量、方法名称、类名、用法和属性。
public class Classifier : ITagger<ClassificationTag> {
public IEnumerable<ITagSpan<ClassificationTag>> GetTags(NormalizedSnapshotSpanCollection spans) {
ITextSnapshot snapshot = spans[0].Snapshot;
var tags = _aggregator.GetTags(spans).Where((span) => span.Tag.ClassificationType.Classification.Equals("identifier")).ToArray();
foreach(var classifiedSpan in tags) {
foreach(SnapshotSpan span in classifiedSpan.Span.GetSpans(snapshot)) {
//generate classification based on variable name
yield return new TagSpan<ClassificationTag>(span, new ClassificationTag(_classification));
}
}
}
}
使用内置的 C# Lexer 来获取捆绑到一堆元数据的所有变量的列表会容易得多。这些数据可用于插件开发吗?如果没有,有没有其他方法可以获取它?
问题:无需编写 C# 词法分析器即可从代码中获取变量。
罗斯林可以做到这一点:https://roslyn.codeplex.com/
甚至还有一个语法可视化工具示例可能会让你感兴趣。我还找到了一个使用 Roslyn 创建语法荧光笔的示例。
Visual Studio将该信息公开为代码模型。
下面是一个示例,如何访问类,然后在类上查找属性,并分析属性参数:
从 DTE 访问属性信息
下面是有关代码模型的详细信息:http://msdn.microsoft.com/en-us/library/ms228763.aspx
这里还有我很少使用的自动化对象模型图表:http://msdn.microsoft.com/en-us/library/za2b25t3.aspx
此外,如前所述,罗斯林确实也是一个可能的选择。以下是使用 roslyn 的 VS2015 示例: https://github.com/tomasr/roslyn-colorizer/blob/master/RoslynColorizer/RoslynColorizer.cs
对于构建语言工具,最好使用C#的解析器生成器。GOLD解析系统就是这样一个可以处理LALR语法的工具包。它具有基于 .NET 组件的引擎,您可以在项目中使用它,并且可用于与任何 IDE 集成。您还可以找到各种编程语言(包括 C#)的语法。