在Roslyn中获取案例标签常量

时间:2014-12-03 09:03:58

标签: c# switch-statement roslyn

我试图从Roslyn的SwitchStatement收集切换部分标签常量。但是我可以在语法展示器中看到CaseSwitchLabelSyntax具有Value属性和相应的常量而声明的符号(SourceLabelSymbol)具有SwitchCaseLabelConstant属性,我不能似乎从我的代码中获得了那些信息。

// SwitchStatementSyntax node;
// SemanticModel model;

foreach (var section in node.Sections) {
  foreach (var label in section.Labels) {
    var labelSymbol = model.GetDeclaredSymbol(label);
    // Here I'm stuck
  }
}

我可能会查看SwitchLabelSyntaxCaseSwitchLabelSyntax还是DefaultSwitchLabelSyntax并进行相应的投射。 SourceLabelSymbol实际上是内部的,因此我无法访问其属性。 model.GetConstantValue(label)会返回null

但是鉴于Roslyn总是提供接口,我相信有这样的原因并且疯狂地转向我对我感到有些不耐烦。有更好的选择吗?

注意:我这样做是为了将C#语法翻译成另一种语言。从技术上讲,首先进入一个单独的AST,然后再转换为文本。上面的代码来自CSharpSyntaxWalker,我可能只是将我的部分转换后的switch语句存储起来,继续访问它的后代并将其逐段构建。

但这意味着拥有更多的状态,在六个不同的位置构建语句,这导致难以阅读和关注代码。如果可能的话,我宁愿在这里避免它。

1 个答案:

答案 0 :(得分:3)

最接近API的是semanticModel.GetConstantValue方法,但仍然需要将Value节点传递给它:

section.Labels
       .OfType<CaseSwitchLabelSyntax>()
       .Select(l => semanticModel.GetConstantValue(l.Value))
       .ToArray()

正如您所见,无论如何都需要过滤掉CaseSwitchLabelSyntax