首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Roslyn SDK Preview中的代码格式化

Roslyn SDK Preview中的代码格式化
EN

Stack Overflow用户
提问于 2014-05-13 16:05:04
回答 3查看 4.6K关注 0票数 12

在较早的版本(Roslyn CTP)中,我使用以下代码来格式化我生成的代码,它工作得非常好:

代码语言:javascript
复制
SyntaxNode.Format(FormattingOptions.GetDefaultOptions()).GetFormattedRoot()

在新的Roslyn版本中,它不再起作用,那么在新版本(SDK预览)中,上述代码的等价物是什么?

EN

回答 3

Stack Overflow用户

发布于 2014-05-13 16:43:49

您可以像这样使用Microsoft.CodeAnalysis.Formatting.Formatter格式化SyntaxNodes (如果您有一个工作区):

代码语言:javascript
复制
using Microsoft.CodeAnalysis.Formatting;

var formattedResult = Formatter.Format(syntaxNode, workspace);

编辑:正如Jeroen在评论中所写的那样,如果你没有工作空间,也不需要工作空间特定的格式设置,你可以只创建一个:

代码语言:javascript
复制
var workspace = MSBuildWorkspace.Create();
票数 11
EN

Stack Overflow用户

发布于 2014-08-29 16:26:07

自从CTP以来,Roslyn已经发生了很大的变化。

文档现在在这里:https://roslyn.codeplex.com/

点击https://roslyn.codeplex.com/documentation的链接,点击“示例和演练”,然后打开演示解决方案"FormatSolution -A控制台应用程序,格式化解决方案中的所有C#和VB源文件。“

不幸的是,我认为不可能再让格式化快速工作了,因为您必须将代码添加到新的解决方案中。

票数 3
EN

Stack Overflow用户

发布于 2021-02-24 18:36:19

我想这对你会有用的。

代码语言:javascript
复制
            var syntaxTree = CSharpSyntaxTree.ParseText(finalProgramText);
            var compilationRoot = syntaxTree.GetCompilationUnitRoot();

            /*
            MSBuildLocator.RegisterDefaults();
            var workspace = MSBuildWorkspace.Create(); 
            var sharpTree = CSharpSyntaxTree.ParseText(programText);
            var formattedNode = Formatter.Format(sharpTree.GetRoot(), workspace);
            var fullText = formattedNode.ToFullString();
            */
            var nameSpaces = from n in compilationRoot.DescendantNodes().OfType<UsingDirectiveSyntax>() select n;
            var usings = compilationRoot.Usings.AddRange(nameSpaces);
            var propertyNodes = (from field in compilationRoot.DescendantNodes().OfType<PropertyDeclarationSyntax>() select field).ToList();
            var st = new SyntaxTrivia();
            var withoutProperty = compilationRoot.ReplaceNodes(propertyNodes, (syntax, declarationSyntax) => null).NormalizeWhitespace();
            var withoutPropText = withoutProperty.GetText().ToString();
            var tree = CSharpSyntaxTree.ParseText(withoutPropText);
            var root = tree.GetCompilationUnitRoot();
            var commentTrivia = from t in root.DescendantTrivia()
                                where t.IsKind(SyntaxKind.SingleLineCommentTrivia)
                                      || t.IsKind(SyntaxKind.MultiLineCommentTrivia)
                                      || t.IsKind(SyntaxKind.EndRegionDirectiveTrivia)
                                      || t.IsKind(SyntaxKind.RegionDirectiveTrivia)
                                      || t.IsKind(SyntaxKind.PragmaChecksumDirectiveTrivia)
                                      || t.IsKind(SyntaxKind.PragmaWarningDirectiveTrivia)
                                      || t.IsKind(SyntaxKind.PragmaKeyword)
                                      || t.IsKind(SyntaxKind.EmptyStatement)
                                      || t.IsKind(SyntaxKind.XmlComment)
                                      || t.IsKind(SyntaxKind.SingleLineDocumentationCommentTrivia)
                                      || t.IsKind(SyntaxKind.AttributeList)
                                select t;
            var newRoot = root.ReplaceTrivia(commentTrivia, (t1, t2) => st).NormalizeWhitespace();
            var text = newRoot.GetText().ToString();

            var attrTree = CSharpSyntaxTree.ParseText(text);
            var attrRoot = attrTree.GetCompilationUnitRoot();
            var attrList = from a in attrRoot.DescendantNodes().OfType<AttributeListSyntax>() select a;
            var methodList = (from m in attrRoot.DescendantNodes().OfType<MethodDeclarationSyntax>()
                              where m.ExpressionBody != null
                              select m).ToList();
            var normalMethods = (from m in attrRoot.DescendantNodes().OfType<MethodDeclarationSyntax>()
                                 where m.ExpressionBody == null
                                 select m).ToList();
            Console.WriteLine(normalMethods.Count);
            var withoutAttrList = attrRoot.ReplaceNodes(attrList, (syntax, listSyntax) => null).NormalizeWhitespace()
                .GetText().ToString();
            var fieldTree = CSharpSyntaxTree.ParseText(withoutAttrList);
            var fieldRoot = fieldTree.GetCompilationUnitRoot();
            var fieldsList = (from field in fieldRoot.DescendantNodes().OfType<FieldDeclarationSyntax>() select field).ToList();
            var withoutFields = fieldRoot.ReplaceNodes(fieldsList, (syntax, declarationSyntax) => null);

            var plainTextLines = withoutFields.NormalizeWhitespace().GetText().ToString().Split('\n')
                .Where(d => !usings.Any(u => d.Trim('\r', ' ').Equals(u.ToString())) && !string.IsNullOrEmpty(d.Trim('\r', ' '))
                            && !Regex.IsMatch(d.Trim('\r', ' '), @"^([;()\[\]]+)$")
                            ).Select(s => Regex.Replace(s.TrimEnd('\r', '\n', ' '), "\\s+", " ")).ToList();
            Console.WriteLine(plainTextLines); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23625835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档