/// <summary> /// Normalizes the <paramref name="methodDeclaration" /> and adds the generated members. /// </summary> /// <param name="methodDeclaration">The method declaration that should be normalized.</param> private MethodDeclarationSyntax NormalizeExternMethod(MethodDeclarationSyntax methodDeclaration) { var originalDeclaration = methodDeclaration; var methodDelegate = CreateDelegate(methodDeclaration); var methodField = CreateField(methodDelegate); // Add the [Required] attribute if it is not already present if (!methodDeclaration.HasAttribute<RequiredAttribute>(SemanticModel)) { methodDeclaration = methodDeclaration.RemoveTrivia(); methodDeclaration = methodDeclaration.WithAttributeLists(methodDeclaration.AttributeLists.Add(_requiredAttribute.WithTrailingSpace())); } // Remove the 'extern' keyword from the method var externIndex = methodDeclaration.Modifiers.IndexOf(SyntaxKind.ExternKeyword); methodDeclaration = methodDeclaration.WithModifiers(methodDeclaration.Modifiers.RemoveAt(externIndex)); // Add the [DebuggerHidden] attribute if it is not already present if (!originalDeclaration.HasAttribute<DebuggerHiddenAttribute>(SemanticModel)) methodDeclaration = methodDeclaration.WithAttributeLists(methodDeclaration.AttributeLists.Add(_debuggerHiddenAttribute)); // Replace the method's body and ensure that we don't modify the line count of the containing type methodDeclaration = AddBackingFieldAttribute(methodDeclaration); methodDeclaration = ReplaceBodyWithDelegateInvocation(methodDeclaration); methodDeclaration = methodDeclaration.NormalizeWhitespace(); methodDeclaration = methodDeclaration.WithTrivia(originalDeclaration); ++_portCount; AddMembers(originalDeclaration.GetMethodSymbol(SemanticModel).ContainingType, methodField, methodDelegate); return methodDeclaration.EnsureLineCount(originalDeclaration); }
/// <summary> /// Normalizes the <paramref name="declaration" />. /// </summary> public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax declaration) { var originalDeclaration = declaration; var methodSymbol = declaration.GetMethodSymbol(SemanticModel); if (!methodSymbol.ContainingType.IsFaultEffect(SemanticModel) || !methodSymbol.IsOverride) return declaration; var memberAccess = Syntax.MemberAccessExpression(Syntax.BaseExpression(), methodSymbol.Name); var invocation = Syntax.InvocationExpression(memberAccess, CreateInvocationArguments(methodSymbol.Parameters)); declaration = declaration.WithBody(CreateBody(methodSymbol, declaration.Body, invocation)); return declaration.EnsureLineCount(originalDeclaration); }