public MethodParser(MethodParserInfo methodParserInfo)
     : base(methodParserInfo.MethodSymbol, methodParserInfo.MethodDescriptor)
 {
     this.model              = methodParserInfo.SemanticModel;
     this.methodNode         = methodParserInfo.DeclarationSyntaxNode;
     this.containingTypeNode = methodParserInfo.ContainingTypeSyntax;
 }
        public override void VisitClassDeclaration(ClassDeclarationSyntax node)
        {
            var typeSymbol = this.SemanticModel.GetDeclaredSymbol(node);
            var defaultConstructorSymbol = typeSymbol.Constructors.SingleOrDefault(c => !c.IsStatic && c.IsImplicitlyDeclared);

            if (defaultConstructorSymbol != null)
            {
                var methodDescriptor = Utils.CreateMethodDescriptor(defaultConstructorSymbol);

                // We don't want to explicity add the deafult constructor twice if, for example, the class is partial
                if (!this.DeclaredMethods.ContainsKey(methodDescriptor))
                {
                    var defaultConstructorSyntax = SyntaxFactory.ConstructorDeclaration(defaultConstructorSymbol.Name).AddBodyStatements();

                    var methodInfo = new MethodParserInfo(methodDescriptor)
                    {
                        ContainingTypeSyntax = node,
                        SemanticModel        = this.SemanticModel,
                        DeclarationNode      = defaultConstructorSyntax,
                        MethodSymbol         = defaultConstructorSymbol
                    };

                    this.DeclaredMethods.Add(methodDescriptor, methodInfo);
                }
            }

            base.VisitClassDeclaration(node);
        }
        private void ProcessBaseMethodDecl(MethodDescriptor thisDescriptor, MethodParserInfo methodInfo)
        {
            this.DeclaredMethods.Add(thisDescriptor, methodInfo);

            if (thisDescriptor.Equals(this.MethodDescriptor))
            {
                // found it!
                this.Result = methodInfo;
            }
        }
        private void ProcessArrowExpressionDecl(ArrowExpressionClauseSyntax arrowExpressionNode, TypeDeclarationSyntax containingTypeSyntax, IMethodSymbol methodSymbol)
        {
            var thisDescriptor = Utils.CreateMethodDescriptor(methodSymbol);

            var methodInfo = new MethodParserInfo(thisDescriptor)
            {
                ContainingTypeSyntax = containingTypeSyntax,
                SemanticModel        = this.SemanticModel,
                ArrowExpressionNode  = arrowExpressionNode,
                MethodSymbol         = methodSymbol
            };

            this.ProcessBaseMethodDecl(thisDescriptor, methodInfo);
        }
        //public override void Visit(SyntaxNode syntax)
        //{
        //	var kind = syntax.Kind();

        //	switch (kind)
        //	{
        //		case SyntaxKind.ClassDeclaration:
        //			{
        //				var declarationSyntax = (ClassDeclarationSyntax)syntax;
        //				var typeSymbol = this.SemanticModel.GetDeclaredSymbol(declarationSyntax);
        //				var defaultConstructorSymbol = typeSymbol.Constructors.SingleOrDefault(c => !c.IsStatic && c.IsImplicitlyDeclared);

        //				if (defaultConstructorSymbol != null)
        //				{
        //					var methodDescriptor = Utils.CreateMethodDescriptor(defaultConstructorSymbol);
        //					var defaultConstructorSyntax = SyntaxFactory.ConstructorDeclaration(defaultConstructorSymbol.Name).AddBodyStatements();

        //					var methodInfo = new MethodParserInfo(methodDescriptor)
        //					{
        //						ContainingTypeSyntax = declarationSyntax,
        //						SemanticModel = this.SemanticModel,
        //						DeclarationNode = defaultConstructorSyntax,
        //						MethodSymbol = defaultConstructorSymbol
        //					};

        //					this.DeclaredMethods.Add(methodDescriptor, methodInfo);
        //				}
        //				break;
        //			}

        //		case SyntaxKind.MethodDeclaration:
        //			{
        //				var declarationSyntax = (MethodDeclarationSyntax)syntax;
        //				var containingTypeSyntax = declarationSyntax.FirstAncestorOrSelf<TypeDeclarationSyntax>();
        //				var methodSymbol = this.SemanticModel.GetDeclaredSymbol(declarationSyntax);

        //				if (declarationSyntax.ExpressionBody != null)
        //				{
        //					this.ProcessArrowExpressionDecl(declarationSyntax.ExpressionBody, containingTypeSyntax, methodSymbol);
        //				}
        //				else
        //				{
        //					this.ProcessMethodDecl(declarationSyntax, containingTypeSyntax, methodSymbol);
        //				}
        //				break;
        //			}

        //		case SyntaxKind.ConstructorDeclaration:
        //			{
        //				var declarationSyntax = (ConstructorDeclarationSyntax)syntax;
        //				var containingTypeSyntax = declarationSyntax.FirstAncestorOrSelf<TypeDeclarationSyntax>();
        //				var methodSymbol = this.SemanticModel.GetDeclaredSymbol(declarationSyntax);

        //				this.ProcessMethodDecl(declarationSyntax, containingTypeSyntax, methodSymbol);
        //				break;
        //			}

        //		case SyntaxKind.PropertyDeclaration:
        //			{
        //				var propertySyntax = (PropertyDeclarationSyntax)syntax;
        //				var containingTypeSyntax = propertySyntax.FirstAncestorOrSelf<TypeDeclarationSyntax>();

        //				if (propertySyntax.ExpressionBody != null)
        //				{
        //					var propertySymbol = this.SemanticModel.GetDeclaredSymbol(propertySyntax);
        //					var methodSymbol = propertySymbol.GetMethod;

        //					this.ProcessArrowExpressionDecl(propertySyntax.ExpressionBody, containingTypeSyntax, methodSymbol);
        //				}
        //				else if (propertySyntax.AccessorList != null)
        //				{
        //					foreach (var accessor in propertySyntax.AccessorList.Accessors)
        //					{
        //						var methodSymbol = this.SemanticModel.GetDeclaredSymbol(accessor);
        //						this.ProcessPropertyAccessorDecl(accessor, containingTypeSyntax, methodSymbol);
        //					}
        //				}
        //				else
        //				{
        //					throw new NotImplementedException("Unknown PropertyDeclaration syntax.");
        //				}
        //				break;
        //			}
        //	}

        //	base.Visit(syntax);
        //}

        private void ProcessPropertyAccessorDecl(AccessorDeclarationSyntax accessor, TypeDeclarationSyntax containingTypeSyntax, IMethodSymbol methodSymbol)
        {
            var thisDescriptor = Utils.CreateMethodDescriptor(methodSymbol);

            var methodInfo = new MethodParserInfo(thisDescriptor)
            {
                ContainingTypeSyntax = containingTypeSyntax,
                SemanticModel        = this.SemanticModel,
                ProperyAccessorNode  = accessor,
                MethodSymbol         = methodSymbol
            };

            this.ProcessBaseMethodDecl(thisDescriptor, methodInfo);
        }