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