我正在寻找一组.cs文件来查看哪些调用a的Value属性Nullable<T>(查找所有引用).例如,这将匹配:
class Program
{
static void Main()
{
int? nullable = 123;
int value = nullable.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了Roslyn并查看了一些样本,但其中许多已经过时且API非常庞大.我该怎么做呢?
解析语法树后我陷入困境.这是我到目前为止:
public static void Analyze(string sourceCode)
{
var tree = CSharpSyntaxTree.ParseText(sourceCode);
tree./* ??? What goes here? */
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个用于创建.NET UML Sequence Diagrams的开源项目,该项目利用了一个名为js-sequence-diagrams的javascript库.我不确定Roslyn是否适合这项工作,但我认为我会试一试,所以我总结了一些概念验证代码,它试图获取所有方法及其调用,然后以一种形式输出这些调用.可以用js-sequence-diagrams来解释.
代码生成一些输出,但它不捕获所有内容.我似乎无法通过扩展方法捕获调用,静态类中的静态方法的调用.
我确实看到了带out参数的方法调用,但没有以任何形式扩展BaseMethodDeclarationSyntax
这是代码(请记住,这是概念代码的证明,所以我没有完全遵循最佳实践,但我不是在这里请求代码审查...另外,我习惯使用任务所以我在搞乱等待,但我不完全确定我正在使用它)
https://gist.github.com/SoundLogic/11193841
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Emit;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.FindSymbols;
using System.Collections.Immutable;
namespace Diagrams
{
class Program
{
static void Main(string[] args)
{
string solutionName = "Diagrams";
string solutionExtension = ".sln";
string solutionFileName = solutionName + solutionExtension;
string rootPath = @"C:\Workspace\";
string solutionPath = rootPath + solutionName + @"\" + solutionFileName;
MSBuildWorkspace workspace = MSBuildWorkspace.Create(); …Run Code Online (Sandbox Code Playgroud) 我正在使用Roslyn创建一个分析器,当特定类以不同步的方式暴露其字段时,该分析器会警告用户,以帮助防止竞争条件.
我目前有工作代码检查以确保字段是私有的.我遇到了最后一块拼图的麻烦:找出一种方法来确保所有字段只能在一个锁定块内访问,因此它们(表面上)是同步的.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.FindSymbols;
namespace RaceConditions
{
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class UnsynchronizedMemberAccess : DiagnosticAnalyzer
{
public const string DiagnosticId = "UnsynchronizedMemberAccess";
internal static readonly LocalizableString Title = "UnsynchronizedMemberAccess Title";
private static readonly LocalizableString MessageFormat = "Unsychronized fields are not thread-safe";
private static readonly LocalizableString Description = "Accessing fields without a get/set methods synchronized with each other and the constructor may lead to …Run Code Online (Sandbox Code Playgroud)