Roslyn解析C#属性声明出现IncompleteMember错误的解决咨询
Roslyn解析C#代码出现IncompleteMember错误的解决方案
问题
开发C#类成员声明排序工具时,一段可在Visual Studio正常编译、RoslynQuoter无警告的属性代码,通过Roslyn的CSharpSyntaxTree.ParseText解析时出现大量IncompleteMember错误。已尝试升级Roslyn版本,需解决正确解析的方法,确认是否需要为ParseText设置特殊参数。
测试代码
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(); // 输出错误成员 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));
版本配置
初始版本
<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>
解决方案
1. 修正代码文本中的HTML转义字符
问题核心是测试代码的programText中使用了HTML转义字符<和>代替C#语法中的<和>,Roslyn解析时会将这些转义字符视为普通文本,导致语法结构被破坏,进而产生IncompleteMember错误。
将programText中的<替换为<,>替换为>即可解决基础语法解析问题。
2. 指定匹配的C#语言版本(可选)
代码中使用了C# 9.0引入的init setter特性,建议在ParseText时明确指定对应语言版本,避免因默认版本不支持导致的解析问题:
var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp9); var tree = CSharpSyntaxTree.ParseText(programText, options);
修正后的完整测试代码不会再产生IncompleteMember错误,可正常解析所有类成员。
内容的提问来源于stack exchange,提问作者Jürgen Böhm
相关产品推荐
相关产品推荐

