从ITypeSymbol获取TypeSyntax

时间:2011-11-22 17:41:25

标签: c# roslyn

我正在尝试使用Roslyn-CTP。

目前我正在尝试用具体类型替换var

var i=1;

应该成为:

int i=1;

确定推断类型很容易。但由于这部分发生在语义模型中,我得到ITypeSymbol。替换发生在语法模型中,所以我需要一个TypeSyntax。由于我不想要一个膨胀的名称(global::System.Int32),因此转换依赖于上下文(using,嵌套类型等。)。

Roslyn的Visual Studio版本已经在其“简化类型名称”quickfix中具有此功能,但查看示例我找不到一种简单的方法来进行此转换。


基于Kevin Pilch-Bisson的回答,我现在正在使用:

var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());

可以从ToMinimalDisplayString获取CommonSyntaxTree的位置。

另一个复杂因素是ToMinimalDisplayString需要课程LocationSemanticModel,而document.GetSemanticModel()CommonSyntaxTree.GetLocation只需要返回一个界面。
我只是通过简单地投射到课程来解决这个问题,这似乎现在很有用。

嗯,看起来这些类是C#特有的,并且接口语言是独立的。


我在github上传了一个正在运行的版本:https://github.com/CodesInChaos/Roslyn

它对var中的foreach无效,但我怀疑这是当前Roslyn版本的限制。

2 个答案:

答案 0 :(得分:12)

您可以使用适用于ToMinimalDisplayString()的{​​{1}}扩展方法获取最短的合法字符串来表示给定位置的符号(注意:它位于`Roslyn.Compilers.CSharp.SymbolDisplay中。

免责声明:我在Roslyn团队的Microsoft工作。

答案 1 :(得分:-1)

问题:找到可为空的参数类型。它可以是自定义对象或系统标识符。

在 c# 中 - customobject 具有 kind() == identifier 并且 bool/string/ 具有预定义类型。

这就是你如何将参数的类型设置为可空

[此处标识符名称表明这是自定义对象。可以是 PredefinedType]

 Class A
 {
     public bool ? test;
    public b ? obj1;
 }
 // Get the semantic model and get the property declarationsyntax

 PropertyDeclarationSyntax prop = (get it somehow)[]

 INamedTypeSymbol tp = (INamedTypeSymbol)x.Type;

 string nameoftype = tp.TypeArguments.FirstOrDefault().Name;

 ITypeSymbol s1 = tp.TypeArguments.FirstOrDefault();

 TypeSyntax t1 = SyntaxFactory.ParseTypeName(s1.ToMinimalDisplayString(semanticModel, 
 prop.SpanStart));

 t1.kind == IdentifierName meaning its custom object type.