2016-02-23 35 views
6

Tôi đang thử khả năng tạo mã của Roslyn bằng cách sử dụng LinqPad để chạy các đoạn. Phương thức mở rộng .Dump() của LinqPad làm cho khung nhìn được định dạng của đối tượng thành ô Result.Có phải Roslyn's ".WithFooToken()" gọi là không cần thiết?

Mã được tạo bởi http://roslynquoter.azurewebsites.net/ bao gồm nhiều mã dường như không làm được gì khác ngoài việc thêm sưng lên. Mã sau xuất ra return null; cho dù các cuộc gọi .WithFooToken(...) có được nhận xét hay không.

using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 

var syn = 
    SyntaxFactory.ReturnStatement(
     SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression) 
//   .WithToken(SyntaxFactory.Token(SyntaxKind.NullKeyword)) 
    ) 
// .WithReturnKeyword(
//  SyntaxFactory.Token(SyntaxKind.ReturnKeyword) 
// ) 
// .WithSemicolonToken(
//  SyntaxFactory.Token(SyntaxKind.SemicolonToken) 
// ) 
; 
syn.NormalizeWhitespace().ToFullString().Dump(); 

Các cuộc gọi đó có bắt buộc cho tất cả ngôn ngữ hoặc chỉ cho các ngôn ngữ có mặc định hợp lý được xây dựng trong thư viện hỗ trợ Roslyn của họ không?

+0

Các cuộc gọi đó chắc chắn hữu ích trong các trường hợp như 'return/**/null;'. Về lý do tại sao chúng được bao gồm luôn, có lẽ vì lý do nào đó khó phân biệt hai trường hợp? – svick

+0

Một kịch bản mà tôi cho rằng nó có thể quan trọng là khi mã chỉ được xây dựng một phần. Theo mặc định, nó giả sử từ khóa 'return' và dấu chấm phẩy ở đó để nó thêm chúng theo mặc định - nhưng nếu dấu chấm phẩy chưa được gõ thì sao? 'syntax = syntax.WithSemicolonToken (SyntaxFactory.MissingToken (SyntaxKind.SemicolonToken));' –

Trả lời

5

Có, trong trường hợp đơn giản, những cuộc gọi này là không cần thiết. The code of RoslynQuoter có tùy chọn RemoveRedundantModifyingCalls, mà tôi tin là phải làm chính xác những gì bạn muốn. Nhưng không được triển khai, the only usage đã được nhận xét:

private void AddModifyingCall(ApiCall apiCall, MethodCall methodCall) 
{ 
    // TODO: this needs scripting 
    ////if (RemoveRedundantModifyingCalls) 
    ////{ 
    //// var before = Evaluate(apiCall, UseDefaultFormatting); 
    //// apiCall.Add(methodCall); 
    //// var after = Evaluate(apiCall, UseDefaultFormatting); 
    //// if (before == after) 
    //// { 
    ////  apiCall.Remove(methodCall); 
    //// } 
    ////} 

    apiCall.Add(methodCall); 
    return; 
} 
7

@ svick là câu trả lời đúng. Tôi chỉ quên kích hoạt lại mã đó vì Roslyn Scripting không có sẵn.

Bây giờ Scripting mà là công khai, tôi đã kích hoạt lại mã và cập nhật website: http://roslynquoter.azurewebsites.net/

Hãy thử các trang web ngay bây giờ, và các cuộc gọi không cần thiết như bạn đề cập ở trên nên được đi (họ sẽ vẫn xuất hiện khi cần thiết để sửa đổi trivia/comments/etc).

Các vấn đề liên quan