2013-06-23 29 views
4

在羅斯林CTP的方法如下簽名使用相當普遍:將SyntaxKind傳遞給類語法的工廠方法的原因是什麼?

LiteralExpressionSyntax LiteralExpression(SyntaxKind kind, SyntaxToken token) 

什麼是合格SyntaxKind的原因是什麼? token本身有Kind財產,爲什麼羅斯林不使用它?

爲了更精確,它需要用戶提供的kind,稱,它被限制爲窄的一組值,然後檢查該tokenKind也屬於這一窄集,然後通過用戶提供的kind進一步。

爲什麼Roslyn不使用token.Kind並讓用戶通過顯式類?

UPD:其實最主要的問題是:kind,用戶通過的情況會不同於token的種類?

+0

他們的其他子類是什麼? – Sayse

+0

kind是一種具有各種語法類型的巨大枚舉,如'StringLiteralExpression'等等。 –

回答

7

如果仔細觀察,您會發現檢查的種類是而不是在每種情況下都是相同的。對於和表達式有單獨的SyntaxKinds - 因此對於令牌您需要一個SyntaxKind.TrueKeyword,對於得到的LiteralExpressionSyntax您需要SyntaxKind.TrueLiteralExpression。要回答您更新的問題,結果expression.Kind永不匹配token.Kind

但是,在這種情況下,似乎確實存在令牌種類與表達種類一一對應的情況,這意味着我們可以從令牌種類派生表達式種類。我會在內部提出這個問題。

+0

我想知道'SyntaxKind.TrueKeyword'和'TrueLiteralExpression'之間的語義區別是什麼。 –

+2

一個表示語法中的令牌或終端,另一個表示語法中的SyntaxNode或非終端。我們有一個設計目標,我們不會在兩者之間混淆意義。 –

+2

@MikhailBrinchuk'true'關鍵字不一定代表'bool'類型的文字。例如,它可以是用戶定義的運算符'public static bool operator true(...)'聲明的一部分。 –

相關問題