Tag: roslyn code analysis

ISymbol.DeclaringSyntaxReferences和ISymbol.Locations之间的区别

ISyntax接口中的DeclaringSyntaxReferences属性和Locations属性之间有什么区别?

Roslyn加载项目文档失败

在Visual Studio扩展(VSIX)解决方案中,我使用Roslyn从当前解决方案加载特定项目: Project myProject = this.CurrentComponentModel.GetService() .CurrentSolution.Projects .FirstOrDefault(p => p.Name == “MyProject”) 项目myProject肯定是加载的,但在检查时我看到: myProject.HasDocuments == false myProject.Documents is Empty 然而,在Visual Studio中,我可以看到大量文档。 如果我关闭解决方案并从另一个TFS分支打开相同的解决方案,则相同的代码返回: myProject.HasDocuments == true myProject.Documents is not Empty 有任何想法吗?

Appveyor nuget分析仪

我正在努力创造将我的Roslyn分析器项目打包到NuGet的好方法。 它需要特定的NuGet包结构,其中.dll放入\analyzer\ _ \analyzer\ ,而不是\lib\ 。 为此,我必须调用nuget pack .nuspec ,而不是nuget pack .csproj 。 但是如果我使用nuspec ,那么$ version $ tag会被忽略。 似乎我唯一的选择是在每次重建时手动更新.nuspec版本。 什么是正确和正确的方法来实现这一目标?

使用Roslyn,如何检查类是来自本地项目,而不是BCL或Nuget(等)?

我想写一个Roslyn代码分析器; 如果ObjectCreationExpression正在从本地类(在当前项目或当前解决方案中的项目中)创建对象,则需要解决这个问题; 或者如果该类来自其他地方,如基类库或Nuget包等。 我如何判断Roslyn的课程来自哪里?

使用msbuildworkspace打开解决方案会在没有详细信息的情况下发出诊断错

我正在尝试使用MSBuildWorkspace分析Roslyn的解决方案。 该解决方案是一种新的解决方案,其中包含2个类库项目,一个引用另一个。 它们是在Visual Studio 2017中创建的.Net 4.6.2。 当我打开解决方案时,我在workspace.Diagnostics中收到两个通用错误,两者都是:处理文件’ PathToProject时Msbuild失败’在诊断或输出窗口中没有更多内容,表明它为什么处理项目文件失败。 打开解决方案的代码: namespace RoslynAnalyse { class Program { static void Main(string[] args) { LocalAnalysis(); } private static void LocalAnalysis() { var workspace = MSBuildWorkspace.Create(); var solution = workspace.OpenSolutionAsync(@”D:\Code\Roslyn\RoslynAnalyse\SolutionToAnalyse\SolutionToAnalyse.sln”).Result; var workspaceDiagnostics = workspace.Diagnostics; } } } Microsoft.CodeAnalysis的版本是2.0.0.0。 有没有人知道为什么MSBuild失败了,我怎么能获得更多信息?

使用Roslyn CodeFixProvider向方法添加参数

我正在编写一个Roslyn代码分析器 ,我想识别async方法是否不采用CancellationToken然后建议添加它的代码修复: //Before Code Fix: public async Task Example(){} //After Code Fix public async Task Example(CancellationToken token){} 我已经通过检查methodDeclaration.ParameterList.Parameters来连接DiagnosticAnalyzer来正确报告Diagnostic,但是我找不到Roslyn API来将Paramater添加到CodeFixProvider的ParameterList 。 这是我到目前为止所得到的: private async Task HaveMethodTakeACancellationTokenParameter( Document document, SyntaxNode syntaxNode, CancellationToken cancellationToken) { var method = syntaxNode as MethodDeclarationSyntax; // what goes here? // what I want to do is: // method.ParameterList.Parameters.Add( new ParameterSyntax(typeof(CancellationToken)); //somehow return […]

如何从调用方法的InvocationExpressionSyntax节点获取IMethodSymbol或方法声明的语法节点?

在我的分析器的实现中,我在AnalyzeSymbol方法中: public override void Initialize(AnalysisContext context) { context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.Method); } private static void AnalyzeSymbol(SymbolAnalysisContext context) { // here I look through the syntax of the method body in order to find invocations. var methodSymbol = context.Symbol as IMethodSymbol; var location = methodSymbol.Locations.FirstOrDefault(); var methodNode = location.SourceTree.GetCompilationUnitRoot().FindNode(locati‌​on.SourceSpan); var blockNode = methodNode.ChildNodes().FirstOrDefault(s => s is BlockSyntax); var […]

查找所有不使用RoslyninheritanceC#类并更改为inheritance自基础对象(类似java)

我正在开发一个小Roslyn项目,包括更改解析树和将更改写回文件。 我已经开始使用独立代码分析器,并希望将其构建为命令行应用程序。 不过,我遇到了一个挑战。 使用: 查找部分使用Roslyn从特定基类派生的类 ,主要使用: https : //github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Analysis我创建了这个小项目: class Program { static void Main(string[] args) { try { if (args.Length < 1) throw new ArgumentException(); SyntaxTree tree = CSharpSyntaxTree.ParseText(File.ReadAllText(args[0])); var root = (CompilationUnitSyntax) tree.GetRoot(); var classes = from ClassDeclarationSyntax in root.DescendantNodesAndSelf() select ClassDeclarationSyntax; foreach (var c in classes) { if (/*Not inheriting*/) { /*Add […]

使用Roslyn查找特定方法的所有方法调用

我正在使用Roslyn编写代码分析器,我当前的任务是找到程序集中未使用的所有内部方法。 我从MethodDeclarationSyntax开始并从中获取符号。 然后我在FindCallersAsync中使用FindCallersAsync方法,但它返回一个空集合,即使我在程序集中的某个地方调用有问题的方法时也是如此。 请参阅下面的代码。 protected override void Analyze(SyntaxNodeAnalysisContext context) { NodeToAnalyze = context.Node; var methodDeclaration = NodeToAnalyze as MethodDeclarationSyntax; if (methodDeclaration == null) return; var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration) as ISymbol; if (methodSymbol.DeclaredAccessibility != Accessibility.Internal) return; var solutionPath = GetSolutionPath(); var msWorkspace = MSBuildWorkspace.Create(); var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result; var callers = SymbolFinder.FindCallersAsync(symbol, solution).Result; // Returns empty […]

从罗斯林的符号中获取类型

对于不同类型的符号,从Microsoft.CodeAnalysis.ISymbol获取System.Type的最佳通用方法是什么? (例如类声明,变量,属性等) 我希望能够对类型进行各种检查,例如检查类型是否实现任何接口,或者是否可以转换为任何接口,就像可以检查System.Type一样。 我遇到的问题是,用于表示符号的大多数具体类都是内部的(请参阅http://source.roslyn.io/ ),我在ISymbol中找不到tye类型信息。 SourceNamedTypeSymbol LocalSymbol 我使用以下代码检索ISymbol var objectSymbol = (ISymbol)model.GetDeclaredSymbol(obj.Node);