0001    //
0002    //  SyntaxMap.swift
0003    //  SourceKitten
0004    //
0005    //  Created by JP Simard on 2015-01-03.
0006    //  Copyright (c) 2015 SourceKitten. All rights reserved.
0007    //
0008    
0009    import Foundation
0010    
0011    /// Represents a Swift file's syntax information.
0012    public struct SyntaxMap
File.swift:123
    public func processDictionary(dictionary: [String: SourceKitRepresentable], cursorInfoRequest: sourcekitd_object_t? = nil, syntaxMap: SyntaxMap? = nil) -> [String: SourceKitRepresentable] {
File.swift:168
    internal func furtherProcessDictionary(dictionary: [String: SourceKitRepresentable], documentedTokenOffsets: [Int], cursorInfoRequest: sourcekitd_object_t, syntaxMap: SyntaxMap) -> [String: SourceKitRepresentable] {
File.swift:194
    private func newSubstructure(dictionary: [String: SourceKitRepresentable], cursorInfoRequest: sourcekitd_object_t?, syntaxMap: SyntaxMap?) -> [SourceKitRepresentable]? {
File.swift:318
    public func getDocumentationCommentBody(dictionary: [String: SourceKitRepresentable], syntaxMap: SyntaxMap) -> String? {
String+SourceKitten.swift:448
    public func documentedTokenOffsets(syntaxMap: SyntaxMap) -> [Int] {
SwiftDocs.swift:54
        let syntaxMap = SyntaxMap(data: syntaxMapData)
SyntaxMap.swift:89
extension SyntaxMap: CustomStringConvertible {
SyntaxMap.swift:105
extension SyntaxMap: Equatable {}
SyntaxMap.swift:115
public func ==(lhs: SyntaxMap, rhs: SyntaxMap) -> Bool {
SyntaxMap.swift:115
public func ==(lhs: SyntaxMap, rhs: SyntaxMap) -> Bool {
{ 0013 /// Array of SyntaxToken's. 0014 public let tokens
String+SourceKitten.swift:449
        let documentableOffsets = syntaxMap.tokens.filter(isTokenDocumentable).map {
SyntaxMap.swift:22
        self.tokens = tokens
SyntaxMap.swift:31
        tokens = data.map { item in
SyntaxMap.swift:64
        let tokensBeforeOffset = tokens.lazy.reverse().filter { $0.offset < offset }
SyntaxMap.swift:93
            let jsonData = try NSJSONSerialization.dataWithJSONObject(tokens.map { $0.dictionaryValue },
SyntaxMap.swift:116
    if lhs.tokens.count != rhs.tokens.count {
SyntaxMap.swift:116
    if lhs.tokens.count != rhs.tokens.count {
SyntaxMap.swift:119
    for (index, value) in lhs.tokens.enumerate() {
SyntaxMap.swift:120
        if rhs.tokens[index] != value {
: [SyntaxToken] 0015 0016 /** 0017 Create a SyntaxMap by passing in tokens directly. 0018 0019 - parameter tokens: Array of SyntaxToken's. 0020 */ 0021 public init(tokens: [SyntaxToken]) { 0022 self.tokens = tokens 0023 } 0024 0025 /** 0026 Create a SyntaxMap by passing in NSData from a SourceKit `editor.open` response to be parsed. 0027 0028 - parameter data: NSData from a SourceKit `editor.open` response 0029 */ 0030 public init
SwiftDocs.swift:54
        let syntaxMap = SyntaxMap(data: syntaxMapData)
SyntaxMap.swift:43
        self.init(data: SwiftDocKey.getSyntaxMap(sourceKitResponse)!)
(data: [SourceKitRepresentable]) { 0031 tokens = data.map { item in 0032 let dict = item as! [String: SourceKitRepresentable] 0033 return SyntaxToken(type: dict["key.kind"] as! String, offset: Int(dict["key.offset"] as! Int64), length: Int(dict["key.length"] as! Int64)) 0034 } 0035 } 0036 0037 /** 0038 Create a SyntaxMap from a SourceKit `editor.open` response. 0039 0040 - parameter sourceKitResponse: SourceKit `editor.open` response. 0041 */ 0042 public init
SyntaxMap.swift:52
        self.init(sourceKitResponse: Request.EditorOpen(file).send())
(sourceKitResponse: [String: SourceKitRepresentable]) { 0043 self.init(data: SwiftDocKey.getSyntaxMap(sourceKitResponse)!) 0044 } 0045 0046 /** 0047 Create a SyntaxMap from a File to be parsed. 0048 0049 - parameter file: File to be parsed. 0050 */ 0051 public init(file: File) { 0052 self.init(sourceKitResponse: Request.EditorOpen(file).send()) 0053 } 0054 0055 /** 0056 Returns the range of the last contiguous comment-like block from the tokens in `self` prior to 0057 `offset`. 0058 0059 - parameter offset: Last possible byte offset of the range's start. 0060 */ 0061 public func commentRangeBeforeOffset
File.swift:320
            return syntaxMap.commentRangeBeforeOffset(Int(offset)).flatMap { commentByteRange in
(offset: Int) -> Range<Int>? { 0062 0063 // be lazy for performance 0064 let tokensBeforeOffset = tokens.lazy.reverse().filter { $0.offset < offset } 0065 0066 let docTypes = SyntaxKind.docComments().map({$0.rawValue}) 0067 let isDoc = { (token: SyntaxToken) in docTypes.contains(token.type) } 0068 let isNotDoc = { !isDoc($0) } 0069 0070 guard let commentBegin = tokensBeforeOffset.indexOf(isDoc) else { return nil } 0071 let tokensBeginningComment = tokensBeforeOffset.suffixFrom(commentBegin) 0072 0073 // For avoiding declaring `var` with type annotation before `if let`, use `map()` 0074 let commentEnd = tokensBeginningComment.indexOf(isNotDoc) 0075 let commentTokensImmediatelyPrecedingOffset = ( 0076 commentEnd.map(tokensBeginningComment.prefixUpTo) ?? tokensBeginningComment 0077 ).reverse() 0078 0079 return commentTokensImmediatelyPrecedingOffset.first.flatMap { firstToken in 0080 return commentTokensImmediatelyPrecedingOffset.last.map { lastToken in 0081 return Range(start: firstToken.offset, end: lastToken.offset + lastToken.length) 0082 } 0083 } 0084 } 0085 } 0086 0087 // MARK: CustomStringConvertible 0088 0089 extension SyntaxMap: CustomStringConvertible { 0090 /// A textual JSON representation of `SyntaxMap`. 0091 public var description: String { 0092 do { 0093 let jsonData = try NSJSONSerialization.dataWithJSONObject(tokens.map { $0.dictionaryValue }, 0094 options: .PrettyPrinted) 0095 if let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as String? { 0096 return jsonString 0097 } 0098 } catch {} 0099 return "[\n\n]" // Empty JSON Array 0100 } 0101 } 0102 0103 // MARK: Equatable 0104 0105 extension SyntaxMap: Equatable {} 0106 0107 /** 0108 Returns true if `lhs` SyntaxMap is equal to `rhs` SyntaxMap. 0109 0110 - parameter lhs: SyntaxMap to compare to `rhs`. 0111 - parameter rhs: SyntaxMap to compare to `lhs`. 0112 0113 - returns: True if `lhs` SyntaxMap is equal to `rhs` SyntaxMap. 0114 */ 0115 public func ==(lhs: SyntaxMap, rhs: SyntaxMap) -> Bool { 0116 if lhs.tokens.count != rhs.tokens.count { 0117 return false 0118 } 0119 for (index, value) in lhs.tokens.enumerate() { 0120 if rhs.tokens[index] != value { 0121 return false 0122 } 0123 } 0124 return true 0125 } 0126