Roslyn - 属性声明解析错误

问题描述 投票:0回答:1

目前我正在为 C# 代码编写一个小型类成员声明排序器。

在测试过程中,我偶然发现了以下代码示例,其中包含 PropertyDeclarations,但未成功解析(示例是变量

programText
的内容,当然,不是下面的整个代码):

代码

private void ParseIt()
{
    string programText = @"

public class Image : ViewModifyDataBase
{

    public BoolParameter IsTransformSelfCentered { get; init; } = new(new BaseModels.BoolParameter(false));

    public ValueParameter<double> OffsetX { get; init; } = new(new BaseModels.ValueParameter<double>(0, double.MinValue, double.MaxValue));

    public ValueParameter<double> OffsetY { get; init; } = new(new BaseModels.ValueParameter<double>(0, double.MinValue, double.MaxValue));

}
    ";

    var tree = CSharpSyntaxTree.ParseText(programText);
    var icml = tree.GetRoot().DescendantNodes().Where(nd => nd.Kind() == SyntaxKind.IncompleteMember).ToList();
    // Unfortunately icml is not empty:         
    foreach(var elem in icml)
    {
        Console.WriteLine($"IncompleteMember: {elem.ToFullString()}");
    }
}

给出以下输出

IncompleteMember: new BaseModels.BoolParameter
IncompleteMember: (false));

IncompleteMember: new BaseModels.ValueParameter<double>
IncompleteMember: (0, 
IncompleteMember: double.
IncompleteMember: MinValue, 
IncompleteMember: double.
IncompleteMember: MaxValue));

IncompleteMember: new BaseModels.ValueParameter<double>
IncompleteMember: (0, 
IncompleteMember: double.
IncompleteMember: MinValue, 
IncompleteMember: double.
IncompleteMember: MaxValue));

上面用于分析的代码片段仍然可以使用普通 VisualStudio 很好地编译(作为较大文件的一部分),并且 RoslynQuoter 也不会产生警告。

我该怎么做才能在我的代码中完成正确的解析? ParseText() 中是否需要特殊的参数设置?

编辑:我的罗斯林(和其他)版本:

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="6.3.0.90" />
    <PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.9.8" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces" Version="3.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.3.1" />
  </ItemGroup>

另一个编辑:(根据您的建议我的新设置):

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="6.3.0.90" />
    <PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.7.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces" Version="4.7.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.7.0" />
  </ItemGroup>
c# parsing roslyn
1个回答
0
投票

将我的评论转换为答案:

OP 使用旧版本的

Microsoft.CodeAnalysis.*
NuGet 包,该包早于 C# 9.0 中引入的目标类型
new()
运算符的引入。

截至 2023 年第三季度,这些 NuGet 包的当前版本是 4.7.0,因此请更新到这些版本。

但是,您只需引用

Microsoft.CodeAnalysis.etc...
即可,而不是为各个
Microsoft.CodeAnalysis
包提供 PackageReferences,并且 它将自动拉入其他包:

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="6.3.0.90" />
    <PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
    <PackageReference Include="Microsoft.CodeAnalysis" Version="4.7.0" />
  </ItemGroup>

(您可能需要,也可能不需要

PrivateAssets="all"
,具体取决于您如何使用 Roslyn)

© www.soinside.com 2019 - 2024. All rights reserved.