2013-12-10 24 views
3

我正在用Roslyn構建REPL。如何知道輸入是否僅在Roslyn的ScripEngine中部分完成

我怎麼能計算出,如果輸入到會話只完成了一部分:

> 1+1; 
> 2 //that works 
> int MyMethod(string a){ 
    //error here, i'd like to continue writing the expression 

這段代碼顯示問題:

var engine = new ScriptEngine(); 
var session = engine.CreateSession(); 
var input = "int MyMethod(string a){"; 
session.Execute(input); //Exception: error CS1513: } expected 

我有什麼做的,如果找出來input是否完整?所以我可以在我的REPL中顯示另一行,直到表達式完成。

回答

2

的交互式窗口,是的一部分CTP使用Syntax.IsCompleteSubmission API用於此目的。

1

您可以使用SyntaxTree.ParseTextGetDiagnostics()來檢查語法是否正確。如果沒有,你可能會想把這行添加到某個緩衝區並檢查這個緩衝區,直到它有效。

var st = SyntaxTree.ParseText(input); 
var errors = st.GetDiagnostics(); 

注意:總是存在一定的誤差(即使是簡單的1+1表達式),所以你必須在默認情況下篩選出來:

enter image description here

相關問題