当前位置: 首页 > 编程语言 > C#

从头开始构建语法树分享

时间:2023-04-10 18:41:21 C#

从头开始构建语法树我之前问过这个问题,但是有人给出了一个建议,可以帮助我在前进的过程中避免犯类似的错误。使用Roslyn向类添加自动实现的属性建议我从下向上而不是从上到下构建语法树。有人可以提供一个小演示或链接来展示我如何从头开始做这件事吗?这是代码:varroot=(CompilationUnitSyntax)document.GetSyntaxRoot();//添加命名空间varnamespaceAnnotation=newSyntaxAnnotation();root=root.WithMembers(Syntax.NamespaceDeclaration(Syntax.ParseName("ACO")).NormalizeWhitespace().WithAdditionalAnnotations(namespaceAnnotation));文档=文档.UpdateSyntaxRoot(根);//向新创建的命名空间添加一个类,并更新文档varnamespaceNode=(NamespaceDeclarationSyntax)root.GetAnnotatedNodesAndTokens(namespaceAnnotation).Single().作为节点();varclassAnnotation=newSyntaxAnnotation();varbaseTypeName=Syntax.ParseTypeName("System.Windows.Forms.Form");SyntaxTokenListsyntaxTokenList=newSyntaxTokenList(){Syntax.Token(SyntaxKind.PublicKeyword)};varnewNamespaceNode=namespaceNode.WithMembers(Syntax.List(Syntax.ClassDeclaration("MainForm").WithAdditionalAnnotations(classAnnotation).AddBaseListTypes(baseTypeName).WithModifiers(Syntax.Token(SyntaxKind.PublicKeyword))));root=root.ReplaceNode(namespaceNode,newNamespaceNode).NormalizeWhitespace();文档=文档.UpdateSyntaxRoot(根);varattributes=Syntax.List(Syntax.AttributeDeclaration(Syntax.SeparatedList(Syntax.Attribute(Syntax.ParseName("STAThread")))));//找到刚刚创建的类,向其添加方法并更新文档varclassNode=(ClassDeclarationSyntax)root.GetAnnotatedNodesAndTokens(classAnnotation).Single().AsNode();varsyntaxList=Syntax.List(Syntax.MethodDeclaration(Syntax.ParseTypeName("void"),"Main").WithModifiers(Syntax.TokenList(Syntax.Token(SyntaxKind.PublicKeyword))).WithAttributes(属性).WithBody(语法。堵塞()));syntaxList=syntaxList.Add(Syntax.PropertyDeclaration(Syntax.ParseTypeName("System.Windows.Forms.Timer"),"Ticker"));varnewClassNode=classNode.WithMembers(syntaxList);root=root.ReplaceNode(classNode,newClassNode).NormalizeWhitespace();文档=文档.UpdateSyntaxRoot(根);那么我如何做同样的事情,但从头开始呢?在此先感谢短发PS我的属性也缺少“get;set;”其中的文本有人可以对我忘记添加的内容发表评论,这会导致将此文本添加到属性中吗?这将在一个表达式中构建整个编译单元树。varcu=SyntaxFactory.CompilationUnit().AddMembers(SyntaxFactory.NamespaceDeclaration(Syntax.IdentifierName("ACO")).AddMembers(SyntaxFactory.ClassDeclaration("MainForm").AddBaseListTypes(SyntaxFactory.ParseTypeName("System.Windows.Forms.Form“))GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))),SyntaxFactory.MethodDeclaration(SyntaxFactory),"PvoidFactory".“主要”).AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)).AddAttributes(SyntaxFactory.AttributeDeclaration().AddAttributes(SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("STAThread")))).WithBody(SyntaxFactory.Block()))));当然,您不必将其作为单个表达式来执行,我可以使用单独的局部变量来收集我想要的部分,然后将它们添加到包含语法部分的构造中。信不信由你,我专门写了一个叫做RoslynCodeQuoter的工具来回答这个问题。http://roslynquoter.azurewebsites.net这个工具可以使用任何C#程序并自动生成代码片段,就像上面Matt写的那样。由于它还可以完美地生成所有内容,包括所有空格,因此代码可能会变得相当笨拙。但是您可以排除生成琐事的部分,然后在结果节点上调用NormalizeWhitespace(),它会自动插入琐事,以便代码正确格式化。为了完整起见,我发布了代码的所有血淋淋的细节,这样你就可以看到空白是如何构造的以及所有这些小细节。以上就是C#学习教程:从零开始构建SyntaxTree分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——CompilationUnit().WithMembers(SingletonList(NamespaceDeclaration(IdentifierName("ACO")).WithMembers(SingletonList(ClassDeclaration("MainForm”)")),IdentifierName("Form")))))).WithMembers(List(newMemberDeclarationSyntax[]{PropertyDeclaration(QualifiedName(QualifiedName(QualifiedName(IdentifierName("System"),IdentifierName("Windows")),IdentifierName(“表格”)),IdentifierName(“Timer”),Identifier(“Ticker”)).WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword))).WithAccessorList(AccessorList(List(newAccessorDeclarationSyntax[]{AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken))}))),MethodDeclaration(PredefinedType(Token(SyntaxKind.VoidKeyword)),Identifier("List.Mainith")属性)(SingletonList(AttributeList(SingletonSeparatedList(Attribute(IdentifierName("STAThread")))))).WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword))).WithBody(Block())}))))).NormalizeWhitespace()本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: