Sắp xếp và xóa (không sử dụng) bằng cách sử dụng câu lệnh Roslyn script/code? Tôi đang tìm một số mã .NET/Roslyn (trình biên dịch dưới dạng dịch vụ) có thể chạy qua một dự án và sắp xếp và loại bỏ các câu lệnh không sử dụng. Tôi tin rằng điều này là có thể với Roslyn? Bất cứ ai có thể chỉ cho tôi để mã mà có thể làm điều này viết lại?Sắp xếp và xóa (không sử dụng) bằng cách sử dụng câu lệnh Roslyn script/code?
Trả lời
Đây là một tính năng trong Visual Studio, nhưng học tập tôi nghĩ rằng bạn sẽ thu thập sử dụng báo cáo từ SyntaxTree của bạn như thế này:
var usings = syntaxTree.Root.DescendentNodes().Where(node is UsingDirectiveSyntax);
... và so sánh với các không gian tên giải quyết bằng các bảng biểu tượng như thế này:
private static IEnumerable<INamespaceSymbol> GetNamespaceSymbol(ISymbol symbol)
{
if (symbol != null && symbol.ContainingNamespace != null)
yield return symbol.ContainingNamespace;
}
var ns = semanticModel.SyntaxTree.Root.DescendentNodes().SelectMany(node =>
GetNamespaceSymbol(semanticModel.GetSemanticInfo(node).Symbol)).Distinct();
Kiểm tra dự án mẫu OrganizeSolution đi kèm với Roslyn. Nó làm một cái gì đó tương tự như những gì bạn muốn. Nó có phần phân loại. Bạn cũng sẽ phải sử dụng SemanticModel như Jeff hiển thị để xác định xem không có tham chiếu đến một không gian tên cụ thể trong nguồn.
Để xóa câu lệnh, hãy xem mục Câu hỏi thường gặp 30 trong giải pháp trong thư mục sau, trong tệp FAQ.cs: (Lưu ý đây là phiên bản CTP tháng 6 năm 2012 của Roslyn).
% userprofile% \ Documents \ Microsoft Roslyn CTP - Tháng Sáu 2012 \ CSharp \ APISampleUnitTestsCS
Ngoài ra còn có một câu hỏi thường gặp trong đó đề cập đến dự án này:
http://www.codeplex.com/Download?ProjectName=dlr&DownloadId=386858
Đây là Ổ ghi mẫu từ mã mẫu, loại bỏ các câu lệnh gán.
// Below SyntaxRewriter removes multiple assignement statements from under the
// SyntaxNode being visited.
public class AssignmentStatementRemover : SyntaxRewriter
{
public override SyntaxNode VisitExpressionStatement(ExpressionStatementSyntax node)
{
SyntaxNode updatedNode = base.VisitExpressionStatement(node);
if (node.Expression.Kind == SyntaxKind.AssignExpression)
{
if (node.Parent.Kind == SyntaxKind.Block)
{
// There is a parent block so it is ok to remove the statement completely.
updatedNode = null;
}
else
{
// The parent context is some statement like an if statement without a block.
// Return an empty statement.
updatedNode = Syntax.EmptyStatement()
.WithLeadingTrivia(updatedNode.GetLeadingTrivia())
.WithTrailingTrivia(updatedNode.GetTrailingTrivia());
}
}
return updatedNode;
}
}
Roslyn CTP tháng 9 năm 2012 cung cấp phương thức GetUnusedImportDirectives()
, được sử dụng tuyệt vời tại đây.
Bằng cách sửa đổi OrganizeSolution dự án mẫu Matt tham chiếu bạn có thể đạt được cả việc phân loại và loại bỏ (không sử dụng) bằng chỉ thị. Có thể tìm thấy phiên bản (đã lỗi thời) của dự án này tại đây: http://go.microsoft.com/fwlink/?LinkId=263977. Đó là lỗi thời vì document.GetUpdatedDocument()
không tồn tại nữa,
var document = newSolution.GetDocument(documentId);
var transformation = document.OrganizeImports();
var newDocument = transformation.GetUpdatedDocument();
có thể được đơn giản hóa để
var document = newSolution.GetDocument(documentId);
var newDocument = document.OrganizeImports();
Thêm newDocument = RemoveUnusedImportDirectives(newDocument);
và cung cấp các phương pháp sau đây sẽ làm các trick.
private static IDocument RemoveUnusedImportDirectives(IDocument document)
{
var root = document.GetSyntaxRoot();
var semanticModel = document.GetSemanticModel();
// An IDocument can refer to both a CSharp as well as a VisualBasic source file.
// Therefore we need to distinguish those cases and provide appropriate casts.
// Since the question was tagged c# only the CSharp way is provided.
switch (document.LanguageServices.Language)
{
case LanguageNames.CSharp:
var oldUsings = ((CompilationUnitSyntax)root).Usings;
var unusedUsings = ((SemanticModel)semanticModel).GetUnusedImportDirectives();
var newUsings = Syntax.List(oldUsings.Where(item => !unusedUsings.Contains(item)));
root = ((CompilationUnitSyntax)root).WithUsings(newUsings);
document = document.UpdateSyntaxRoot(root);
break;
case LanguageNames.VisualBasic:
// TODO
break;
}
return document;
}
tôi sử dụng này phương pháp mở rộng sau để sắp xếp usings
internal static SyntaxList<UsingDirectiveSyntax> Sort(this SyntaxList<UsingDirectiveSyntax> usingDirectives, bool placeSystemNamespaceFirst = false) =>
SyntaxFactory.List(
usingDirectives
.OrderBy(x => x.StaticKeyword.IsKind(SyntaxKind.StaticKeyword) ? 1 : x.Alias == null ? 0 : 2)
.ThenBy(x => x.Alias?.ToString())
.ThenByDescending(x => placeSystemNamespaceFirst && x.Name.ToString().StartsWith(nameof(System) + "."))
.ThenBy(x => x.Name.ToString()));
và
compilationUnit = compilationUnit.WithUsings(SortUsings(compilationUnit.Usings))
- 1. Cách sắp xếp tập kết quả của câu lệnh UPDATE sử dụng mệnh đề OUTPUT?
- 2. Sắp xếp từ điển bằng cách sử dụng toán tử.itemgetter
- 3. Sắp xếp Haskell của danh sách không thể đặt hàng bằng cách sử dụng lệnh proxy
- 4. Sắp xếp nhiều ô bằng cách sử dụng gridExtra
- 5. Nodes Sắp xếp XML bằng cách Alpha.Numeric sử dụng C#
- 6. Gỡ lỗi Sql chèn vào câu lệnh bằng cách sử dụng câu lệnh chọn
- 7. Tạo EF CodeFirst DbContext sử dụng Roslyn
- 8. cách sử dụng lệnh Linux Sắp xếp để sắp xếp tệp văn bản theo cột thứ 4, thứ tự số?
- 9. Sắp xếp mảng sử dụng array_multisort
- 10. Cách sắp xếp các mục danh sách bằng cách sử dụng thứ tự sắp xếp tùy chỉnh trong jQuery
- 11. Cách sử dụng EF (khung pháp nhân) sử dụng câu lệnh "sử dụng"
- 12. Sử dụng câu lệnh "có" cho tệp CSV bằng Python
- 13. Sử dụng câu lệnh "sử dụng" để xử lý
- 14. C# - Sắp xếp sử dụng Extension Method
- 15. Sắp xếp NSMutableArray bằng cách sử dụng SortDescriptor VÀ Predicate possible?
- 16. Knockout - Sử dụng foreach và sắp xếp cùng nhau
- 17. Sử dụng câu lệnh và phương thức Đóng
- 18. Sắp xếp bảng Sql bằng cách sử dụng cột bí danh
- 19. Có cách nào để sử dụng SCOPE_IDENTITY nếu sử dụng câu lệnh chèn nhiều không?
- 20. Visual studio: Xóa và sắp xếp sử dụng ngoại trừ tham chiếu Hệ thống
- 21. Thực hành không tốt? Sử dụng không chính thức câu lệnh sử dụng C#
- 22. Sắp xếp bộ nhớ: cách sử dụng alignof/alignas?
- 23. printf bằng cách sử dụng ngăn xếp?
- 24. Cách sắp xếp đồ đạc khi sử dụng pytest
- 25. Roslyn SyntaxNodes có được tái sử dụng không?
- 26. Chuẩn bị và thực hiện các câu lệnh với ActiveRecord bằng cách sử dụng PostgreSQL
- 27. sử dụng câu lệnh FOR UPDATE
- 28. Cách sắp xếp kết quả của NSFetchedResultsController bằng cách sử dụng thứ tự của NSOrderedSet
- 29. mongodb không sử dụng các chỉ mục khi sắp xếp?
- 30. Sắp xếp các nhóm khác nhau bằng cách sử dụng các thứ tự sắp xếp khác nhau trong solr
Bạn có thể sử dụng ".OfType()" thay vì" .Where (nút là UsingDirectiveSyntax) " –