             return
         }
         if case .ParameterName(let name)? = stack.last?.kind {
-            replaceTop(.ParameterName(name + string))
+            name.appendString(string)
             return
         }
         add(.Text(string))

        case .Discussion:
            // Docs can have multiple discussions.
            discussion = discussion.flatMap { $0 + top.nodes } ?? top.nodes
        case .Parameter(let name, let discussion):
            assert(parameterDepth > 0)
            parameterDepth -= 1
            guard !name.isEmpty else {
                handleError(.MissingRequiredChildElement(element: "Parameter", childElement: "Name"))
                return
            }
            let p = Documentation.Parameter(name: name, discussion: discussion)
            parameters = parameters.flatMap { $0 + [ p ] } ?? [ p ]
        case .ParameterName(let name):
            assert(parameterDepth > 0)
            guard !name.isEmpty else {
                handleError(.MissingRequiredChildElement(element: "Parameter", childElement: "Name"))
                return
            }
            assert(top.nodes.isEmpty, "Other nodes present in parameter name")
            switch stack.last?.kind {
            case .Parameter(let currentName, let discussion)?:
                guard currentName.isEmpty else {
                    handleError(.MoreThanOneElement(element: "Parameter.Name"))
                    return
                }
                replaceTop(.Parameter(name: name, discussion: discussion))
            default:
                assertionFailure()
            }

        case Abstract
        case Discussion
        case Parameters
        case Parameter(name: NSMutableString, discussion: [DocumentationNode]?)
        case ParameterName(NSMutableString)
        case ParameterDiscussion
        case ResultDiscussion
        case Node(DocumentationNode.Element)
