public override SyntaxNode VisitClassBlock(ClassBlockSyntax node) { node = (ClassBlockSyntax)rewriter.VisitClass(node); // Turn event fields into event declarations. var events = node.ChildNodes().OfType <EventStatementSyntax>().ToArray(); node = node.RemoveNodes(events, SyntaxRemoveOptions.KeepNoTrivia); foreach (var e in events) { var valueParam = ParameterList().AddParameters(Parameter(ModifiedIdentifier("value")).WithAsClause(e.AsClause)); var statements = List <StatementSyntax>(new[] { ExpressionStatement((ExpressionSyntax)generator.ExecutePipeline(null, valueParam.Parameters)) }); node = node.AddMembers(new[] { EventBlock(e.WithCustomKeyword(Token(SyntaxKind.CustomKeyword)), List(new[] { AddHandlerAccessorBlock( AccessorStatement(SyntaxKind.AddHandlerAccessorStatement, Token(SyntaxKind.AddHandlerKeyword)) .WithParameterList(valueParam)) .WithStatements(statements), RemoveHandlerAccessorBlock( AccessorStatement(SyntaxKind.RemoveHandlerAccessorStatement, Token(SyntaxKind.RemoveHandlerKeyword)) .WithParameterList(valueParam)) .WithStatements(statements), RaiseEventAccessorBlock( AccessorStatement(SyntaxKind.RaiseEventAccessorStatement, Token(SyntaxKind.RaiseEventKeyword)) .WithParameterList(ParameterList().AddParameters( Parameter(ModifiedIdentifier("sender")).WithAsClause(SimpleAsClause(PredefinedType(Token(SyntaxKind.ObjectKeyword)))), Parameter(ModifiedIdentifier("args")).WithAsClause(SimpleAsClause(IdentifierName(nameof(EventArgs))))))) })) }); } return(base.VisitClassBlock(node)); }
public override void VisitClassBlock(ClassBlockSyntax node) { var statementNode = node.ChildNodes().OfType <ClassStatementSyntax>().FirstOrDefault(); var isPartial = statementNode.ChildTokens().Any(x => x.Kind() == SyntaxKind.PartialKeyword); var defineName = statementNode.ChildTokens().FirstOrDefault(x => x.Kind() == SyntaxKind.IdentifierToken).ToString(); // ジェネリック型を定義している場合 if (statementNode.ChildNodes().OfType <TypeParameterListSyntax>().Any()) { var listNode = statementNode.ChildNodes().OfType <TypeParameterListSyntax>().FirstOrDefault(); var genericTypes = listNode .ChildNodes() .OfType <TypeParameterSyntax>() .Select(x => x.ChildTokens().FirstOrDefault(y => y.Kind() == SyntaxKind.IdentifierToken).ToString()); defineName = $"{defineName}<{string.Join(", ", genericTypes)}>"; } var startLength = node.Span.Start; var endLength = node.Span.End; var parentNamespace = GetNamespace(DefineKinds.Class, startLength, endLength); var baseTypeInfos = new List <BaseTypeInfo>(); // 継承元クラス、またはインターフェースがある場合 var hasInherits = node.ChildNodes().OfType <InheritsStatementSyntax>().Any(); var hasImplements = node.ChildNodes().OfType <ImplementsStatementSyntax>().Any(); if (hasInherits || hasImplements) { var baseTypes = new List <SyntaxNode>(); if (hasInherits) { var inheritsNode = node.ChildNodes().OfType <InheritsStatementSyntax>().FirstOrDefault(); var childNodes = inheritsNode.ChildNodes(); // Class の場合、多重継承はできない仕様だが、将来仕様変更されるか?されないと思う foreach (var childNode in childNodes) { baseTypes.Add(childNode); } } if (hasImplements) { var implementsNode = node.ChildNodes().OfType <ImplementsStatementSyntax>().FirstOrDefault(); var childNodes = implementsNode.ChildNodes(); foreach (var childNode in childNodes) { baseTypes.Add(childNode); } } baseTypeInfos = GetBaseTypeInfos(baseTypes, parentNamespace); } UserDefinitions.Add(new UserDefinition { DefineKinds = DefineKinds.Class, IsPartial = isPartial, Namespace = parentNamespace, DefineName = defineName, DefineFullName = $"{parentNamespace}.{defineName}", BaseTypeInfos = baseTypeInfos, SourceFile = SourceFile, StartLength = startLength, EndLength = endLength, }); base.VisitClassBlock(node); }
private Class TraverseClass(ClassBlockSyntax cbs) { Class retClass = new Class(); //Name retClass.Name = cbs.Begin.Identifier.ValueText; //encapsulation foreach (SyntaxToken st in cbs.Begin.Modifiers) { string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText); Encapsulation encap; Qualifiers qual; if (System.Enum.TryParse<Encapsulation>(modifier, out encap)) { retClass.Encapsulation.Add(encap); } else if (System.Enum.TryParse<Qualifiers>(modifier, out qual)) { retClass.Qualifiers.Add(qual); } } List<EnumBlockSyntax> enums = new List<EnumBlockSyntax>(); List<StructureBlockSyntax> structs = new List<StructureBlockSyntax>(); List<MethodBlockSyntax> methods = new List<MethodBlockSyntax>(); List<FieldDeclarationSyntax> Fields = new List<FieldDeclarationSyntax>(); List<PropertyBlockSyntax> properties = new List<PropertyBlockSyntax>(); List<ConstructorBlockSyntax> constructors = new List<ConstructorBlockSyntax>(); List<ModuleBlockSyntax> modules = new List<ModuleBlockSyntax>(); List<ClassBlockSyntax> classes = new List<ClassBlockSyntax>(); foreach (SyntaxNode sn in cbs.ChildNodes()) { if (sn is EnumBlockSyntax) { enums.Add(sn as EnumBlockSyntax); } else if (sn is StructureBlockSyntax) { structs.Add(sn as StructureBlockSyntax); } else if (sn is MethodBlockSyntax) { methods.Add(sn as MethodBlockSyntax); } else if (sn is FieldDeclarationSyntax) { Fields.Add(sn as FieldDeclarationSyntax); } else if (sn is PropertyBlockSyntax) { properties.Add(sn as PropertyBlockSyntax); } else if (sn is ConstructorBlockSyntax) { constructors.Add(sn as ConstructorBlockSyntax); } else if (sn is ModuleBlockSyntax) { modules.Add(sn as ModuleBlockSyntax); } else if (sn is ClassBlockSyntax) { classes.Add(sn as ClassBlockSyntax); } } foreach (EnumBlockSyntax ebs in enums) { //traverse enums retClass.Enums.Add(TraverseEnum(ebs)); } foreach (StructureBlockSyntax sbs in structs) { retClass.Structs.Add(TraverseStruct(sbs)); } foreach (MethodBlockSyntax mbs in methods) { bool isConstructor = false; Method tempMethod = TraverseMethod(mbs, ref isConstructor); if (isConstructor) { retClass.Constructors.Add(tempMethod as Constructor); } else { retClass.Methods.Add(tempMethod); } } foreach (FieldDeclarationSyntax fds in Fields) { retClass.Fields.Add(TraverseField(fds)); } foreach (PropertyBlockSyntax pbs in properties) { retClass.Properties.Add(TraverseProperties(pbs)); } foreach (ConstructorBlockSyntax css in constructors) { retClass.Constructors.Add(TraverseConstructor(css)); } foreach (ModuleBlockSyntax mbs in modules) { retClass.Modules.Add(TraverseModule(mbs)); } foreach (ClassBlockSyntax cbs2 in classes) { retClass.Classes.Add(TraverseClass(cbs2)); } foreach (SyntaxNode sn in cbs.Begin.ChildNodes()) { if (sn is InheritsOrImplementsStatementSyntax) { } } return retClass; }