Expression printer for Expression nodes.
Наследование: IAstVisitor
Пример #1
0
        /// <summary>
        ///   Parses the specified entity.
        /// </summary>
        /// <param name = "entity">The entity.</param>
        /// <param name = "reader">The reader.</param>
        public override void Parse(BaseEntity entity, TextReader reader)
        {
            EnumerationEntity enumerationEntity = (EnumerationEntity)entity;
            if (enumerationEntity == null) {
                throw new ArgumentException ("EnumerationEntity expected", "entity");
            }

            IParser parser = ParserFactory.CreateParser (SupportedLanguage.CSharp, reader);
            parser.Parse ();

            // Extract the special nodes (comment, etc)
            List<ISpecial> specials = parser.Lexer.SpecialTracker.RetrieveSpecials ();
            this.CodeDomSpecialParser = new CodeDomSpecialParser (specials);

            // Parse the compilation unit
            CompilationUnit cu = parser.CompilationUnit;
            foreach (INode child1 in cu.Children) {
                NamespaceDeclaration namespaceDeclaration = child1 as NamespaceDeclaration;
                if (namespaceDeclaration == null) {
                    continue;
                }
                foreach (INode child2 in child1.Children) {
                    TypeDeclaration declaration = child2 as TypeDeclaration;
                    if (declaration == null) {
                        continue;
                    }
                    if (declaration.Type != ClassType.Enum) {
                        continue;
                    }

                    // Extract basic informations
                    enumerationEntity.BaseType = declaration.BaseTypes.Count > 0 ? declaration.BaseTypes [0].Type : "int";

                    // Extract attributes
                    Attribute attribute = FindAttribute (declaration, "Flags");
                    enumerationEntity.Flags = (attribute != null);

                    IEnumerable<Comment> comments = this.GetDocumentationCommentsBefore (declaration);
                    AppendComment (entity, comments);

                    // Append each values
                    foreach (INode child3 in declaration.Children) {
                        FieldDeclaration fieldDeclaration = child3 as FieldDeclaration;
                        if (fieldDeclaration == null) {
                            continue;
                        }

                        EnumerationValueEntity valueEntity = new EnumerationValueEntity ();
                        valueEntity.Name = fieldDeclaration.Fields [0].Name;
                        Expression expression = fieldDeclaration.Fields [0].Initializer;
                        if (expression != null) {
                            CodeDomExpressionPrinter printer = new CodeDomExpressionPrinter ();
                            expression.AcceptVisitor (printer, null);
                            valueEntity.Value = printer.ToString ();
                        }

                        comments = this.GetDocumentationCommentsBefore (fieldDeclaration);
                        AppendComment (valueEntity, comments);

                        enumerationEntity.Values.Add (valueEntity);
                    }
                }
            }

            // Ensure that availability is set on entity.
            entity.AdjustAvailability ();
        }
Пример #2
0
        /// <summary>
        ///   Parses the specified entity.
        /// </summary>
        /// <param name = "entity">The entity.</param>
        /// <param name = "reader">The reader.</param>
        public override void Parse(BaseEntity entity, TextReader reader)
        {
            EnumerationEntity enumerationEntity = (EnumerationEntity)entity;

            if (enumerationEntity == null)
            {
                throw new ArgumentException("EnumerationEntity expected", "entity");
            }

            IParser parser = ParserFactory.CreateParser(SupportedLanguage.CSharp, reader);

            parser.Parse();

            // Extract the special nodes (comment, etc)
            List <ISpecial> specials = parser.Lexer.SpecialTracker.RetrieveSpecials();

            this.CodeDomSpecialParser = new CodeDomSpecialParser(specials);

            // Parse the compilation unit
            CompilationUnit cu = parser.CompilationUnit;

            foreach (INode child1 in cu.Children)
            {
                NamespaceDeclaration namespaceDeclaration = child1 as NamespaceDeclaration;
                if (namespaceDeclaration == null)
                {
                    continue;
                }
                foreach (INode child2 in child1.Children)
                {
                    TypeDeclaration declaration = child2 as TypeDeclaration;
                    if (declaration == null)
                    {
                        continue;
                    }
                    if (declaration.Type != ClassType.Enum)
                    {
                        continue;
                    }

                    // Extract basic informations
                    enumerationEntity.BaseType = declaration.BaseTypes.Count > 0 ? declaration.BaseTypes [0].Type : "int";

                    // Extract attributes
                    Attribute attribute = FindAttribute(declaration, "Flags");
                    enumerationEntity.Flags = (attribute != null);

                    IEnumerable <Comment> comments = this.GetDocumentationCommentsBefore(declaration);
                    AppendComment(entity, comments);

                    // Append each values
                    foreach (INode child3 in declaration.Children)
                    {
                        FieldDeclaration fieldDeclaration = child3 as FieldDeclaration;
                        if (fieldDeclaration == null)
                        {
                            continue;
                        }

                        EnumerationValueEntity valueEntity = new EnumerationValueEntity();
                        valueEntity.Name = fieldDeclaration.Fields [0].Name;
                        Expression expression = fieldDeclaration.Fields [0].Initializer;
                        if (expression != null)
                        {
                            CodeDomExpressionPrinter printer = new CodeDomExpressionPrinter();
                            expression.AcceptVisitor(printer, null);
                            valueEntity.Value = printer.ToString();
                        }

                        comments = this.GetDocumentationCommentsBefore(fieldDeclaration);
                        AppendComment(valueEntity, comments);

                        enumerationEntity.Values.Add(valueEntity);
                    }
                }
            }

            // Ensure that availability is set on entity.
            entity.AdjustAvailability();
        }