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); }