| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- // Sources/SwiftProtobufPluginLibrary/Google_Protobuf_SourceCodeInfo+Extensions.swift - SourceCodeInfo Additions
- //
- // Copyright (c) 2014 - 2017 Apple Inc. and the project authors
- // Licensed under Apache License v2.0 with Runtime Library Exception
- //
- // See LICENSE.txt for license information:
- // https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
- //
- // -----------------------------------------------------------------------------
- import Foundation
- import SwiftProtobuf
- extension Google_Protobuf_SourceCodeInfo.Location {
- /// Builds a source comment out of the location's comment fields.
- ///
- /// If leadingDetachedPrefix is not provided, those comments won't
- /// be collected.
- public func asSourceComment(
- commentPrefix: String,
- leadingDetachedPrefix: String? = nil
- ) -> String {
- func escapeMarkup(_ text: String) -> String {
- // Proto file comments don't really have any markup associated with
- // them. Swift uses something like MarkDown:
- // "Markup Formatting Reference"
- // https://developer.apple.com/library/content/documentation/Xcode/Reference/xcode_markup_formatting_ref/index.html
- // Sadly that format doesn't really lend itself to any form of
- // escaping to ensure comments are interpreted markup when they
- // really aren't. About the only thing that could be done is to
- // try and escape some set of things that could start directives,
- // and that gets pretty chatty/ugly pretty quickly.
- text
- }
- func prefixLines(text: String, prefix: String) -> String {
- var result = String()
- // Protoc doesn't normalize newlines in the comments, make sure CRLF
- // doesn't insert blank lines and the generated file is hopefully then
- // consistent in using '\n'.
- var lines =
- text.replacingOccurrences(of: "\r\n", with: "\n").components(separatedBy: .newlines)
- // Trim any blank lines off the end.
- while !lines.isEmpty && lines.last!.trimmingCharacters(in: .whitespaces).isEmpty {
- lines.removeLast()
- }
- for line in lines {
- result.append(prefix + line + "\n")
- }
- return result
- }
- var result = String()
- if let leadingDetachedPrefix = leadingDetachedPrefix {
- for detached in leadingDetachedComments {
- let comment = prefixLines(text: detached, prefix: leadingDetachedPrefix)
- if !comment.isEmpty {
- result += comment
- // Detached comments have blank lines between then (and
- // anything that follows them).
- result += "\n"
- }
- }
- }
- let comments = hasLeadingComments ? leadingComments : trailingComments
- result += prefixLines(text: escapeMarkup(comments), prefix: commentPrefix)
- return result
- }
- }
|