在语义级别使用 roslyn 查找修饰符

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

我可以在语法级别得到

MemberDeclarationSyntax.Modifiers
,但是一旦我在语义级别,处理
ISymbol
,我不知道如何取回给定的
ISymbol
的修饰符?

在我的用例(源生成器)中,我想获取部分属性声明的所有上下文修饰符(特别是包括

partial
关键字)以生成其实现。

作为参考,这里是我的代码

MemberDeclarationSyntax

var contextualModifiers = memberDeclarationSyntax?.Modifiers
  .Where(syntaxToken => syntaxToken.IsContextualKeyword());

我在使用

IPropertySymbol
时找不到方法。

c# roslyn sourcegenerators
1个回答
0
投票

源生成器很棒,但超级混乱!让我来照亮它们,因为我认为你实际上有一个问题 X,并且你正在寻找问题 Y 的解决方案。

当您使用

Syntax
时,您将可以访问当前所在文件的语法树的每个节点。这可能是您想要继续的更好方法。

当您切换到语义模型并开始使用

Symbol
时,编译器已经对源代码进行了一些处理并将所有部分类组合在一起。

两个文件的示例:

One.foo.cs

public partial class One
{
   public bool First { get; set; }
}

One.bar.cs

public partial class One
{
   public bool Second { get; set; }
}

使用

Syntax
时,这些将是两个独立的语法树,在处理文件
One.Second
时您将无法看到
One.foo.cs
属性。

切换到语义模型时,这两个类将合并为

INamedTypeSymbol
类型的一个实体,我不确定这是否是您真正想要的。

现在解决你的 Y 问题

您有

memberDeclarationSyntax
,所以您可以这样做:

var symbol = context.SemanticModel.GetDeclaredSymbol(memberDeclarationSyntax);

这将为您带来

ISymbol
,因为它是所有符号的公共接口,并且在 C# 中,方法需要返回类型。但实际上它实际上是
IPropertySymbol
类的一个对象,所以你需要做的就是转换它。

var propertySymbol = (IPropertySymbol)symbol;

现在您可以检查一下

if(propertySymbol.IsPartialDefinition)
{
    // DO STUFF
}
© www.soinside.com 2019 - 2024. All rights reserved.