示例#1
0
        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));
        }
示例#2
0
        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);
        }
示例#3
0
        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;
        }