diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..a8200ed --- /dev/null +++ b/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version:5.3 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "SyntaxKit", + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "SyntaxKit", + targets: ["SyntaxKit"] + ), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "SyntaxKit", + dependencies: [] + ), + .testTarget( + name: "SyntaxKitTests", + dependencies: ["SyntaxKit"], + exclude: ["Fixtures"] + ), + ] +) diff --git a/Readme.markdown b/README.md similarity index 100% rename from Readme.markdown rename to README.md diff --git a/SyntaxKit/Resources/Info.plist b/Resources/Info.plist similarity index 85% rename from SyntaxKit/Resources/Info.plist rename to Resources/Info.plist index 17dee6f..4191d93 100644 --- a/SyntaxKit/Resources/Info.plist +++ b/Resources/Info.plist @@ -21,7 +21,7 @@ CFBundleVersion $(CURRENT_PROJECT_VERSION) NSHumanReadableCopyright - Copyright © 2015-2016 Sam Soffes. Copyright © 2016 Alexander Hedges. All rights reserved. + Copyright © 2015-2016 Sam Soffes. Copyright © 2016-2021 Alexander Hedges. Copyright © 2021 Zheng Wu. All rights reserved. NSPrincipalClass diff --git a/SyntaxKit/AttributedParser.swift b/Sources/SyntaxKit/AttributedParser.swift similarity index 100% rename from SyntaxKit/AttributedParser.swift rename to Sources/SyntaxKit/AttributedParser.swift diff --git a/SyntaxKit/AttributedParsingOperation.swift b/Sources/SyntaxKit/AttributedParsingOperation.swift similarity index 80% rename from SyntaxKit/AttributedParsingOperation.swift rename to Sources/SyntaxKit/AttributedParsingOperation.swift index 1350d8e..8c8458c 100644 --- a/SyntaxKit/AttributedParsingOperation.swift +++ b/Sources/SyntaxKit/AttributedParsingOperation.swift @@ -18,6 +18,8 @@ // Copyright © 2016 Alexander Hedges. All rights reserved. // +import Foundation + /// Represents one change (insertion or deletion) between two strings internal struct Diff { @@ -26,6 +28,7 @@ internal struct Diff { /// - Insertion: The inserted sting /// - Deletion: The empty string var change: String + /// The range of the change in the old string /// /// - Insertion: The location of the insertion and length 0 @@ -60,23 +63,28 @@ open class AttributedParsingOperation: Operation { /// /// The sender is passed in so it can be used to check if the operation was /// cancelled after the call. - public typealias OperationCallback = ([(range: NSRange, attributes: Attributes?)], AttributedParsingOperation) -> Void + #if DEBUG + public typealias OperationTuple = (scope: String, range: NSRange, attributes: Attributes?) + #else + public typealias OperationTuple = (range: NSRange, attributes: Attributes?) + #endif + public typealias OperationCallback = ([OperationTuple], AttributedParsingOperation) -> Void // MARK: - Properties private let parser: AttributedParser private let operationCallback: OperationCallback - private var parsedRange: NSRange? + private var outdatedRange: NSRange? // MARK: - Initializers - + /// Initializer for the first instance in the NSOperationQueue /// /// Can also be used if no incremental parsing is desired public init(string: String, language: Language, theme: Theme, callback: @escaping OperationCallback) { - parser = AttributedParser(language: language, theme: theme) - parser.toParse = ScopedString(string: string) - operationCallback = callback + self.parser = AttributedParser(language: language, theme: theme) + self.parser.toParse = ScopedString(string: string) + self.operationCallback = callback super.init() } @@ -94,8 +102,8 @@ open class AttributedParsingOperation: Operation { /// string that was added. /// - parameter callback: The callback to call with results. public init(string: String, previousOperation: AttributedParsingOperation, changeIsInsertion insertion: Bool, changedRange range: NSRange, newCallback callback: OperationCallback? = nil) { - parser = previousOperation.parser - operationCallback = callback ?? previousOperation.operationCallback + self.parser = AttributedParser(language: previousOperation.parser.language, theme: previousOperation.parser.theme) + self.operationCallback = callback ?? previousOperation.operationCallback super.init() @@ -106,8 +114,10 @@ open class AttributedParsingOperation: Operation { diff = Diff(change: "", range: range) } - if diff.representsChanges(from: parser.toParse.string, to: string) { - self.parsedRange = AttributedParsingOperation.outdatedRange(in: string as NSString, forChange: diff, updatingPreviousResult: &self.parser.toParse) + var prevParse = previousOperation.parser.toParse + if diff.representsChanges(from: prevParse.string, to: string) { + self.outdatedRange = AttributedParsingOperation.outdatedRange(in: string as NSString, forChange: diff, updatingPreviousResult: &prevParse) + self.parser.toParse = prevParse } else { self.parser.toParse = ScopedString(string: string) } @@ -116,22 +126,30 @@ open class AttributedParsingOperation: Operation { // MARK: - NSOperation Implementation open override func main() { - var resultsArray: [(range: NSRange, attributes: Attributes?)] = [] + var resultsArray: [OperationTuple] = [] + #if DEBUG + let callback = { (scope: String, range: NSRange, attributes: Attributes?) in + if let attributes = attributes { + resultsArray.append((scope, range, attributes)) + } + } + #else let callback = { (_: String, range: NSRange, attributes: Attributes?) in if let attributes = attributes { resultsArray.append((range, attributes)) } } + #endif - parser.parse(in: self.parsedRange, match: callback) + self.parser.parse(in: self.outdatedRange, match: callback) - if !parser.aborted { - operationCallback(resultsArray, self) + if !self.parser.aborted { + self.operationCallback(resultsArray, self) } } open override func cancel() { - parser.aborted = true + self.parser.aborted = true super.cancel() } @@ -157,7 +175,7 @@ open class AttributedParsingOperation: Operation { /// /// - returns: A range in newString that can be safely re-parsed. Or nil if /// everything has to be reparsed. - class func outdatedRange(in newString: NSString, forChange diff: Diff, updatingPreviousResult previous: inout ScopedString) -> NSRange? { + class func outdatedRange(in newString: NSString, forChange diff: Diff, updatingPreviousResult previous: inout ScopedString) -> NSRange { let linesRange: NSRange let range: NSRange if diff.isInsertion() { diff --git a/Sources/SyntaxKit/Attributes.swift b/Sources/SyntaxKit/Attributes.swift new file mode 100644 index 0000000..e16b1cd --- /dev/null +++ b/Sources/SyntaxKit/Attributes.swift @@ -0,0 +1,37 @@ +// +// Attributes.swift +// +// +// Created by Zheng Wu on 2021/3/10. +// + +import Foundation + +public typealias Attributes = [NSAttributedString.Key: Any] + +public extension NSAttributedString.Key { + // Shared + static let foreground = NSAttributedString.Key("foreground") + static let background = NSAttributedString.Key("background") + + // Text Only + static let fontName = NSAttributedString.Key("fontName") + static let fontSize = NSAttributedString.Key("fontSize") + static let fontStyle = NSAttributedString.Key("fontStyle") + static let caret = NSAttributedString.Key("caret") + static let selection = NSAttributedString.Key("selection") + static let invisibles = NSAttributedString.Key("invisibles") + static let lineHighlight = NSAttributedString.Key("lineHighlight") + + // Gutter Only + static let divider = NSAttributedString.Key("divider") + static let selectionBorder = NSAttributedString.Key("selectionBorder") + static let icons = NSAttributedString.Key("icons") + static let iconsHover = NSAttributedString.Key("iconsHover") + static let iconsPressed = NSAttributedString.Key("iconsPressed") + static let selectionForeground = NSAttributedString.Key("selectionForeground") + static let selectionBackground = NSAttributedString.Key("selectionBackground") + static let selectionIcons = NSAttributedString.Key("selectionIcons") + static let selectionIconsHover = NSAttributedString.Key("selectionIconsHover") + static let selectionIconsPressed = NSAttributedString.Key("selectionIconsPressed") +} diff --git a/SyntaxKit/BundleManager.swift b/Sources/SyntaxKit/BundleManager.swift similarity index 54% rename from SyntaxKit/BundleManager.swift rename to Sources/SyntaxKit/BundleManager.swift index b33d109..c1f0a54 100644 --- a/SyntaxKit/BundleManager.swift +++ b/Sources/SyntaxKit/BundleManager.swift @@ -12,6 +12,8 @@ // Copyright © 2016 Alexander Hedges. All rights reserved. // +import Foundation + open class BundleManager { public enum TextMateFileType { @@ -37,10 +39,15 @@ open class BundleManager { /// has to be done separately using clearLanguageCache. open var languageCaching: Bool = true + /// You probably want to leave the themeCaching property set to true. + /// + /// - note: Setting it to false will not invalidate or purge the cache. This + /// has to be done separately using clearThemeCache. + open var themeCaching: Bool = true + public static var defaultManager: BundleManager? private var bundleCallback: BundleLocationCallback - private var dependencies: [Language] = [] private var cachedLanguages: [String: Language] = [:] private var cachedThemes: [String: Theme] = [:] @@ -70,56 +77,78 @@ open class BundleManager { return language } - self.dependencies = [] - var language = self.loadRawLanguage(withIdentifier: identifier) - language?.validate(with: self.dependencies) + guard let newLanguage = includeLanguage(withIdentifier: identifier) else { + return nil + } + + var languageSet = Set(arrayLiteral: newLanguage) + var languageDependencies = [Language]() + + while let language = languageSet.popFirst() { + languageDependencies.append(language) + for childLanguageRef in language.referencedLanguageRefs { + if languageDependencies.map({ $0.scopeName }).contains(childLanguageRef) { + continue + } + guard let childLanguage = includeLanguage(withIdentifier: childLanguageRef) else { + continue + } + languageSet.insert(childLanguage) + } + } + + // Now we finally got all helper languages + newLanguage.validate(with: languageDependencies) - if languageCaching && language != nil { - self.cachedLanguages[identifier] = language + if languageCaching { + self.cachedLanguages[identifier] = newLanguage } - self.dependencies = [] - return language + return newLanguage } - open func theme(withIdentifier identifier: String) -> Theme? { + open func theme(withIdentifier identifier: String, fontCallback: Theme.FontCallback? = nil) -> Theme? { if let theme = cachedThemes[identifier] { return theme } - guard let dictURL = self.bundleCallback(identifier, .theme), - let plist = NSDictionary(contentsOf: dictURL) as? [String: Any], - let newTheme = Theme(dictionary: plist) else { - return nil + guard let newTheme = includeTheme(withIdentifier: identifier, fontCallback: fontCallback) else { + return nil } - cachedThemes[identifier] = newTheme + if themeCaching { + self.cachedThemes[identifier] = newTheme + } return newTheme } - /// Clears the language cache. Use if low on memory. - open func clearLanguageCache() { - self.cachedLanguages = [:] + /// Use if low on memory. + open func clearCaches() { + self.cachedLanguages.removeAll() + self.cachedThemes.removeAll() } // MARK: - Internal Interface /// - parameter identifier: The identifier of the requested language. - /// - returns: The Language with unresolved extenal references, if found - func loadRawLanguage(withIdentifier identifier: String) -> Language? { - let indexOfStoredLanguage = self.dependencies.firstIndex { (lang: Language) in lang.scopeName == identifier } - - if let index = indexOfStoredLanguage { - return self.dependencies[index] - } else { - guard let dictURL = self.bundleCallback(identifier, .language), - let plist = NSDictionary(contentsOf: dictURL) as? [String: Any], - let newLanguage = Language(dictionary: plist, manager: self) else { - return nil - } - - self.dependencies.append(newLanguage) - return newLanguage + /// - returns: The Language with unresolved extenal references, if found. + private func includeLanguage(withIdentifier identifier: String) -> Language? { + guard let dictURL = self.bundleCallback(identifier, .language), + let plist = NSDictionary(contentsOf: dictURL) as? [String: Any], + let newLanguage = Language(dictionary: plist, manager: self) else { + return nil } + return newLanguage + } + + /// - parameter identifier: The identifier of the requested theme. + /// - returns: The Theme with unresolved extenal references, if found. + private func includeTheme(withIdentifier identifier: String, fontCallback: Theme.FontCallback? = nil) -> Theme? { + guard let dictURL = self.bundleCallback(identifier, .theme), + let plist = NSDictionary(contentsOf: dictURL) as? [String: Any], + let newTheme = Theme(dictionary: plist, fontCallback: fontCallback) else { + return nil + } + return newTheme } } diff --git a/SyntaxKit/Capture.swift b/Sources/SyntaxKit/Capture.swift similarity index 96% rename from SyntaxKit/Capture.swift rename to Sources/SyntaxKit/Capture.swift index 839f771..8db21ec 100644 --- a/SyntaxKit/Capture.swift +++ b/Sources/SyntaxKit/Capture.swift @@ -8,6 +8,8 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // +import Foundation + internal struct Capture { // MARK: - Properties diff --git a/SyntaxKit/CaptureCollection.swift b/Sources/SyntaxKit/CaptureCollection.swift similarity index 98% rename from SyntaxKit/CaptureCollection.swift rename to Sources/SyntaxKit/CaptureCollection.swift index 0aedf7d..bd1ea49 100644 --- a/SyntaxKit/CaptureCollection.swift +++ b/Sources/SyntaxKit/CaptureCollection.swift @@ -8,6 +8,8 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // +import Foundation + internal struct CaptureCollection { // MARK: - Properties diff --git a/SyntaxKit/Color.swift b/Sources/SyntaxKit/Color.swift similarity index 99% rename from SyntaxKit/Color.swift rename to Sources/SyntaxKit/Color.swift index 36326f4..9f03645 100644 --- a/SyntaxKit/Color.swift +++ b/Sources/SyntaxKit/Color.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Sam Soffes. All rights reserved. // -#if os(OSX) +#if os(macOS) import AppKit.NSColor public typealias ColorType = NSColor diff --git a/Sources/SyntaxKit/Font.swift b/Sources/SyntaxKit/Font.swift new file mode 100644 index 0000000..eae738e --- /dev/null +++ b/Sources/SyntaxKit/Font.swift @@ -0,0 +1,67 @@ +// +// Font.swift +// SyntaxKit +// +// Created by Zheng Wu on 2021/3/6. +// Copyright © 2021 Zheng Wu. All rights reserved. +// + +#if os(macOS) +import AppKit.NSFont +public typealias FontType = NSFont + +extension NSFont { + func withTraits(traits: NSFontTraitMask) -> NSFont { + return NSFontManager.shared.convert( + self, + toHaveTrait: traits + ) + } + + func bold() -> NSFont { + return withTraits(traits: .boldFontMask) + } + + func italic() -> NSFont { + return withTraits(traits: .italicFontMask) + } + + func boldItalic() -> NSFont { + return withTraits(traits: [.boldFontMask, .italicFontMask]) + } +} +#else +import UIKit.UIFont +public typealias FontType = UIFont + +extension UIFont { + func withTraits(traits: UIFontDescriptor.SymbolicTraits) -> UIFont { + let descriptor = fontDescriptor.withSymbolicTraits(traits) + return UIFont(descriptor: descriptor!, size: 0) // size 0 means keep the size as it is + } + + func bold() -> UIFont { + return withTraits(traits: .traitBold) + } + + func italic() -> UIFont { + return withTraits(traits: .traitItalic) + } + + func boldItalic() -> UIFont { + return withTraits(traits: [.traitBold, .traitItalic]) + } +} +#endif + +public typealias Font = FontType + +public enum FontStyle: String { + case initial + case plain + case bold + case italic + case boldItalic + case underline + case strikethrough +} diff --git a/SyntaxKit/Language.swift b/Sources/SyntaxKit/Language.swift similarity index 78% rename from SyntaxKit/Language.swift rename to Sources/SyntaxKit/Language.swift index b23b9ee..8f3f0b9 100644 --- a/SyntaxKit/Language.swift +++ b/Sources/SyntaxKit/Language.swift @@ -9,7 +9,19 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // -public struct Language { +import Foundation + +public struct Language: Hashable { + + public static func == (lhs: Language, rhs: Language) -> Bool { + return lhs.uuid == rhs.uuid && lhs.name == rhs.name && lhs.scopeName == rhs.scopeName + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(uuid) + hasher.combine(name) + hasher.combine(scopeName) + } // MARK: - Properties @@ -21,6 +33,8 @@ public struct Language { let referenceManager: ReferenceManager let repository: Repository + var referencedLanguageRefs: [String] { referenceManager.includedLanguageRefs } + static let globalScope: String = "GLOBAL" // MARK: - Initializers @@ -49,7 +63,7 @@ public struct Language { /// - parameter helperLanguages: The languages that the language has /// references to resolve against. This should at least contain the /// language itself. - mutating func validate(with helperLanguages: [Language]) { + func validate(with helperLanguages: [Language]) { ReferenceManager.resolveExternalReferences(between: helperLanguages, basename: self.scopeName) } } diff --git a/SyntaxKit/Parser.swift b/Sources/SyntaxKit/Parser.swift similarity index 81% rename from SyntaxKit/Parser.swift rename to Sources/SyntaxKit/Parser.swift index f0cdba4..a390cc9 100644 --- a/SyntaxKit/Parser.swift +++ b/Sources/SyntaxKit/Parser.swift @@ -10,6 +10,8 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // +import Foundation + open class Parser { // MARK: - Types @@ -66,7 +68,7 @@ open class Parser { while startIndex < endIndex { let endPattern = endScope.attribute as? Pattern ?? language.pattern - guard let results = self.matchSubpatterns(of: endPattern, in: NSRange(location: startIndex, length: endIndex - startIndex)) else { + guard let results = self.matchSubpatterns(of: endPattern, in: NSRange(location: startIndex, length: endIndex - startIndex), beginResults: nil) else { return } @@ -115,7 +117,7 @@ open class Parser { /// /// - returns: The result set containing the lexical scope names with range /// information or nil if aborted. May exceed range. - private func matchSubpatterns(of pattern: Pattern, in range: NSRange) -> ResultSet? { + private func matchSubpatterns(of pattern: Pattern, in range: NSRange, beginResults begin: ResultSet?) -> ResultSet? { let stop = range.location + range.length var lineStart = range.location var lineEnd = range.location @@ -130,23 +132,24 @@ open class Parser { return nil } - let bestMatchForMiddle = match(pattern.subpatterns, in: range) + let bestMatchForMiddle = self.match(pattern.subpatterns, in: range) - if let patternEnd = pattern.end, - let endMatchResult = self.match(patternEnd, in: range, captures: pattern.endCaptures) { - if let middleMatch = bestMatchForMiddle { - if !pattern.applyEndPatternLast && endMatchResult.range.location <= middleMatch.match.range.location || endMatchResult.range.location < middleMatch.match.range.location { + if let patternEnd = pattern.end { + if let endMatchResult = self.match(patternEnd.expandedRegularExpression(with: toParse.string, matches: begin), in: range, captures: pattern.endCaptures) { + if let middleMatch = bestMatchForMiddle { + if !pattern.applyEndPatternLast && endMatchResult.range.location <= middleMatch.match.range.location || endMatchResult.range.location < middleMatch.match.range.location { + result.add(endMatchResult) + return result + } + } else { result.add(endMatchResult) return result } - } else { - result.add(endMatchResult) - return result } } guard let middleMatch = bestMatchForMiddle, - let middleResult = middleMatch.pattern.match != nil ? middleMatch.match : matchAfterBegin(of: middleMatch.pattern, beginResults: middleMatch.match) else { + let middleResult = middleMatch.pattern.match != nil ? middleMatch.match : self.matchAfterBegin(of: middleMatch.pattern, beginResults: middleMatch.match) else { break } if middleResult.range.length == 0 { @@ -178,7 +181,7 @@ open class Parser { var interestingBounds = range var bestResult: (pattern: Pattern, match: ResultSet)? for pattern in patterns { - let currentMatch = self.firstMatch(of: pattern, in: range) + let currentMatch = self.firstMatch(of: pattern, in: range, beginResults: bestResult?.match) if currentMatch?.match.range.location == range.location { return currentMatch } else if let currMatch = currentMatch { @@ -202,19 +205,19 @@ open class Parser { /// - parameter range: The range in which to match the pattern /// /// - returns: The matched pattern and the matching result. Nil on failure. - private func firstMatch(of pattern: Pattern, in range: NSRange) -> (pattern: Pattern, match: ResultSet)? { + private func firstMatch(of pattern: Pattern, in range: NSRange, beginResults begin: ResultSet?) -> (pattern: Pattern, match: ResultSet)? { if let expression = pattern.match { - if let resultSet = match(expression, in: range, captures: pattern.captures, baseSelector: pattern.name) { + if let resultSet = self.match(expression.expandedRegularExpression(with: toParse.string, matches: begin), in: range, captures: pattern.captures, baseSelector: pattern.name) { if resultSet.range.length != 0 { return (pattern, resultSet) } } } else if let begin = pattern.begin { - if let beginResults = match(begin, in: range, captures: pattern.beginCaptures) { + if let beginResults = self.match(begin, in: range, captures: pattern.beginCaptures) { return (pattern, beginResults) } } else if pattern.subpatterns.count >= 1 { - return match(pattern.subpatterns, in: range) + return self.match(pattern.subpatterns, in: range) } return nil } @@ -230,19 +233,19 @@ open class Parser { /// - parameter begin: The match result of the beginning /// - returns: The result of matching the given pattern or nil on abortion. private func matchAfterBegin(of pattern: Pattern, beginResults begin: ResultSet) -> ResultSet? { - let newLocation = NSMaxRange(begin.range) - guard let endResults = matchSubpatterns(of: pattern, in: NSRange(location: newLocation, length: (toParse.string as NSString).length - newLocation)) else { - return nil - } + let newLocation = NSMaxRange(begin.range) + guard let endResults = self.matchSubpatterns(of: pattern, in: NSRange(location: newLocation, length: (toParse.string as NSString).length - newLocation), beginResults: begin) else { + return nil + } - let result = ResultSet(startingRange: endResults.range) - if let patternName = pattern.name { - result.add(Result(identifier: patternName, range: NSUnionRange(begin.range, endResults.range))) - } - result.add(Scope(identifier: pattern.name ?? "", range: NSRange(location: begin.range.location + begin.range.length, length: NSUnionRange(begin.range, endResults.range).length - begin.range.length), attribute: pattern)) - result.add(begin) - result.add(endResults) - return result + let result = ResultSet(startingRange: endResults.range) + if let patternName = pattern.name { + result.add(Result(identifier: patternName, range: NSUnionRange(begin.range, endResults.range))) + } + result.add(Scope(identifier: pattern.name ?? "", range: NSRange(location: begin.range.location + begin.range.length, length: NSUnionRange(begin.range, endResults.range).length - begin.range.length), attribute: pattern)) + result.add(begin) + result.add(endResults) + return result } /// Matches a given regular expression in the String and returns range @@ -258,14 +261,14 @@ open class Parser { /// - returns: The set containing the results. May be nil if the expression /// could not match any part of the string. It may also be empty /// and only contain range information to show what it matched. - private func match(_ expression: NSRegularExpression, in range: NSRange, captures: CaptureCollection?, baseSelector: String? = nil) -> ResultSet? { + private func match(_ expression: RegularExpression, in range: NSRange, captures: CaptureCollection?, baseSelector: String? = nil) -> ResultSet? { guard let result = expression.firstMatch(in: toParse.string, options: [.withTransparentBounds], range: range) else { return nil } let resultSet = ResultSet(startingRange: result.range) if let base = baseSelector { - resultSet.add(Result(identifier: base, range: result.range)) + resultSet.add(Result(identifier: base, range: result.range, result: result)) } if let captures = captures { @@ -278,9 +281,9 @@ open class Parser { if range.location == NSNotFound { continue } - + if let scope = captures[index]?.name { - resultSet.add(Result(identifier: scope, range: range)) + resultSet.add(Result(identifier: scope, range: range, result: result)) } } } diff --git a/SyntaxKit/Pattern.swift b/Sources/SyntaxKit/Pattern.swift similarity index 84% rename from SyntaxKit/Pattern.swift rename to Sources/SyntaxKit/Pattern.swift index 4e27605..784d434 100644 --- a/SyntaxKit/Pattern.swift +++ b/Sources/SyntaxKit/Pattern.swift @@ -19,17 +19,19 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // +import Foundation + @objc(SKPattern) internal class Pattern: NSObject { // MARK: - Properties var name: String? { return _name } - var match: NSRegularExpression? { return _match } + var match: RegularExpression? { return _match } var captures: CaptureCollection? { return _captures } - var begin: NSRegularExpression? { return _begin } + var begin: RegularExpression? { return _begin } var beginCaptures: CaptureCollection? { return _beginCaptures } - var end: NSRegularExpression? { return _end } + var end: RegularExpression? { return _end } var endCaptures: CaptureCollection? { return _endCaptures } var applyEndPatternLast: Bool { return _applyEndPatternLast } var parent: Pattern? { return _parent } @@ -37,11 +39,11 @@ internal class Pattern: NSObject { // swiftlint:disable strict_fileprivate fileprivate var _name: String? - fileprivate var _match: NSRegularExpression? + fileprivate var _match: RegularExpression? fileprivate var _captures: CaptureCollection? - fileprivate var _begin: NSRegularExpression? + fileprivate var _begin: RegularExpression? fileprivate var _beginCaptures: CaptureCollection? - fileprivate var _end: NSRegularExpression? + fileprivate var _end: RegularExpression? fileprivate var _endCaptures: CaptureCollection? fileprivate var _applyEndPatternLast: Bool = false fileprivate weak var _parent: Pattern? @@ -55,15 +57,15 @@ internal class Pattern: NSObject { _name = dictionary["name"] as? String if let matchExpr = dictionary["match"] as? String { - _match = try? NSRegularExpression(pattern: matchExpr, options: [.anchorsMatchLines]) + _match = try? RegularExpression(pattern: matchExpr, options: [.anchorsMatchLines]) } if let beginExpr = dictionary["begin"] as? String { - _begin = try? NSRegularExpression(pattern: beginExpr, options: [.anchorsMatchLines]) + _begin = try? RegularExpression(pattern: beginExpr, options: [.anchorsMatchLines]) } if let endExpr = dictionary["end"] as? String { - _end = try? NSRegularExpression(pattern: endExpr, options: [.anchorsMatchLines]) + _end = try? RegularExpression(pattern: endExpr, options: [.anchorsMatchLines]) } _applyEndPatternLast = dictionary["applyEndPatternLast"] as? Bool ?? false @@ -131,9 +133,20 @@ internal class Include: Pattern { private var type: ReferenceType private var associatedRepository: Repository? + var languageRef: String? { + switch type { + case let .toForeignRepository(_, languageRef): + return languageRef + case let .toForeign(languageRef): + return languageRef + default: + return nil + } + } + // MARK: - Initializers - init(reference: String, in repository: Repository? = nil, parent: Pattern?, manager: BundleManager) { + init(reference: String, in repository: Repository? = nil, parent: Pattern?, manager: BundleManager /* not used but inherits from Pattern */) { self.associatedRepository = repository if reference.hasPrefix("#") { self.type = .toRepository(repositoryRef: String(reference[reference.index(after: reference.startIndex)...])) @@ -145,14 +158,11 @@ internal class Include: Pattern { if let hashRange = reference.range(of: "#") { let languagePart = String(reference[.. [Pattern] { guard let manager = bundleManager else { - assert(false) - return [] + fatalError("bundleManager not set") } var results: [Pattern] = [] for rawPattern in patterns { @@ -61,7 +66,7 @@ internal class ReferenceManager { for language in languages { let includes = language.referenceManager.includes for include in includes { - include.resolveExternalReference(from: language, in: otherLanguages, baseName: basename) + include.resolveExternalReference(in: otherLanguages, baseName: basename) } } } diff --git a/Sources/SyntaxKit/RegularExpression.swift b/Sources/SyntaxKit/RegularExpression.swift new file mode 100644 index 0000000..a8030d4 --- /dev/null +++ b/Sources/SyntaxKit/RegularExpression.swift @@ -0,0 +1,266 @@ +// +// RegularExpression.swift +// SyntaxKit +// +// Created by Zheng Wu on 2021/2/19. +// Copyright © 2021 Zheng Wu. All rights reserved. +// + +import Foundation + +internal extension String { + static let zeroCChar = "0".cString(using: .ascii)![0] + static let backslashCChar = "\\".cString(using: .ascii)![0] + static let dollarCChar = "$".cString(using: .ascii)![0] + + var hasBackReferencePlaceholder: Bool { + var escape = false + let buf = cString(using: .utf8)!.dropLast() + for ch in buf { + if escape && isdigit(Int32(ch)) != 0 { + return true + } + escape = !escape && ch == String.backslashCChar + } + return false + } + + // Converts into an escaped regex string + func addingRegexEscapedCharacters() -> String { + let special = "\\|([{}]).?*+^$".cString(using: .ascii) + let buf = cString(using: .utf8)!.dropLast() + var res = "" + for ch in buf { + if strchr(special, Int32(ch)) != nil { + res += "\\" + } + res += String(format: "%c", ch) + } + return res + } + + // Converts a back-referenced regex string to an ICU back-referenced regex string + func convertToICUBackReferencedRegex() -> String { + var escape = false + let buf = cString(using: .utf8)!.dropLast() + var res = "" + for ch in buf { + if escape && isdigit(Int32(ch)) != 0 { + res += String(format: "$%c", ch) + escape = false + continue + } + escape = !escape && ch == String.backslashCChar + if !escape { + res += String(format: "%c", ch) + } + } + return res + } + + // Converts an ICU back-referenced regex string to a back-referenced regex string + func convertToBackReferencedRegex() -> String { + var escape = false + var capture = false + let buf = cString(using: .utf8)!.dropLast() + var res = "" + for ch in buf { + if !escape && capture && isdigit(Int32(ch)) != 0 { + capture = false + res += String(format: "\\%c", ch) + continue + } + if escape { + escape = false + res += String(format: "%c", ch) + continue + } + if !escape && ch == String.dollarCChar { + capture = true + continue + } + if ch == String.backslashCChar { + escape = true + continue + } + res += String(format: "%c", ch) + } + return res + } + + // Expand a back-referenced regex string with original content and matches + func removingBackReferencePlaceholders(content: String, matches: NSTextCheckingResult) -> String { + var escape = false + let buf = cString(using: .utf8)!.dropLast() + var res = "" + for ch in buf { + if escape && isdigit(Int32(ch)) != 0 { + let i = Int(ch - String.zeroCChar) + if i <= matches.numberOfRanges - 1 { + let refRange = matches.range(at: i) + if refRange.location != NSNotFound { + res += (content as NSString).substring(with: refRange).addingRegexEscapedCharacters() + } + } + escape = false + continue + } + if escape { + res += "\\" + } + escape = !escape && ch == String.backslashCChar + if !escape { + res += String(format: "%c", ch) + } + } + return res + } +} + +internal class RegularExpression { + + // MARK: - Properties + + var pattern: String { return _pattern } + var options: RegularExpression.Options { return _options } + var isTemplate: Bool { return _isTemplate } + var expression: NSRegularExpression? { return _expression } + + // swiftlint:disable strict_fileprivate + fileprivate var _pattern: String + fileprivate var _options: RegularExpression.Options + fileprivate var _isTemplate: Bool + fileprivate var _expression: NSRegularExpression? + // swiftlint:enable strict_fileprivate + + // MARK: - Initializer + + init(pattern: String, options: RegularExpression.Options = []) throws { + self._pattern = pattern + self._options = options + self._isTemplate = pattern.hasBackReferencePlaceholder + if !self._isTemplate { + self._expression = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options(rawValue: options.rawValue)) + } + } + + func expandedRegularExpression(with referencedContent: String, matches: ResultSet?) -> RegularExpression { + return RegularExpression.expandRegularExpression(self, with: referencedContent, matches: matches) + } + + private static func expandRegularExpression(_ regex: RegularExpression, with referencedContent: String, matches: ResultSet?) -> RegularExpression { + guard regex.isTemplate, + let matches = matches, + let result = matches.results.first?.result else { + return regex + } + return ( + try? RegularExpression( + pattern: regex.pattern.removingBackReferencePlaceholders(content: referencedContent, matches: result), + options: regex.options + ) + ) ?? regex + } +} + +/* NSRegularExpression Implementation */ + +internal extension RegularExpression { + struct Options : OptionSet { + let rawValue: UInt + init(rawValue: UInt) { + self.rawValue = rawValue + } + static let caseInsensitive = Options(rawValue: NSRegularExpression.Options.caseInsensitive.rawValue) + static let allowCommentsAndWhitespace = Options(rawValue: NSRegularExpression.Options.allowCommentsAndWhitespace.rawValue) + static let ignoreMetacharacters = Options(rawValue: NSRegularExpression.Options.ignoreMetacharacters.rawValue) + static let dotMatchesLineSeparators = Options(rawValue: NSRegularExpression.Options.dotMatchesLineSeparators.rawValue) + static let anchorsMatchLines = Options(rawValue: NSRegularExpression.Options.anchorsMatchLines.rawValue) + static let useUnixLineSeparators = Options(rawValue: NSRegularExpression.Options.useUnixLineSeparators.rawValue) + static let useUnicodeWordBoundaries = Options(rawValue: NSRegularExpression.Options.useUnicodeWordBoundaries.rawValue) + } + + struct MatchingOptions : OptionSet { + let rawValue: UInt + init(rawValue: UInt) { + self.rawValue = rawValue + } + static let reportProgress = MatchingOptions(rawValue: NSRegularExpression.MatchingOptions.reportProgress.rawValue) + static let reportCompletion = MatchingOptions(rawValue: NSRegularExpression.MatchingOptions.reportCompletion.rawValue) + static let anchored = MatchingOptions(rawValue: NSRegularExpression.MatchingOptions.anchored.rawValue) + static let withTransparentBounds = MatchingOptions(rawValue: NSRegularExpression.MatchingOptions.withTransparentBounds.rawValue) + static let withoutAnchoringBounds = MatchingOptions(rawValue: NSRegularExpression.MatchingOptions.withoutAnchoringBounds.rawValue) + } + + struct MatchingFlags : OptionSet { + let rawValue: UInt + init(rawValue: UInt) { + self.rawValue = rawValue + } + static var progress = MatchingFlags(rawValue: NSRegularExpression.MatchingFlags.progress.rawValue) + static var completed = MatchingFlags(rawValue: NSRegularExpression.MatchingFlags.completed.rawValue) + static var hitEnd = MatchingFlags(rawValue: NSRegularExpression.MatchingFlags.hitEnd.rawValue) + static var requiredEnd = MatchingFlags(rawValue: NSRegularExpression.MatchingFlags.requiredEnd.rawValue) + static var internalError = MatchingFlags(rawValue: NSRegularExpression.MatchingFlags.internalError.rawValue) + } +} + +internal extension RegularExpression { + + var numberOfCaptureGroups: Int { + return _expression?.numberOfCaptureGroups ?? 0 + } + + static func escapedPattern(for string: String) -> String { + return NSRegularExpression.escapedPattern(for: string) + } + +} + +internal extension RegularExpression { + + func enumerateMatches(in string: String, options: RegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, RegularExpression.MatchingFlags, UnsafeMutablePointer) -> Void) { + _expression?.enumerateMatches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: options.rawValue), range: range) { (result, flags, stop) in + block(result, RegularExpression.MatchingFlags(rawValue: flags.rawValue), stop) + } + } + + func matches(in string: String, options: RegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult] { + return _expression?.matches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: options.rawValue), range: range) ?? [] + } + + func numberOfMatches(in string: String, options: RegularExpression.MatchingOptions = [], range: NSRange) -> Int { + return _expression?.numberOfMatches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: options.rawValue), range: range) ?? 0 + } + + func firstMatch(in string: String, options: RegularExpression.MatchingOptions = [], range: NSRange) -> NSTextCheckingResult? { + return _expression?.firstMatch(in: string, options: NSRegularExpression.MatchingOptions(rawValue: options.rawValue), range: range) + } + + func rangeOfFirstMatch(in string: String, options: RegularExpression.MatchingOptions = [], range: NSRange) -> NSRange { + return _expression?.rangeOfFirstMatch(in: string, options: NSRegularExpression.MatchingOptions(rawValue: options.rawValue), range: range) ?? NSRange(location: NSNotFound, length: 0) + } + +} + +/* NSRegularExpression's find-and-replace methods, not used. */ + +internal extension RegularExpression { + + func stringByReplacingMatches(in string: String, options: RegularExpression.MatchingOptions = [], range: NSRange, withTemplate templ: String) -> String { + fatalError("not supported") + } + + func replaceMatches(in string: NSMutableString, options: RegularExpression.MatchingOptions = [], range: NSRange, withTemplate templ: String) -> Int { + fatalError("not supported") + } + + func replacementString(for result: NSTextCheckingResult, in string: String, offset: Int, template templ: String) -> String { + fatalError("not supported") + } + + class func escapedTemplate(for string: String) -> String { + fatalError("not supported") + } + +} diff --git a/SyntaxKit/Repository.swift b/Sources/SyntaxKit/Repository.swift similarity index 98% rename from SyntaxKit/Repository.swift rename to Sources/SyntaxKit/Repository.swift index a2f72ff..4edd3ba 100644 --- a/SyntaxKit/Repository.swift +++ b/Sources/SyntaxKit/Repository.swift @@ -9,6 +9,8 @@ // Copyright © 2016 Alexander Hedges. All rights reserved. // +import Foundation + internal class Repository { // MARK: - Properties diff --git a/SyntaxKit/Result.swift b/Sources/SyntaxKit/Result.swift similarity index 76% rename from SyntaxKit/Result.swift rename to Sources/SyntaxKit/Result.swift index ba1442f..201d0a0 100644 --- a/SyntaxKit/Result.swift +++ b/Sources/SyntaxKit/Result.swift @@ -8,19 +8,23 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // +import Foundation + internal struct Result: Equatable { // MARK: - Properties let patternIdentifier: String var range: NSRange + let result: NSTextCheckingResult? let attribute: AnyObject? // MARK: - Initializers - init(identifier: String, range: NSRange, attribute: AnyObject? = nil) { + init(identifier: String, range: NSRange, result: NSTextCheckingResult? = nil, attribute: AnyObject? = nil) { self.patternIdentifier = identifier self.range = range + self.result = result self.attribute = attribute } } diff --git a/SyntaxKit/ResultSet.swift b/Sources/SyntaxKit/ResultSet.swift similarity index 98% rename from SyntaxKit/ResultSet.swift rename to Sources/SyntaxKit/ResultSet.swift index 0f379b3..222fbba 100644 --- a/SyntaxKit/ResultSet.swift +++ b/Sources/SyntaxKit/ResultSet.swift @@ -8,6 +8,8 @@ // Copyright © 2014-2015 Sam Soffes. All rights reserved. // +import Foundation + internal class ResultSet { // MARK: - Properties diff --git a/SyntaxKit/ScopedString.swift b/Sources/SyntaxKit/ScopedString.swift similarity index 99% rename from SyntaxKit/ScopedString.swift rename to Sources/SyntaxKit/ScopedString.swift index 5d6f612..018482e 100644 --- a/SyntaxKit/ScopedString.swift +++ b/Sources/SyntaxKit/ScopedString.swift @@ -257,7 +257,7 @@ internal struct ScopedString { for pattern in levels[level] { let range = pattern.range if range.length == 0 { - assert(false) + fatalError("empty range") } else if range.length == 1 { levelString = (levelString as NSString).replacingCharacters(in: range, with: "|") } else { diff --git a/Sources/SyntaxKit/SyntaxKit.swift b/Sources/SyntaxKit/SyntaxKit.swift new file mode 100644 index 0000000..10051c7 --- /dev/null +++ b/Sources/SyntaxKit/SyntaxKit.swift @@ -0,0 +1 @@ +// Placeholder diff --git a/Sources/SyntaxKit/Theme.swift b/Sources/SyntaxKit/Theme.swift new file mode 100644 index 0000000..0a83278 --- /dev/null +++ b/Sources/SyntaxKit/Theme.swift @@ -0,0 +1,198 @@ +// +// Theme.swift +// SyntaxKit +// +// Represents a TextMate theme file (.tmTheme). Currently only supports the +// foreground text color attribute on a local scope. +// +// Created by Sam Soffes on 10/11/14. +// Copyright © 2014-2015 Sam Soffes. All rights reserved. +// + +#if os(macOS) + import AppKit +#else + import UIKit +#endif + +public struct Theme { + + // MARK: - Public Types + + public typealias FontCallback = (_ fontName: String, _ fontSize: CGFloat, _ fontStyle: FontStyle) -> (Font?) + + // MARK: - Private Defaults + + private var fontName: String = Theme.defaultFontName + private var fontSize: CGFloat = Theme.defaultFontSize + private var fontCallback: FontCallback? + + // MARK: - Properties + + public let uuid: UUID + public let name: String + public let semanticClass: String? + public let attributes: [String: Attributes] + + public let gutterSettings: Attributes? + public var globalSettings: Attributes? { attributes[Theme.globalScope] } + + // MARK: - Global Convenience + + public var font: Font { + return (globalSettings?[.font] as? Font) ?? Theme.defaultFontWithStyle(.initial) + } + + public var foregroundColor: Color { + return (globalSettings?[.foregroundColor] as? Color) ?? Theme.defaultForegroundColor + } + + public var backgroundColor: Color { + return (globalSettings?[.backgroundColor] as? Color) ?? Theme.defaultBackgroundColor + } + + public var caretColor: Color? { + return globalSettings?[.caret] as? Color + } + + public var selectionColor: Color? { + return globalSettings?[.selection] as? Color + } + + public var invisiblesColor: Color? { + return globalSettings?[.invisibles] as? Color + } + + public var lineHighlightColor: Color? { + return globalSettings?[.lineHighlight] as? Color + } + + // MARK: - Static Convenience + private static func defaultFontWithStyle(_ style: FontStyle) -> Font { + if #available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) { + switch style { + case .bold: + return Font.monospacedSystemFont(ofSize: defaultFontSize, weight: .bold) + case .italic: + return Font.monospacedSystemFont(ofSize: defaultFontSize, weight: .regular).italic() + case .boldItalic: + return Font.monospacedSystemFont(ofSize: defaultFontSize, weight: .bold).italic() + default: + return Font.monospacedSystemFont(ofSize: defaultFontSize, weight: .regular) + } + } else { + // Fallback on earlier versions + #if os(macOS) + switch style { + case .bold: + return Font.userFixedPitchFont(ofSize: defaultFontSize)!.bold() + case .italic: + return Font.userFixedPitchFont(ofSize: defaultFontSize)!.italic() + case .boldItalic: + return Font.userFixedPitchFont(ofSize: defaultFontSize)!.boldItalic() + default: + return Font.userFixedPitchFont(ofSize: defaultFontSize)! + } + #else + switch style { + case .bold: + return Font(name: "Menlo-Bold", size: defaultFontSize)! + case .italic: + return Font(name: "Menlo-Italic", size: defaultFontSize)! + case .boldItalic: + return Font(name: "Menlo-BoldItalic", size: defaultFontSize)! + default: + return Font(name: "Menlo-Regular", size: defaultFontSize)! + } + #endif + } + } + private static var defaultFontName : String = defaultFontWithStyle(.initial).fontName + private static var defaultFontSize : CGFloat = 12.0 + private static var defaultBackgroundColor = Color.white + private static var defaultForegroundColor = Color.black + + private static let globalScope: String = "GLOBAL" + + // MARK: - Initializers + + init?(dictionary: [String: Any], fontCallback: FontCallback? = nil) { + guard let uuidString = dictionary["uuid"] as? String, + let uuid = UUID(uuidString: uuidString), + let name = dictionary["name"] as? String, + let rawSettings = dictionary["settings"] as? [[String: AnyObject]] + else { return nil } + + self.uuid = uuid + self.name = name + + if let semanticClass = dictionary["semanticClass"] as? String { + self.semanticClass = semanticClass + } else { + self.semanticClass = nil + } + + if let rawGutterSettings = dictionary["gutterSettings"] as? [String: AnyObject] { + var gutterSettings = Attributes() + for rawGutter in rawGutterSettings { + gutterSettings[NSAttributedString.Key(rawValue: rawGutter.key)] = rawGutter.value + } + self.gutterSettings = gutterSettings + } else { + self.gutterSettings = nil + } + + var attributes = [String: Attributes]() + for raw in rawSettings { + guard var setting = raw["settings"] as? [NSAttributedString.Key: Any] else { continue } + + if let value = setting.removeValue(forKey: .foreground) as? String { + setting[NSAttributedString.Key.foregroundColor] = Color(hex: value) + } + + if let value = setting.removeValue(forKey: .background) as? String { + setting[NSAttributedString.Key.backgroundColor] = Color(hex: value) + } + + if let value = setting.removeValue(forKey: .fontStyle) as? String, let fontStyle = FontStyle(rawValue: value) { + switch fontStyle { + case .initial, .plain, .bold, .italic, .boldItalic: + setting[NSAttributedString.Key.font] = fontCallback?(self.fontName, self.fontSize, fontStyle) ?? Theme.defaultFontWithStyle(fontStyle) + case .underline: // plain + underline + setting[NSAttributedString.Key.font] = fontCallback?(self.fontName, self.fontSize, .plain) ?? Theme.defaultFontWithStyle(.plain) + setting[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.single.rawValue + case .strikethrough: // plain + strikethrough + setting[NSAttributedString.Key.font] = fontCallback?(self.fontName, self.fontSize, .plain) ?? Theme.defaultFontWithStyle(.plain) + setting[NSAttributedString.Key.strikethroughStyle] = NSUnderlineStyle.single.rawValue + } + } else { + setting[NSAttributedString.Key.font] = fontCallback?(self.fontName, self.fontSize, .plain) ?? Theme.defaultFontWithStyle(.plain) + } + + if let patternIdentifiers = raw["scope"] as? String { + for patternIdentifier in patternIdentifiers.components(separatedBy: ",") { + let key = patternIdentifier.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + attributes[key] = setting + } + } else if !setting.isEmpty { + + if let fontCallback = fontCallback { + let fontName = (setting.removeValue(forKey: .fontName) as? String) ?? Theme.defaultFontName + let fontSize = (setting.removeValue(forKey: .fontSize) as? CGFloat) ?? Theme.defaultFontSize + if let font = fontCallback(fontName, fontSize, .initial) { + setting[NSAttributedString.Key.font] = font + self.fontName = font.fontName + self.fontSize = font.pointSize + } + } else { + setting[NSAttributedString.Key.font] = Theme.defaultFontWithStyle(.initial) + } + + attributes[Theme.globalScope] = setting + } + } + + self.attributes = attributes + self.fontCallback = fontCallback + } +} diff --git a/SyntaxKit.podspec b/SyntaxKit.podspec deleted file mode 100644 index 9dcc333..0000000 --- a/SyntaxKit.podspec +++ /dev/null @@ -1,19 +0,0 @@ -Pod::Spec.new do |spec| - spec.name = 'SyntaxKit' - spec.version = '1.0' - spec.authors = {'Sam Soffes' => 'sam@soff.es'} - spec.homepage = 'https://github.com/soffes/SyntaxKit' - spec.summary = 'TextMate-style syntax highlighting.' - spec.source = {:git => 'https://github.com/soffes/SyntaxKit.git', :tag => "v#{spec.version}"} - spec.license = { :type => 'MIT', :file => 'LICENSE' } - - spec.ios.deployment_target = '8.0' - spec.ios.frameworks = 'Foundation', 'UIKit' - - spec.osx.deployment_target = '10.9' - spec.osx.frameworks = 'Foundation', 'AppKit' - - spec.source_files = 'SyntaxKit/*.{h,m,swift}' - - spec.module_name = 'SyntaxKit' -end diff --git a/SyntaxKit.xcodeproj/project.pbxproj b/SyntaxKit.xcodeproj/project.pbxproj index 281827a..cbc6809 100644 --- a/SyntaxKit.xcodeproj/project.pbxproj +++ b/SyntaxKit.xcodeproj/project.pbxproj @@ -7,130 +7,121 @@ objects = { /* Begin PBXBuildFile section */ - 210299DE1B2E892E009C61EE /* LanguageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210299CF1B2E8924009C61EE /* LanguageTests.swift */; }; - 210299DF1B2E892E009C61EE /* AttributedParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210299D01B2E8924009C61EE /* AttributedParserTests.swift */; }; - 210BF26D1B37C04E008AA4F0 /* test.rb.txt in Resources */ = {isa = PBXBuildFile; fileRef = 210BF26C1B37C04E008AA4F0 /* test.rb.txt */; }; - 210BF26E1B37C04E008AA4F0 /* test.rb.txt in Resources */ = {isa = PBXBuildFile; fileRef = 210BF26C1B37C04E008AA4F0 /* test.rb.txt */; }; - 210BF2701B37C0A2008AA4F0 /* Ruby.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 210BF26F1B37C0A2008AA4F0 /* Ruby.tmLanguage */; }; - 210BF2711B37C0A2008AA4F0 /* Ruby.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 210BF26F1B37C0A2008AA4F0 /* Ruby.tmLanguage */; }; 211826E41D257A71003F2BF2 /* SyntaxKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 211826DA1D257A71003F2BF2 /* SyntaxKit.framework */; }; - 211826F11D257A7E003F2BF2 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898C1B2EC38B00F0D786 /* AttributedParser.swift */; }; - 211826F21D257A7E003F2BF2 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898D1B2EC38B00F0D786 /* Capture.swift */; }; - 211826F31D257A7E003F2BF2 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898E1B2EC38B00F0D786 /* CaptureCollection.swift */; }; - 211826F51D257A7E003F2BF2 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989911B2EC38B00F0D786 /* Parser.swift */; }; - 211826F61D257A7E003F2BF2 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989921B2EC38B00F0D786 /* Pattern.swift */; }; - 211826F71D257A7E003F2BF2 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989931B2EC38B00F0D786 /* Result.swift */; }; - 211826F81D257A7E003F2BF2 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989941B2EC38B00F0D786 /* ResultSet.swift */; }; - 211826F91D257A7E003F2BF2 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989961B2EC38B00F0D786 /* Theme.swift */; }; - 211826FA1D257A84003F2BF2 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989821B2EB18000F0D786 /* TestHelper.swift */; }; - 211826FB1D257A84003F2BF2 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989881B2EB8D400F0D786 /* ParserTests.swift */; }; - 211826FC1D257A84003F2BF2 /* AttributedParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210299D01B2E8924009C61EE /* AttributedParserTests.swift */; }; - 211826FD1D257A84003F2BF2 /* LanguageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210299CF1B2E8924009C61EE /* LanguageTests.swift */; }; - 211826FE1D257A84003F2BF2 /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898A1B2EBA2C00F0D786 /* ThemeTests.swift */; }; - 211826FF1D257A8A003F2BF2 /* Ruby.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 210BF26F1B37C0A2008AA4F0 /* Ruby.tmLanguage */; }; - 211827001D257A8A003F2BF2 /* test.rb.txt in Resources */ = {isa = PBXBuildFile; fileRef = 210BF26C1B37C04E008AA4F0 /* test.rb.txt */; }; - 211827011D257A8A003F2BF2 /* Tomorrow.tmTheme in Resources */ = {isa = PBXBuildFile; fileRef = 2119897E1B2EAF0900F0D786 /* Tomorrow.tmTheme */; }; - 211827021D257A8A003F2BF2 /* Yaml.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 2119897F1B2EAF0900F0D786 /* Yaml.tmLanguage */; }; - 211827031D257AA3003F2BF2 /* SyntaxKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 211989951B2EC38B00F0D786 /* SyntaxKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 211989801B2EAF0900F0D786 /* Tomorrow.tmTheme in Resources */ = {isa = PBXBuildFile; fileRef = 2119897E1B2EAF0900F0D786 /* Tomorrow.tmTheme */; }; - 211989811B2EAF0900F0D786 /* Yaml.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 2119897F1B2EAF0900F0D786 /* Yaml.tmLanguage */; }; - 211989841B2EB18600F0D786 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989821B2EB18000F0D786 /* TestHelper.swift */; }; - 211989891B2EB8D400F0D786 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989881B2EB8D400F0D786 /* ParserTests.swift */; }; - 2119898B1B2EBA2C00F0D786 /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898A1B2EBA2C00F0D786 /* ThemeTests.swift */; }; - 211989971B2EC38B00F0D786 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898C1B2EC38B00F0D786 /* AttributedParser.swift */; }; - 211989981B2EC38B00F0D786 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898D1B2EC38B00F0D786 /* Capture.swift */; }; - 211989991B2EC38B00F0D786 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898E1B2EC38B00F0D786 /* CaptureCollection.swift */; }; - 2119899C1B2EC38B00F0D786 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989911B2EC38B00F0D786 /* Parser.swift */; }; - 2119899D1B2EC38B00F0D786 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989921B2EC38B00F0D786 /* Pattern.swift */; }; - 2119899E1B2EC38B00F0D786 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989931B2EC38B00F0D786 /* Result.swift */; }; - 2119899F1B2EC38B00F0D786 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989941B2EC38B00F0D786 /* ResultSet.swift */; }; - 211989A01B2EC38B00F0D786 /* SyntaxKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 211989951B2EC38B00F0D786 /* SyntaxKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 211989A11B2EC38B00F0D786 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989961B2EC38B00F0D786 /* Theme.swift */; }; 211989B11B2EC3B600F0D786 /* SyntaxKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 211989A71B2EC3B600F0D786 /* SyntaxKit.framework */; }; - 211989BE1B2EC40000F0D786 /* SyntaxKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 211989951B2EC38B00F0D786 /* SyntaxKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 211989BF1B2EC40500F0D786 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898C1B2EC38B00F0D786 /* AttributedParser.swift */; }; - 211989C01B2EC40500F0D786 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898D1B2EC38B00F0D786 /* Capture.swift */; }; - 211989C11B2EC40500F0D786 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898E1B2EC38B00F0D786 /* CaptureCollection.swift */; }; - 211989C41B2EC40500F0D786 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989911B2EC38B00F0D786 /* Parser.swift */; }; - 211989C51B2EC40500F0D786 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989921B2EC38B00F0D786 /* Pattern.swift */; }; - 211989C61B2EC40500F0D786 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989931B2EC38B00F0D786 /* Result.swift */; }; - 211989C71B2EC40500F0D786 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989941B2EC38B00F0D786 /* ResultSet.swift */; }; - 211989C81B2EC40500F0D786 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989961B2EC38B00F0D786 /* Theme.swift */; }; - 211989C91B2EC40900F0D786 /* Tomorrow.tmTheme in Resources */ = {isa = PBXBuildFile; fileRef = 2119897E1B2EAF0900F0D786 /* Tomorrow.tmTheme */; }; - 211989CA1B2EC40900F0D786 /* Yaml.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 2119897F1B2EAF0900F0D786 /* Yaml.tmLanguage */; }; - 211989CB1B2EC40C00F0D786 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989821B2EB18000F0D786 /* TestHelper.swift */; }; - 211989CC1B2EC40C00F0D786 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989881B2EB8D400F0D786 /* ParserTests.swift */; }; - 211989CD1B2EC40C00F0D786 /* AttributedParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210299D01B2E8924009C61EE /* AttributedParserTests.swift */; }; - 211989CE1B2EC40C00F0D786 /* LanguageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210299CF1B2E8924009C61EE /* LanguageTests.swift */; }; - 211989CF1B2EC40C00F0D786 /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898A1B2EBA2C00F0D786 /* ThemeTests.swift */; }; 2122A6EA1B22B9320006409B /* SyntaxKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2122A6DE1B22B9320006409B /* SyntaxKit.framework */; }; - 2198CED21B36D5DE00BD463F /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898C1B2EC38B00F0D786 /* AttributedParser.swift */; }; - 2198CED31B36D5DE00BD463F /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898D1B2EC38B00F0D786 /* Capture.swift */; }; - 2198CED41B36D5DE00BD463F /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2119898E1B2EC38B00F0D786 /* CaptureCollection.swift */; }; - 2198CED71B36D5DE00BD463F /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989911B2EC38B00F0D786 /* Parser.swift */; }; - 2198CED81B36D5DE00BD463F /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989921B2EC38B00F0D786 /* Pattern.swift */; }; - 2198CED91B36D5DE00BD463F /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989931B2EC38B00F0D786 /* Result.swift */; }; - 2198CEDA1B36D5DE00BD463F /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989941B2EC38B00F0D786 /* ResultSet.swift */; }; - 2198CEDB1B36D5DE00BD463F /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211989961B2EC38B00F0D786 /* Theme.swift */; }; - 2198CEDC1B36D5E100BD463F /* SyntaxKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 211989951B2EC38B00F0D786 /* SyntaxKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8C08C3C71C36FD6D00D8548F /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C08C3C61C36FD6D00D8548F /* Color.swift */; }; - 8C10B6441CC38E5200740E00 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C10B6431CC38E5200740E00 /* AttributedParsingOperation.swift */; }; - 8C10B6451CC38E5200740E00 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C10B6431CC38E5200740E00 /* AttributedParsingOperation.swift */; }; - 8C10B6461CC38E5200740E00 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C10B6431CC38E5200740E00 /* AttributedParsingOperation.swift */; }; - 8C10B6471CC3937F00740E00 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C08C3C61C36FD6D00D8548F /* Color.swift */; }; - 8C10B6481CC3938100740E00 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C08C3C61C36FD6D00D8548F /* Color.swift */; }; - 8C10B6491CC393E700740E00 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9003321C5C0B0D00CBA5B0 /* ScopedString.swift */; }; - 8C2EB3571D4B50EE005ECE2B /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C08C3C61C36FD6D00D8548F /* Color.swift */; }; - 8C2EB3581D4B510F005ECE2B /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE64FE21C74B48D0007BA57 /* Language.swift */; }; - 8C2EB3591D4B5126005ECE2B /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C10B6431CC38E5200740E00 /* AttributedParsingOperation.swift */; }; - 8C2EB35A1D4B5126005ECE2B /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9003321C5C0B0D00CBA5B0 /* ScopedString.swift */; }; - 8C2EB35B1D4B5126005ECE2B /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CDD6F1A1C71594B0063915A /* BundleManager.swift */; }; - 8C2EB35C1D4B5126005ECE2B /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0E11C411F9700BF3E85 /* Repository.swift */; }; - 8C2EB35D1D4B5126005ECE2B /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0DD1C411C8600BF3E85 /* ReferenceManager.swift */; }; - 8C2EB35E1D4B524F005ECE2B /* SwiftBaselineHighlightingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE8D1161C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift */; }; - 8C2EB35F1D4B524F005ECE2B /* IncrementalParsingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C71A05C1C59587700041EC6 /* IncrementalParsingTests.swift */; }; - 8C2EB3601D4B524F005ECE2B /* ScopedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE6BE2D1C5D1BBA002676BD /* ScopedStringTests.swift */; }; - 8C2EB3611D4B525A005ECE2B /* Swift.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8CE8D1131C4EBF58005A86B3 /* Swift.tmLanguage */; }; - 8C2EB3621D4B525A005ECE2B /* swifttest.swift.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2FD221C4D877D008ECD6D /* swifttest.swift.txt */; }; - 8C2EB3631D4B525A005ECE2B /* Solarized.tmTheme in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2FD251C4D87D6008ECD6D /* Solarized.tmTheme */; }; - 8C4D09C01E1EAF750034974A /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C4D09BF1E1EAF750034974A /* PerformanceTests.swift */; }; - 8C4D09C11E1EAF750034974A /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C4D09BF1E1EAF750034974A /* PerformanceTests.swift */; }; - 8C4D09C21E1EAF750034974A /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C4D09BF1E1EAF750034974A /* PerformanceTests.swift */; }; - 8C4D09C41E1EB0670034974A /* Latex.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09C31E1EB0670034974A /* Latex.tmLanguage */; }; - 8C4D09C51E1EB0670034974A /* Latex.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09C31E1EB0670034974A /* Latex.tmLanguage */; }; - 8C4D09C61E1EB0670034974A /* Latex.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09C31E1EB0670034974A /* Latex.tmLanguage */; }; - 8C4D09C81E1EB07D0034974A /* Tex.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09C71E1EB07D0034974A /* Tex.tmLanguage */; }; - 8C4D09C91E1EB07D0034974A /* Tex.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09C71E1EB07D0034974A /* Tex.tmLanguage */; }; - 8C4D09CA1E1EB07D0034974A /* Tex.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09C71E1EB07D0034974A /* Tex.tmLanguage */; }; - 8C4D09CC1E1EB16C0034974A /* textest.tex.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09CB1E1EB16C0034974A /* textest.tex.txt */; }; - 8C4D09CD1E1EB16C0034974A /* textest.tex.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09CB1E1EB16C0034974A /* textest.tex.txt */; }; - 8C4D09CE1E1EB16C0034974A /* textest.tex.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8C4D09CB1E1EB16C0034974A /* textest.tex.txt */; }; - 8C71A05D1C59587700041EC6 /* IncrementalParsingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C71A05C1C59587700041EC6 /* IncrementalParsingTests.swift */; }; - 8C71A05E1C59587700041EC6 /* IncrementalParsingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C71A05C1C59587700041EC6 /* IncrementalParsingTests.swift */; }; - 8C9003331C5C0B0D00CBA5B0 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9003321C5C0B0D00CBA5B0 /* ScopedString.swift */; }; - 8C9003341C5C0B0D00CBA5B0 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9003321C5C0B0D00CBA5B0 /* ScopedString.swift */; }; - 8CAEC6BA1D3BB297001C57D3 /* swifttest.swift.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2FD221C4D877D008ECD6D /* swifttest.swift.txt */; }; - 8CB2FD261C4D87D6008ECD6D /* Solarized.tmTheme in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2FD251C4D87D6008ECD6D /* Solarized.tmTheme */; }; - 8CB2FD271C4D87D6008ECD6D /* Solarized.tmTheme in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2FD251C4D87D6008ECD6D /* Solarized.tmTheme */; }; - 8CB2FD281C4D891A008ECD6D /* swifttest.swift.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2FD221C4D877D008ECD6D /* swifttest.swift.txt */; }; - 8CDD6F1B1C71594B0063915A /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CDD6F1A1C71594B0063915A /* BundleManager.swift */; }; - 8CDD6F1C1C71594B0063915A /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CDD6F1A1C71594B0063915A /* BundleManager.swift */; }; - 8CDD6F1D1C71594B0063915A /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CDD6F1A1C71594B0063915A /* BundleManager.swift */; }; - 8CE64FE31C74B48D0007BA57 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE64FE21C74B48D0007BA57 /* Language.swift */; }; - 8CE64FE41C74B48D0007BA57 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE64FE21C74B48D0007BA57 /* Language.swift */; }; - 8CE64FE51C74B48D0007BA57 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE64FE21C74B48D0007BA57 /* Language.swift */; }; - 8CE6BE2E1C5D1BBA002676BD /* ScopedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE6BE2D1C5D1BBA002676BD /* ScopedStringTests.swift */; }; - 8CE6BE2F1C5D1BBA002676BD /* ScopedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE6BE2D1C5D1BBA002676BD /* ScopedStringTests.swift */; }; - 8CE8D1141C4EBF58005A86B3 /* Swift.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8CE8D1131C4EBF58005A86B3 /* Swift.tmLanguage */; }; - 8CE8D1151C4EBF58005A86B3 /* Swift.tmLanguage in Resources */ = {isa = PBXBuildFile; fileRef = 8CE8D1131C4EBF58005A86B3 /* Swift.tmLanguage */; }; - 8CE8D1171C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE8D1161C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift */; }; - 8CE8D1181C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE8D1161C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift */; }; - 8CEEC0DE1C411C8600BF3E85 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0DD1C411C8600BF3E85 /* ReferenceManager.swift */; }; - 8CEEC0DF1C411C8600BF3E85 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0DD1C411C8600BF3E85 /* ReferenceManager.swift */; }; - 8CEEC0E01C411C8600BF3E85 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0DD1C411C8600BF3E85 /* ReferenceManager.swift */; }; - 8CEEC0E21C411F9700BF3E85 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0E11C411F9700BF3E85 /* Repository.swift */; }; - 8CEEC0E31C411F9700BF3E85 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0E11C411F9700BF3E85 /* Repository.swift */; }; - 8CEEC0E41C411F9700BF3E85 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEEC0E11C411F9700BF3E85 /* Repository.swift */; }; + CCA6D13525F90D20000690C4 /* SyntaxKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12125F90D20000690C4 /* SyntaxKit.swift */; }; + CCA6D13625F90D20000690C4 /* SyntaxKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12125F90D20000690C4 /* SyntaxKit.swift */; }; + CCA6D13725F90D20000690C4 /* SyntaxKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12125F90D20000690C4 /* SyntaxKit.swift */; }; + CCA6D13825F90D20000690C4 /* SyntaxKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12125F90D20000690C4 /* SyntaxKit.swift */; }; + CCA6D13925F90D20000690C4 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12225F90D20000690C4 /* ScopedString.swift */; }; + CCA6D13A25F90D20000690C4 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12225F90D20000690C4 /* ScopedString.swift */; }; + CCA6D13B25F90D20000690C4 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12225F90D20000690C4 /* ScopedString.swift */; }; + CCA6D13C25F90D20000690C4 /* ScopedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12225F90D20000690C4 /* ScopedString.swift */; }; + CCA6D13D25F90D20000690C4 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12325F90D20000690C4 /* CaptureCollection.swift */; }; + CCA6D13E25F90D20000690C4 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12325F90D20000690C4 /* CaptureCollection.swift */; }; + CCA6D13F25F90D20000690C4 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12325F90D20000690C4 /* CaptureCollection.swift */; }; + CCA6D14025F90D20000690C4 /* CaptureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12325F90D20000690C4 /* CaptureCollection.swift */; }; + CCA6D14125F90D20000690C4 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12425F90D20000690C4 /* Language.swift */; }; + CCA6D14225F90D20000690C4 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12425F90D20000690C4 /* Language.swift */; }; + CCA6D14325F90D20000690C4 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12425F90D20000690C4 /* Language.swift */; }; + CCA6D14425F90D20000690C4 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12425F90D20000690C4 /* Language.swift */; }; + CCA6D14525F90D20000690C4 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12525F90D20000690C4 /* AttributedParsingOperation.swift */; }; + CCA6D14625F90D20000690C4 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12525F90D20000690C4 /* AttributedParsingOperation.swift */; }; + CCA6D14725F90D20000690C4 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12525F90D20000690C4 /* AttributedParsingOperation.swift */; }; + CCA6D14825F90D20000690C4 /* AttributedParsingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12525F90D20000690C4 /* AttributedParsingOperation.swift */; }; + CCA6D14925F90D20000690C4 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12625F90D20000690C4 /* Capture.swift */; }; + CCA6D14A25F90D20000690C4 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12625F90D20000690C4 /* Capture.swift */; }; + CCA6D14B25F90D20000690C4 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12625F90D20000690C4 /* Capture.swift */; }; + CCA6D14C25F90D20000690C4 /* Capture.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12625F90D20000690C4 /* Capture.swift */; }; + CCA6D14D25F90D21000690C4 /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12725F90D20000690C4 /* BundleManager.swift */; }; + CCA6D14E25F90D21000690C4 /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12725F90D20000690C4 /* BundleManager.swift */; }; + CCA6D14F25F90D21000690C4 /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12725F90D20000690C4 /* BundleManager.swift */; }; + CCA6D15025F90D21000690C4 /* BundleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12725F90D20000690C4 /* BundleManager.swift */; }; + CCA6D15125F90D21000690C4 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12825F90D20000690C4 /* Attributes.swift */; }; + CCA6D15225F90D21000690C4 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12825F90D20000690C4 /* Attributes.swift */; }; + CCA6D15325F90D21000690C4 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12825F90D20000690C4 /* Attributes.swift */; }; + CCA6D15425F90D21000690C4 /* Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12825F90D20000690C4 /* Attributes.swift */; }; + CCA6D15525F90D21000690C4 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12925F90D20000690C4 /* Result.swift */; }; + CCA6D15625F90D21000690C4 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12925F90D20000690C4 /* Result.swift */; }; + CCA6D15725F90D21000690C4 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12925F90D20000690C4 /* Result.swift */; }; + CCA6D15825F90D21000690C4 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12925F90D20000690C4 /* Result.swift */; }; + CCA6D15925F90D21000690C4 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12A25F90D20000690C4 /* ReferenceManager.swift */; }; + CCA6D15A25F90D21000690C4 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12A25F90D20000690C4 /* ReferenceManager.swift */; }; + CCA6D15B25F90D21000690C4 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12A25F90D20000690C4 /* ReferenceManager.swift */; }; + CCA6D15C25F90D21000690C4 /* ReferenceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12A25F90D20000690C4 /* ReferenceManager.swift */; }; + CCA6D16125F90D21000690C4 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12C25F90D20000690C4 /* Repository.swift */; }; + CCA6D16225F90D21000690C4 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12C25F90D20000690C4 /* Repository.swift */; }; + CCA6D16325F90D21000690C4 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12C25F90D20000690C4 /* Repository.swift */; }; + CCA6D16425F90D21000690C4 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12C25F90D20000690C4 /* Repository.swift */; }; + CCA6D16525F90D21000690C4 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12D25F90D20000690C4 /* Parser.swift */; }; + CCA6D16625F90D21000690C4 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12D25F90D20000690C4 /* Parser.swift */; }; + CCA6D16725F90D21000690C4 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12D25F90D20000690C4 /* Parser.swift */; }; + CCA6D16825F90D21000690C4 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12D25F90D20000690C4 /* Parser.swift */; }; + CCA6D16925F90D21000690C4 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12E25F90D20000690C4 /* AttributedParser.swift */; }; + CCA6D16A25F90D21000690C4 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12E25F90D20000690C4 /* AttributedParser.swift */; }; + CCA6D16B25F90D21000690C4 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12E25F90D20000690C4 /* AttributedParser.swift */; }; + CCA6D16C25F90D21000690C4 /* AttributedParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12E25F90D20000690C4 /* AttributedParser.swift */; }; + CCA6D16D25F90D21000690C4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12F25F90D20000690C4 /* Theme.swift */; }; + CCA6D16E25F90D21000690C4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12F25F90D20000690C4 /* Theme.swift */; }; + CCA6D16F25F90D21000690C4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12F25F90D20000690C4 /* Theme.swift */; }; + CCA6D17025F90D21000690C4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D12F25F90D20000690C4 /* Theme.swift */; }; + CCA6D17125F90D21000690C4 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13025F90D20000690C4 /* Font.swift */; }; + CCA6D17225F90D21000690C4 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13025F90D20000690C4 /* Font.swift */; }; + CCA6D17325F90D21000690C4 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13025F90D20000690C4 /* Font.swift */; }; + CCA6D17425F90D21000690C4 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13025F90D20000690C4 /* Font.swift */; }; + CCA6D17525F90D21000690C4 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13125F90D20000690C4 /* Pattern.swift */; }; + CCA6D17625F90D21000690C4 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13125F90D20000690C4 /* Pattern.swift */; }; + CCA6D17725F90D21000690C4 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13125F90D20000690C4 /* Pattern.swift */; }; + CCA6D17825F90D21000690C4 /* Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13125F90D20000690C4 /* Pattern.swift */; }; + CCA6D17925F90D21000690C4 /* RegularExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13225F90D20000690C4 /* RegularExpression.swift */; }; + CCA6D17A25F90D21000690C4 /* RegularExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13225F90D20000690C4 /* RegularExpression.swift */; }; + CCA6D17B25F90D21000690C4 /* RegularExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13225F90D20000690C4 /* RegularExpression.swift */; }; + CCA6D17C25F90D21000690C4 /* RegularExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13225F90D20000690C4 /* RegularExpression.swift */; }; + CCA6D17D25F90D21000690C4 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13325F90D20000690C4 /* ResultSet.swift */; }; + CCA6D17E25F90D21000690C4 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13325F90D20000690C4 /* ResultSet.swift */; }; + CCA6D17F25F90D21000690C4 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13325F90D20000690C4 /* ResultSet.swift */; }; + CCA6D18025F90D21000690C4 /* ResultSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13325F90D20000690C4 /* ResultSet.swift */; }; + CCA6D18125F90D21000690C4 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13425F90D20000690C4 /* Color.swift */; }; + CCA6D18225F90D21000690C4 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13425F90D20000690C4 /* Color.swift */; }; + CCA6D18325F90D21000690C4 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13425F90D20000690C4 /* Color.swift */; }; + CCA6D18425F90D21000690C4 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D13425F90D20000690C4 /* Color.swift */; }; + CCA6D19C25F90D2E000690C4 /* AttributedParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18C25F90D2E000690C4 /* AttributedParserTests.swift */; }; + CCA6D19D25F90D2E000690C4 /* AttributedParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18C25F90D2E000690C4 /* AttributedParserTests.swift */; }; + CCA6D19E25F90D2E000690C4 /* AttributedParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18C25F90D2E000690C4 /* AttributedParserTests.swift */; }; + CCA6D19F25F90D2E000690C4 /* ScopedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18D25F90D2E000690C4 /* ScopedStringTests.swift */; }; + CCA6D1A025F90D2E000690C4 /* ScopedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18D25F90D2E000690C4 /* ScopedStringTests.swift */; }; + CCA6D1A125F90D2E000690C4 /* ScopedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18D25F90D2E000690C4 /* ScopedStringTests.swift */; }; + CCA6D1A225F90D2E000690C4 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18E25F90D2E000690C4 /* XCTestManifests.swift */; }; + CCA6D1A325F90D2E000690C4 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18E25F90D2E000690C4 /* XCTestManifests.swift */; }; + CCA6D1A425F90D2E000690C4 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18E25F90D2E000690C4 /* XCTestManifests.swift */; }; + CCA6D1A525F90D2E000690C4 /* LanguageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18F25F90D2E000690C4 /* LanguageTests.swift */; }; + CCA6D1A625F90D2E000690C4 /* LanguageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18F25F90D2E000690C4 /* LanguageTests.swift */; }; + CCA6D1A725F90D2E000690C4 /* LanguageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D18F25F90D2E000690C4 /* LanguageTests.swift */; }; + CCA6D1A825F90D2E000690C4 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19025F90D2E000690C4 /* TestHelper.swift */; }; + CCA6D1A925F90D2E000690C4 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19025F90D2E000690C4 /* TestHelper.swift */; }; + CCA6D1AA25F90D2E000690C4 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19025F90D2E000690C4 /* TestHelper.swift */; }; + CCA6D1AB25F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19125F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift */; }; + CCA6D1AC25F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19125F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift */; }; + CCA6D1AD25F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19125F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift */; }; + CCA6D1AE25F90D2E000690C4 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19225F90D2E000690C4 /* PerformanceTests.swift */; }; + CCA6D1AF25F90D2E000690C4 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19225F90D2E000690C4 /* PerformanceTests.swift */; }; + CCA6D1B025F90D2E000690C4 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19225F90D2E000690C4 /* PerformanceTests.swift */; }; + CCA6D1B125F90D2E000690C4 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19325F90D2E000690C4 /* ParserTests.swift */; }; + CCA6D1B225F90D2E000690C4 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19325F90D2E000690C4 /* ParserTests.swift */; }; + CCA6D1B325F90D2E000690C4 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19325F90D2E000690C4 /* ParserTests.swift */; }; + CCA6D1B425F90D2E000690C4 /* TestSyntaxKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CCA6D19525F90D2E000690C4 /* TestSyntaxKit.bundle */; }; + CCA6D1B525F90D2E000690C4 /* TestSyntaxKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CCA6D19525F90D2E000690C4 /* TestSyntaxKit.bundle */; }; + CCA6D1B625F90D2E000690C4 /* TestSyntaxKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CCA6D19525F90D2E000690C4 /* TestSyntaxKit.bundle */; }; + CCA6D1B725F90D2E000690C4 /* IncrementalParsingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19625F90D2E000690C4 /* IncrementalParsingTests.swift */; }; + CCA6D1B825F90D2E000690C4 /* IncrementalParsingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19625F90D2E000690C4 /* IncrementalParsingTests.swift */; }; + CCA6D1B925F90D2E000690C4 /* IncrementalParsingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19625F90D2E000690C4 /* IncrementalParsingTests.swift */; }; + CCA6D1BA25F90D2E000690C4 /* BackReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19725F90D2E000690C4 /* BackReferenceTests.swift */; }; + CCA6D1BB25F90D2E000690C4 /* BackReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19725F90D2E000690C4 /* BackReferenceTests.swift */; }; + CCA6D1BC25F90D2E000690C4 /* BackReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19725F90D2E000690C4 /* BackReferenceTests.swift */; }; + CCA6D1BD25F90D2E000690C4 /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19825F90D2E000690C4 /* ThemeTests.swift */; }; + CCA6D1BE25F90D2E000690C4 /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19825F90D2E000690C4 /* ThemeTests.swift */; }; + CCA6D1BF25F90D2E000690C4 /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA6D19825F90D2E000690C4 /* ThemeTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -191,50 +182,45 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 210299C21B2E8924009C61EE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 210299CF1B2E8924009C61EE /* LanguageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageTests.swift; sourceTree = ""; }; - 210299D01B2E8924009C61EE /* AttributedParserTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedParserTests.swift; sourceTree = ""; }; - 210299E41B2E8AFC009C61EE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 210BF26C1B37C04E008AA4F0 /* test.rb.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = test.rb.txt; sourceTree = ""; }; - 210BF26F1B37C0A2008AA4F0 /* Ruby.tmLanguage */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Ruby.tmLanguage; sourceTree = ""; }; 211826DA1D257A71003F2BF2 /* SyntaxKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SyntaxKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 211826E31D257A71003F2BF2 /* SyntaxKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SyntaxKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 2119897E1B2EAF0900F0D786 /* Tomorrow.tmTheme */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Tomorrow.tmTheme; sourceTree = ""; }; - 2119897F1B2EAF0900F0D786 /* Yaml.tmLanguage */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Yaml.tmLanguage; sourceTree = ""; }; - 211989821B2EB18000F0D786 /* TestHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelper.swift; sourceTree = ""; }; - 211989881B2EB8D400F0D786 /* ParserTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParserTests.swift; sourceTree = ""; }; - 2119898A1B2EBA2C00F0D786 /* ThemeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeTests.swift; sourceTree = ""; }; - 2119898C1B2EC38B00F0D786 /* AttributedParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedParser.swift; sourceTree = ""; }; - 2119898D1B2EC38B00F0D786 /* Capture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Capture.swift; sourceTree = ""; }; - 2119898E1B2EC38B00F0D786 /* CaptureCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaptureCollection.swift; sourceTree = ""; }; - 211989911B2EC38B00F0D786 /* Parser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Parser.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 211989921B2EC38B00F0D786 /* Pattern.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Pattern.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 211989931B2EC38B00F0D786 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; - 211989941B2EC38B00F0D786 /* ResultSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResultSet.swift; sourceTree = ""; }; - 211989951B2EC38B00F0D786 /* SyntaxKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SyntaxKit.h; sourceTree = ""; }; - 211989961B2EC38B00F0D786 /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; 211989A71B2EC3B600F0D786 /* SyntaxKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SyntaxKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 211989B01B2EC3B600F0D786 /* SyntaxKitTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SyntaxKitTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 2122A6DE1B22B9320006409B /* SyntaxKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SyntaxKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2122A6E91B22B9320006409B /* SyntaxKitTests-macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SyntaxKitTests-macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 2198CECA1B36D5D700BD463F /* SyntaxKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SyntaxKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8C08C3C61C36FD6D00D8548F /* Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Color.swift; path = ../Color.swift; sourceTree = ""; }; - 8C10B6431CC38E5200740E00 /* AttributedParsingOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AttributedParsingOperation.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 8C4D09BF1E1EAF750034974A /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = ""; }; - 8C4D09C31E1EB0670034974A /* Latex.tmLanguage */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Latex.tmLanguage; sourceTree = ""; }; - 8C4D09C71E1EB07D0034974A /* Tex.tmLanguage */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Tex.tmLanguage; sourceTree = ""; }; - 8C4D09CB1E1EB16C0034974A /* textest.tex.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = textest.tex.txt; sourceTree = ""; }; - 8C71A05C1C59587700041EC6 /* IncrementalParsingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncrementalParsingTests.swift; sourceTree = ""; }; - 8C9003321C5C0B0D00CBA5B0 /* ScopedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScopedString.swift; sourceTree = ""; }; - 8CB2FD221C4D877D008ECD6D /* swifttest.swift.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = swifttest.swift.txt; sourceTree = ""; }; - 8CB2FD251C4D87D6008ECD6D /* Solarized.tmTheme */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Solarized.tmTheme; sourceTree = ""; }; - 8CDD6F1A1C71594B0063915A /* BundleManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BundleManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 8CE64FE21C74B48D0007BA57 /* Language.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Language.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 8CE6BE2D1C5D1BBA002676BD /* ScopedStringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScopedStringTests.swift; sourceTree = ""; }; - 8CE8D1131C4EBF58005A86B3 /* Swift.tmLanguage */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Swift.tmLanguage; sourceTree = ""; }; - 8CE8D1161C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftBaselineHighlightingTests.swift; sourceTree = ""; }; - 8CEEC0DD1C411C8600BF3E85 /* ReferenceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ReferenceManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - 8CEEC0E11C411F9700BF3E85 /* Repository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Repository.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CCA6D12125F90D20000690C4 /* SyntaxKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SyntaxKit.swift; sourceTree = ""; }; + CCA6D12225F90D20000690C4 /* ScopedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScopedString.swift; sourceTree = ""; }; + CCA6D12325F90D20000690C4 /* CaptureCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaptureCollection.swift; sourceTree = ""; }; + CCA6D12425F90D20000690C4 /* Language.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Language.swift; sourceTree = ""; }; + CCA6D12525F90D20000690C4 /* AttributedParsingOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedParsingOperation.swift; sourceTree = ""; }; + CCA6D12625F90D20000690C4 /* Capture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Capture.swift; sourceTree = ""; }; + CCA6D12725F90D20000690C4 /* BundleManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BundleManager.swift; sourceTree = ""; }; + CCA6D12825F90D20000690C4 /* Attributes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Attributes.swift; sourceTree = ""; }; + CCA6D12925F90D20000690C4 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; + CCA6D12A25F90D20000690C4 /* ReferenceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReferenceManager.swift; sourceTree = ""; }; + CCA6D12C25F90D20000690C4 /* Repository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Repository.swift; sourceTree = ""; }; + CCA6D12D25F90D20000690C4 /* Parser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Parser.swift; sourceTree = ""; }; + CCA6D12E25F90D20000690C4 /* AttributedParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedParser.swift; sourceTree = ""; }; + CCA6D12F25F90D20000690C4 /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; + CCA6D13025F90D20000690C4 /* Font.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Font.swift; sourceTree = ""; }; + CCA6D13125F90D20000690C4 /* Pattern.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Pattern.swift; sourceTree = ""; }; + CCA6D13225F90D20000690C4 /* RegularExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegularExpression.swift; sourceTree = ""; }; + CCA6D13325F90D20000690C4 /* ResultSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResultSet.swift; sourceTree = ""; }; + CCA6D13425F90D20000690C4 /* Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = ""; }; + CCA6D18C25F90D2E000690C4 /* AttributedParserTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedParserTests.swift; sourceTree = ""; }; + CCA6D18D25F90D2E000690C4 /* ScopedStringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScopedStringTests.swift; sourceTree = ""; }; + CCA6D18E25F90D2E000690C4 /* XCTestManifests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = ""; }; + CCA6D18F25F90D2E000690C4 /* LanguageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageTests.swift; sourceTree = ""; }; + CCA6D19025F90D2E000690C4 /* TestHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelper.swift; sourceTree = ""; }; + CCA6D19125F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftBaselineHighlightingTests.swift; sourceTree = ""; }; + CCA6D19225F90D2E000690C4 /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = ""; }; + CCA6D19325F90D2E000690C4 /* ParserTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParserTests.swift; sourceTree = ""; }; + CCA6D19525F90D2E000690C4 /* TestSyntaxKit.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = TestSyntaxKit.bundle; sourceTree = ""; }; + CCA6D19625F90D2E000690C4 /* IncrementalParsingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncrementalParsingTests.swift; sourceTree = ""; }; + CCA6D19725F90D2E000690C4 /* BackReferenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackReferenceTests.swift; sourceTree = ""; }; + CCA6D19825F90D2E000690C4 /* ThemeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeTests.swift; sourceTree = ""; }; + CCA6D1E125F90DBD000690C4 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -293,102 +279,105 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 210299C11B2E8924009C61EE /* Resources */ = { + 2122A6D41B22B9320006409B = { isa = PBXGroup; children = ( - 8C08C3C61C36FD6D00D8548F /* Color.swift */, - 210299C21B2E8924009C61EE /* Info.plist */, + CCA6D1E025F90DBD000690C4 /* Resources */, + CCA6D11F25F90D20000690C4 /* Sources */, + CCA6D18925F90D2E000690C4 /* Tests */, + 2122A6DF1B22B9320006409B /* Products */, ); - path = Resources; sourceTree = ""; }; - 210299CD1B2E8924009C61EE /* Tests */ = { + 2122A6DF1B22B9320006409B /* Products */ = { isa = PBXGroup; children = ( - 210299E11B2E8AFC009C61EE /* Resources */, - 211989821B2EB18000F0D786 /* TestHelper.swift */, - 211989881B2EB8D400F0D786 /* ParserTests.swift */, - 210299D01B2E8924009C61EE /* AttributedParserTests.swift */, - 8C4D09BF1E1EAF750034974A /* PerformanceTests.swift */, - 8CE8D1161C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift */, - 8C71A05C1C59587700041EC6 /* IncrementalParsingTests.swift */, - 8CE6BE2D1C5D1BBA002676BD /* ScopedStringTests.swift */, - 210299CF1B2E8924009C61EE /* LanguageTests.swift */, - 2119898A1B2EBA2C00F0D786 /* ThemeTests.swift */, + 2122A6DE1B22B9320006409B /* SyntaxKit.framework */, + 2122A6E91B22B9320006409B /* SyntaxKitTests-macOS.xctest */, + 211989A71B2EC3B600F0D786 /* SyntaxKit.framework */, + 211989B01B2EC3B600F0D786 /* SyntaxKitTests-iOS.xctest */, + 2198CECA1B36D5D700BD463F /* SyntaxKit.framework */, + 211826DA1D257A71003F2BF2 /* SyntaxKit.framework */, + 211826E31D257A71003F2BF2 /* SyntaxKitTests.xctest */, ); - path = Tests; + name = Products; sourceTree = ""; }; - 210299E11B2E8AFC009C61EE /* Resources */ = { + CCA6D11F25F90D20000690C4 /* Sources */ = { isa = PBXGroup; children = ( - 210299E21B2E8AFC009C61EE /* Fixtures */, - 210299E41B2E8AFC009C61EE /* Info.plist */, + CCA6D12025F90D20000690C4 /* SyntaxKit */, ); - path = Resources; + path = Sources; sourceTree = ""; }; - 210299E21B2E8AFC009C61EE /* Fixtures */ = { + CCA6D12025F90D20000690C4 /* SyntaxKit */ = { isa = PBXGroup; children = ( - 210BF26F1B37C0A2008AA4F0 /* Ruby.tmLanguage */, - 8CE8D1131C4EBF58005A86B3 /* Swift.tmLanguage */, - 8C4D09C31E1EB0670034974A /* Latex.tmLanguage */, - 8C4D09C71E1EB07D0034974A /* Tex.tmLanguage */, - 8CB2FD221C4D877D008ECD6D /* swifttest.swift.txt */, - 8C4D09CB1E1EB16C0034974A /* textest.tex.txt */, - 210BF26C1B37C04E008AA4F0 /* test.rb.txt */, - 8CB2FD251C4D87D6008ECD6D /* Solarized.tmTheme */, - 2119897E1B2EAF0900F0D786 /* Tomorrow.tmTheme */, - 2119897F1B2EAF0900F0D786 /* Yaml.tmLanguage */, + CCA6D12E25F90D20000690C4 /* AttributedParser.swift */, + CCA6D12525F90D20000690C4 /* AttributedParsingOperation.swift */, + CCA6D12825F90D20000690C4 /* Attributes.swift */, + CCA6D12725F90D20000690C4 /* BundleManager.swift */, + CCA6D12625F90D20000690C4 /* Capture.swift */, + CCA6D12325F90D20000690C4 /* CaptureCollection.swift */, + CCA6D13425F90D20000690C4 /* Color.swift */, + CCA6D13025F90D20000690C4 /* Font.swift */, + CCA6D12425F90D20000690C4 /* Language.swift */, + CCA6D12D25F90D20000690C4 /* Parser.swift */, + CCA6D13125F90D20000690C4 /* Pattern.swift */, + CCA6D12A25F90D20000690C4 /* ReferenceManager.swift */, + CCA6D13225F90D20000690C4 /* RegularExpression.swift */, + CCA6D12C25F90D20000690C4 /* Repository.swift */, + CCA6D12925F90D20000690C4 /* Result.swift */, + CCA6D13325F90D20000690C4 /* ResultSet.swift */, + CCA6D12225F90D20000690C4 /* ScopedString.swift */, + CCA6D12125F90D20000690C4 /* SyntaxKit.swift */, + CCA6D12F25F90D20000690C4 /* Theme.swift */, ); - path = Fixtures; + path = SyntaxKit; sourceTree = ""; }; - 2122A6D41B22B9320006409B = { + CCA6D18925F90D2E000690C4 /* Tests */ = { isa = PBXGroup; children = ( - 2122A6E01B22B9320006409B /* SyntaxKit */, - 2122A6DF1B22B9320006409B /* Products */, + CCA6D18B25F90D2E000690C4 /* SyntaxKitTests */, ); + path = Tests; sourceTree = ""; }; - 2122A6DF1B22B9320006409B /* Products */ = { + CCA6D18B25F90D2E000690C4 /* SyntaxKitTests */ = { isa = PBXGroup; children = ( - 2122A6DE1B22B9320006409B /* SyntaxKit.framework */, - 2122A6E91B22B9320006409B /* SyntaxKitTests-macOS.xctest */, - 211989A71B2EC3B600F0D786 /* SyntaxKit.framework */, - 211989B01B2EC3B600F0D786 /* SyntaxKitTests-iOS.xctest */, - 2198CECA1B36D5D700BD463F /* SyntaxKit.framework */, - 211826DA1D257A71003F2BF2 /* SyntaxKit.framework */, - 211826E31D257A71003F2BF2 /* SyntaxKitTests.xctest */, + CCA6D19425F90D2E000690C4 /* Fixtures */, + CCA6D18C25F90D2E000690C4 /* AttributedParserTests.swift */, + CCA6D19725F90D2E000690C4 /* BackReferenceTests.swift */, + CCA6D19625F90D2E000690C4 /* IncrementalParsingTests.swift */, + CCA6D18F25F90D2E000690C4 /* LanguageTests.swift */, + CCA6D19325F90D2E000690C4 /* ParserTests.swift */, + CCA6D19225F90D2E000690C4 /* PerformanceTests.swift */, + CCA6D18D25F90D2E000690C4 /* ScopedStringTests.swift */, + CCA6D19125F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift */, + CCA6D19025F90D2E000690C4 /* TestHelper.swift */, + CCA6D19825F90D2E000690C4 /* ThemeTests.swift */, + CCA6D18E25F90D2E000690C4 /* XCTestManifests.swift */, + ); + path = SyntaxKitTests; + sourceTree = ""; + }; + CCA6D19425F90D2E000690C4 /* Fixtures */ = { + isa = PBXGroup; + children = ( + CCA6D19525F90D2E000690C4 /* TestSyntaxKit.bundle */, ); - name = Products; + path = Fixtures; sourceTree = ""; }; - 2122A6E01B22B9320006409B /* SyntaxKit */ = { + CCA6D1E025F90DBD000690C4 /* Resources */ = { isa = PBXGroup; children = ( - 211989951B2EC38B00F0D786 /* SyntaxKit.h */, - 8C10B6431CC38E5200740E00 /* AttributedParsingOperation.swift */, - 2119898C1B2EC38B00F0D786 /* AttributedParser.swift */, - 211989911B2EC38B00F0D786 /* Parser.swift */, - 8C9003321C5C0B0D00CBA5B0 /* ScopedString.swift */, - 211989941B2EC38B00F0D786 /* ResultSet.swift */, - 211989931B2EC38B00F0D786 /* Result.swift */, - 8CDD6F1A1C71594B0063915A /* BundleManager.swift */, - 211989961B2EC38B00F0D786 /* Theme.swift */, - 8CE64FE21C74B48D0007BA57 /* Language.swift */, - 8CEEC0E11C411F9700BF3E85 /* Repository.swift */, - 8CEEC0DD1C411C8600BF3E85 /* ReferenceManager.swift */, - 211989921B2EC38B00F0D786 /* Pattern.swift */, - 2119898E1B2EC38B00F0D786 /* CaptureCollection.swift */, - 2119898D1B2EC38B00F0D786 /* Capture.swift */, - 210299C11B2E8924009C61EE /* Resources */, - 210299CD1B2E8924009C61EE /* Tests */, + CCA6D1E125F90DBD000690C4 /* Info.plist */, ); - path = SyntaxKit; + path = Resources; sourceTree = ""; }; /* End PBXGroup section */ @@ -398,7 +387,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 211827031D257AA3003F2BF2 /* SyntaxKit.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -406,7 +394,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 211989BE1B2EC40000F0D786 /* SyntaxKit.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -414,7 +401,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 211989A01B2EC38B00F0D786 /* SyntaxKit.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -422,7 +408,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2198CEDC1B36D5E100BD463F /* SyntaxKit.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -566,7 +551,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 1030; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Sam Soffes"; TargetAttributes = { 211826D91D257A71003F2BF2 = { @@ -585,9 +570,11 @@ }; 2122A6DD1B22B9320006409B = { CreatedOnToolsVersion = 6.3.2; + LastSwiftMigration = 1240; }; 2122A6E81B22B9320006409B = { CreatedOnToolsVersion = 6.3.2; + LastSwiftMigration = 1240; }; 2198CEC91B36D5D700BD463F = { CreatedOnToolsVersion = 7.0; @@ -607,12 +594,12 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 2122A6DD1B22B9320006409B /* SyntaxKit-macOS */, - 2122A6E81B22B9320006409B /* SyntaxKitTests-macOS */, 211989A61B2EC3B600F0D786 /* SyntaxKit-iOS */, - 211989AF1B2EC3B600F0D786 /* SyntaxKitTests-iOS */, - 2198CEC91B36D5D700BD463F /* SyntaxKit-watchOS */, + 2122A6DD1B22B9320006409B /* SyntaxKit-macOS */, 211826D91D257A71003F2BF2 /* SyntaxKit-tvOS */, + 2198CEC91B36D5D700BD463F /* SyntaxKit-watchOS */, + 211989AF1B2EC3B600F0D786 /* SyntaxKitTests-iOS */, + 2122A6E81B22B9320006409B /* SyntaxKitTests-macOS */, 211826E21D257A71003F2BF2 /* SyntaxKitTests-tvOS */, ); }; @@ -630,16 +617,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8C2EB3611D4B525A005ECE2B /* Swift.tmLanguage in Resources */, - 8C2EB3621D4B525A005ECE2B /* swifttest.swift.txt in Resources */, - 8C2EB3631D4B525A005ECE2B /* Solarized.tmTheme in Resources */, - 8C4D09CA1E1EB07D0034974A /* Tex.tmLanguage in Resources */, - 211826FF1D257A8A003F2BF2 /* Ruby.tmLanguage in Resources */, - 8C4D09C61E1EB0670034974A /* Latex.tmLanguage in Resources */, - 211827021D257A8A003F2BF2 /* Yaml.tmLanguage in Resources */, - 211827001D257A8A003F2BF2 /* test.rb.txt in Resources */, - 211827011D257A8A003F2BF2 /* Tomorrow.tmTheme in Resources */, - 8C4D09CE1E1EB16C0034974A /* textest.tex.txt in Resources */, + CCA6D1B625F90D2E000690C4 /* TestSyntaxKit.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -654,16 +632,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8CE8D1151C4EBF58005A86B3 /* Swift.tmLanguage in Resources */, - 210BF2711B37C0A2008AA4F0 /* Ruby.tmLanguage in Resources */, - 211989CA1B2EC40900F0D786 /* Yaml.tmLanguage in Resources */, - 8C4D09C91E1EB07D0034974A /* Tex.tmLanguage in Resources */, - 211989C91B2EC40900F0D786 /* Tomorrow.tmTheme in Resources */, - 8C4D09C51E1EB0670034974A /* Latex.tmLanguage in Resources */, - 8CB2FD271C4D87D6008ECD6D /* Solarized.tmTheme in Resources */, - 210BF26E1B37C04E008AA4F0 /* test.rb.txt in Resources */, - 8CB2FD281C4D891A008ECD6D /* swifttest.swift.txt in Resources */, - 8C4D09CD1E1EB16C0034974A /* textest.tex.txt in Resources */, + CCA6D1B525F90D2E000690C4 /* TestSyntaxKit.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -678,16 +647,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8CE8D1141C4EBF58005A86B3 /* Swift.tmLanguage in Resources */, - 210BF2701B37C0A2008AA4F0 /* Ruby.tmLanguage in Resources */, - 211989811B2EAF0900F0D786 /* Yaml.tmLanguage in Resources */, - 8C4D09C81E1EB07D0034974A /* Tex.tmLanguage in Resources */, - 211989801B2EAF0900F0D786 /* Tomorrow.tmTheme in Resources */, - 8C4D09C41E1EB0670034974A /* Latex.tmLanguage in Resources */, - 8CB2FD261C4D87D6008ECD6D /* Solarized.tmTheme in Resources */, - 210BF26D1B37C04E008AA4F0 /* test.rb.txt in Resources */, - 8CAEC6BA1D3BB297001C57D3 /* swifttest.swift.txt in Resources */, - 8C4D09CC1E1EB16C0034974A /* textest.tex.txt in Resources */, + CCA6D1B425F90D2E000690C4 /* TestSyntaxKit.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -721,21 +681,25 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8C2EB3591D4B5126005ECE2B /* AttributedParsingOperation.swift in Sources */, - 8C2EB35A1D4B5126005ECE2B /* ScopedString.swift in Sources */, - 8C2EB35B1D4B5126005ECE2B /* BundleManager.swift in Sources */, - 8C2EB35C1D4B5126005ECE2B /* Repository.swift in Sources */, - 8C2EB35D1D4B5126005ECE2B /* ReferenceManager.swift in Sources */, - 8C2EB3581D4B510F005ECE2B /* Language.swift in Sources */, - 8C2EB3571D4B50EE005ECE2B /* Color.swift in Sources */, - 211826F91D257A7E003F2BF2 /* Theme.swift in Sources */, - 211826F61D257A7E003F2BF2 /* Pattern.swift in Sources */, - 211826F21D257A7E003F2BF2 /* Capture.swift in Sources */, - 211826F51D257A7E003F2BF2 /* Parser.swift in Sources */, - 211826F71D257A7E003F2BF2 /* Result.swift in Sources */, - 211826F81D257A7E003F2BF2 /* ResultSet.swift in Sources */, - 211826F31D257A7E003F2BF2 /* CaptureCollection.swift in Sources */, - 211826F11D257A7E003F2BF2 /* AttributedParser.swift in Sources */, + CCA6D15825F90D21000690C4 /* Result.swift in Sources */, + CCA6D16C25F90D21000690C4 /* AttributedParser.swift in Sources */, + CCA6D17425F90D21000690C4 /* Font.swift in Sources */, + CCA6D15C25F90D21000690C4 /* ReferenceManager.swift in Sources */, + CCA6D15025F90D21000690C4 /* BundleManager.swift in Sources */, + CCA6D18025F90D21000690C4 /* ResultSet.swift in Sources */, + CCA6D14C25F90D20000690C4 /* Capture.swift in Sources */, + CCA6D17825F90D21000690C4 /* Pattern.swift in Sources */, + CCA6D15425F90D21000690C4 /* Attributes.swift in Sources */, + CCA6D16425F90D21000690C4 /* Repository.swift in Sources */, + CCA6D13C25F90D20000690C4 /* ScopedString.swift in Sources */, + CCA6D18425F90D21000690C4 /* Color.swift in Sources */, + CCA6D14825F90D20000690C4 /* AttributedParsingOperation.swift in Sources */, + CCA6D16825F90D21000690C4 /* Parser.swift in Sources */, + CCA6D14425F90D20000690C4 /* Language.swift in Sources */, + CCA6D17C25F90D21000690C4 /* RegularExpression.swift in Sources */, + CCA6D14025F90D20000690C4 /* CaptureCollection.swift in Sources */, + CCA6D13825F90D20000690C4 /* SyntaxKit.swift in Sources */, + CCA6D17025F90D21000690C4 /* Theme.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -743,15 +707,17 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8C2EB35E1D4B524F005ECE2B /* SwiftBaselineHighlightingTests.swift in Sources */, - 8C2EB35F1D4B524F005ECE2B /* IncrementalParsingTests.swift in Sources */, - 8C2EB3601D4B524F005ECE2B /* ScopedStringTests.swift in Sources */, - 211826FD1D257A84003F2BF2 /* LanguageTests.swift in Sources */, - 211826FA1D257A84003F2BF2 /* TestHelper.swift in Sources */, - 211826FC1D257A84003F2BF2 /* AttributedParserTests.swift in Sources */, - 211826FB1D257A84003F2BF2 /* ParserTests.swift in Sources */, - 211826FE1D257A84003F2BF2 /* ThemeTests.swift in Sources */, - 8C4D09C21E1EAF750034974A /* PerformanceTests.swift in Sources */, + CCA6D1BC25F90D2E000690C4 /* BackReferenceTests.swift in Sources */, + CCA6D19E25F90D2E000690C4 /* AttributedParserTests.swift in Sources */, + CCA6D1B925F90D2E000690C4 /* IncrementalParsingTests.swift in Sources */, + CCA6D1A725F90D2E000690C4 /* LanguageTests.swift in Sources */, + CCA6D1A425F90D2E000690C4 /* XCTestManifests.swift in Sources */, + CCA6D1BF25F90D2E000690C4 /* ThemeTests.swift in Sources */, + CCA6D1AA25F90D2E000690C4 /* TestHelper.swift in Sources */, + CCA6D1A125F90D2E000690C4 /* ScopedStringTests.swift in Sources */, + CCA6D1AD25F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift in Sources */, + CCA6D1B025F90D2E000690C4 /* PerformanceTests.swift in Sources */, + CCA6D1B325F90D2E000690C4 /* ParserTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -759,21 +725,25 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 211989C01B2EC40500F0D786 /* Capture.swift in Sources */, - 211989C41B2EC40500F0D786 /* Parser.swift in Sources */, - 8C08C3C71C36FD6D00D8548F /* Color.swift in Sources */, - 8C9003341C5C0B0D00CBA5B0 /* ScopedString.swift in Sources */, - 211989C11B2EC40500F0D786 /* CaptureCollection.swift in Sources */, - 8CEEC0DF1C411C8600BF3E85 /* ReferenceManager.swift in Sources */, - 211989C71B2EC40500F0D786 /* ResultSet.swift in Sources */, - 8C10B6451CC38E5200740E00 /* AttributedParsingOperation.swift in Sources */, - 8CDD6F1C1C71594B0063915A /* BundleManager.swift in Sources */, - 211989C51B2EC40500F0D786 /* Pattern.swift in Sources */, - 211989C81B2EC40500F0D786 /* Theme.swift in Sources */, - 211989C61B2EC40500F0D786 /* Result.swift in Sources */, - 8CE64FE41C74B48D0007BA57 /* Language.swift in Sources */, - 211989BF1B2EC40500F0D786 /* AttributedParser.swift in Sources */, - 8CEEC0E31C411F9700BF3E85 /* Repository.swift in Sources */, + CCA6D15625F90D21000690C4 /* Result.swift in Sources */, + CCA6D16A25F90D21000690C4 /* AttributedParser.swift in Sources */, + CCA6D17225F90D21000690C4 /* Font.swift in Sources */, + CCA6D15A25F90D21000690C4 /* ReferenceManager.swift in Sources */, + CCA6D14E25F90D21000690C4 /* BundleManager.swift in Sources */, + CCA6D17E25F90D21000690C4 /* ResultSet.swift in Sources */, + CCA6D14A25F90D20000690C4 /* Capture.swift in Sources */, + CCA6D17625F90D21000690C4 /* Pattern.swift in Sources */, + CCA6D15225F90D21000690C4 /* Attributes.swift in Sources */, + CCA6D16225F90D21000690C4 /* Repository.swift in Sources */, + CCA6D13A25F90D20000690C4 /* ScopedString.swift in Sources */, + CCA6D18225F90D21000690C4 /* Color.swift in Sources */, + CCA6D14625F90D20000690C4 /* AttributedParsingOperation.swift in Sources */, + CCA6D16625F90D21000690C4 /* Parser.swift in Sources */, + CCA6D14225F90D20000690C4 /* Language.swift in Sources */, + CCA6D17A25F90D21000690C4 /* RegularExpression.swift in Sources */, + CCA6D13E25F90D20000690C4 /* CaptureCollection.swift in Sources */, + CCA6D13625F90D20000690C4 /* SyntaxKit.swift in Sources */, + CCA6D16E25F90D21000690C4 /* Theme.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -781,15 +751,17 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 211989CF1B2EC40C00F0D786 /* ThemeTests.swift in Sources */, - 211989CC1B2EC40C00F0D786 /* ParserTests.swift in Sources */, - 8CE6BE2F1C5D1BBA002676BD /* ScopedStringTests.swift in Sources */, - 8C71A05E1C59587700041EC6 /* IncrementalParsingTests.swift in Sources */, - 211989CE1B2EC40C00F0D786 /* LanguageTests.swift in Sources */, - 211989CB1B2EC40C00F0D786 /* TestHelper.swift in Sources */, - 8CE8D1181C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift in Sources */, - 211989CD1B2EC40C00F0D786 /* AttributedParserTests.swift in Sources */, - 8C4D09C11E1EAF750034974A /* PerformanceTests.swift in Sources */, + CCA6D1BB25F90D2E000690C4 /* BackReferenceTests.swift in Sources */, + CCA6D19D25F90D2E000690C4 /* AttributedParserTests.swift in Sources */, + CCA6D1B825F90D2E000690C4 /* IncrementalParsingTests.swift in Sources */, + CCA6D1A625F90D2E000690C4 /* LanguageTests.swift in Sources */, + CCA6D1A325F90D2E000690C4 /* XCTestManifests.swift in Sources */, + CCA6D1BE25F90D2E000690C4 /* ThemeTests.swift in Sources */, + CCA6D1A925F90D2E000690C4 /* TestHelper.swift in Sources */, + CCA6D1A025F90D2E000690C4 /* ScopedStringTests.swift in Sources */, + CCA6D1AC25F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift in Sources */, + CCA6D1AF25F90D2E000690C4 /* PerformanceTests.swift in Sources */, + CCA6D1B225F90D2E000690C4 /* ParserTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -797,21 +769,25 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 211989981B2EC38B00F0D786 /* Capture.swift in Sources */, - 8CDD6F1B1C71594B0063915A /* BundleManager.swift in Sources */, - 2119899C1B2EC38B00F0D786 /* Parser.swift in Sources */, - 211989991B2EC38B00F0D786 /* CaptureCollection.swift in Sources */, - 8C10B6441CC38E5200740E00 /* AttributedParsingOperation.swift in Sources */, - 8CEEC0DE1C411C8600BF3E85 /* ReferenceManager.swift in Sources */, - 8CEEC0E21C411F9700BF3E85 /* Repository.swift in Sources */, - 2119899F1B2EC38B00F0D786 /* ResultSet.swift in Sources */, - 8C10B6471CC3937F00740E00 /* Color.swift in Sources */, - 2119899D1B2EC38B00F0D786 /* Pattern.swift in Sources */, - 211989A11B2EC38B00F0D786 /* Theme.swift in Sources */, - 2119899E1B2EC38B00F0D786 /* Result.swift in Sources */, - 8C9003331C5C0B0D00CBA5B0 /* ScopedString.swift in Sources */, - 211989971B2EC38B00F0D786 /* AttributedParser.swift in Sources */, - 8CE64FE31C74B48D0007BA57 /* Language.swift in Sources */, + CCA6D15525F90D21000690C4 /* Result.swift in Sources */, + CCA6D16925F90D21000690C4 /* AttributedParser.swift in Sources */, + CCA6D17125F90D21000690C4 /* Font.swift in Sources */, + CCA6D15925F90D21000690C4 /* ReferenceManager.swift in Sources */, + CCA6D14D25F90D21000690C4 /* BundleManager.swift in Sources */, + CCA6D17D25F90D21000690C4 /* ResultSet.swift in Sources */, + CCA6D14925F90D20000690C4 /* Capture.swift in Sources */, + CCA6D17525F90D21000690C4 /* Pattern.swift in Sources */, + CCA6D15125F90D21000690C4 /* Attributes.swift in Sources */, + CCA6D16125F90D21000690C4 /* Repository.swift in Sources */, + CCA6D13925F90D20000690C4 /* ScopedString.swift in Sources */, + CCA6D18125F90D21000690C4 /* Color.swift in Sources */, + CCA6D14525F90D20000690C4 /* AttributedParsingOperation.swift in Sources */, + CCA6D16525F90D21000690C4 /* Parser.swift in Sources */, + CCA6D14125F90D20000690C4 /* Language.swift in Sources */, + CCA6D17925F90D21000690C4 /* RegularExpression.swift in Sources */, + CCA6D13D25F90D20000690C4 /* CaptureCollection.swift in Sources */, + CCA6D13525F90D20000690C4 /* SyntaxKit.swift in Sources */, + CCA6D16D25F90D21000690C4 /* Theme.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -819,15 +795,17 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 211989841B2EB18600F0D786 /* TestHelper.swift in Sources */, - 8C71A05D1C59587700041EC6 /* IncrementalParsingTests.swift in Sources */, - 211989891B2EB8D400F0D786 /* ParserTests.swift in Sources */, - 210299DF1B2E892E009C61EE /* AttributedParserTests.swift in Sources */, - 8CE6BE2E1C5D1BBA002676BD /* ScopedStringTests.swift in Sources */, - 210299DE1B2E892E009C61EE /* LanguageTests.swift in Sources */, - 8CE8D1171C4EBF8F005A86B3 /* SwiftBaselineHighlightingTests.swift in Sources */, - 2119898B1B2EBA2C00F0D786 /* ThemeTests.swift in Sources */, - 8C4D09C01E1EAF750034974A /* PerformanceTests.swift in Sources */, + CCA6D1BA25F90D2E000690C4 /* BackReferenceTests.swift in Sources */, + CCA6D19C25F90D2E000690C4 /* AttributedParserTests.swift in Sources */, + CCA6D1B725F90D2E000690C4 /* IncrementalParsingTests.swift in Sources */, + CCA6D1A525F90D2E000690C4 /* LanguageTests.swift in Sources */, + CCA6D1A225F90D2E000690C4 /* XCTestManifests.swift in Sources */, + CCA6D1BD25F90D2E000690C4 /* ThemeTests.swift in Sources */, + CCA6D1A825F90D2E000690C4 /* TestHelper.swift in Sources */, + CCA6D19F25F90D2E000690C4 /* ScopedStringTests.swift in Sources */, + CCA6D1AB25F90D2E000690C4 /* SwiftBaselineHighlightingTests.swift in Sources */, + CCA6D1AE25F90D2E000690C4 /* PerformanceTests.swift in Sources */, + CCA6D1B125F90D2E000690C4 /* ParserTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -835,21 +813,25 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2198CED31B36D5DE00BD463F /* Capture.swift in Sources */, - 8CDD6F1D1C71594B0063915A /* BundleManager.swift in Sources */, - 2198CED71B36D5DE00BD463F /* Parser.swift in Sources */, - 8CE64FE51C74B48D0007BA57 /* Language.swift in Sources */, - 2198CED41B36D5DE00BD463F /* CaptureCollection.swift in Sources */, - 8CEEC0E01C411C8600BF3E85 /* ReferenceManager.swift in Sources */, - 8C10B6461CC38E5200740E00 /* AttributedParsingOperation.swift in Sources */, - 8CEEC0E41C411F9700BF3E85 /* Repository.swift in Sources */, - 2198CEDA1B36D5DE00BD463F /* ResultSet.swift in Sources */, - 8C10B6481CC3938100740E00 /* Color.swift in Sources */, - 8C10B6491CC393E700740E00 /* ScopedString.swift in Sources */, - 2198CED81B36D5DE00BD463F /* Pattern.swift in Sources */, - 2198CEDB1B36D5DE00BD463F /* Theme.swift in Sources */, - 2198CED91B36D5DE00BD463F /* Result.swift in Sources */, - 2198CED21B36D5DE00BD463F /* AttributedParser.swift in Sources */, + CCA6D15725F90D21000690C4 /* Result.swift in Sources */, + CCA6D16B25F90D21000690C4 /* AttributedParser.swift in Sources */, + CCA6D17325F90D21000690C4 /* Font.swift in Sources */, + CCA6D15B25F90D21000690C4 /* ReferenceManager.swift in Sources */, + CCA6D14F25F90D21000690C4 /* BundleManager.swift in Sources */, + CCA6D17F25F90D21000690C4 /* ResultSet.swift in Sources */, + CCA6D14B25F90D20000690C4 /* Capture.swift in Sources */, + CCA6D17725F90D21000690C4 /* Pattern.swift in Sources */, + CCA6D15325F90D21000690C4 /* Attributes.swift in Sources */, + CCA6D16325F90D21000690C4 /* Repository.swift in Sources */, + CCA6D13B25F90D20000690C4 /* ScopedString.swift in Sources */, + CCA6D18325F90D21000690C4 /* Color.swift in Sources */, + CCA6D14725F90D20000690C4 /* AttributedParsingOperation.swift in Sources */, + CCA6D16725F90D21000690C4 /* Parser.swift in Sources */, + CCA6D14325F90D20000690C4 /* Language.swift in Sources */, + CCA6D17B25F90D21000690C4 /* RegularExpression.swift in Sources */, + CCA6D13F25F90D20000690C4 /* CaptureCollection.swift in Sources */, + CCA6D13725F90D20000690C4 /* SyntaxKit.swift in Sources */, + CCA6D16F25F90D21000690C4 /* Theme.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -878,22 +860,19 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit.tvos; PRODUCT_NAME = SyntaxKit; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -901,22 +880,19 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit.tvos; PRODUCT_NAME = SyntaxKit; SDKROOT = appletvos; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -924,32 +900,28 @@ 211826EF1D257A71003F2BF2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; CLANG_ANALYZER_NONNULL = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = SyntaxKit/Tests/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit.tvos.tests; PRODUCT_NAME = SyntaxKitTests; SDKROOT = appletvos; - SWIFT_VERSION = 4.0; - TVOS_DEPLOYMENT_TARGET = 9.2; }; name = Debug; }; 211826F01D257A71003F2BF2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; CLANG_ANALYZER_NONNULL = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = SyntaxKit/Tests/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit.tvos.tests; PRODUCT_NAME = SyntaxKitTests; SDKROOT = appletvos; - SWIFT_VERSION = 4.0; - TVOS_DEPLOYMENT_TARGET = 9.2; VALIDATE_PRODUCT = YES; }; name = Release; @@ -957,22 +929,18 @@ 211989B91B2EC3B600F0D786 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit; PRODUCT_NAME = SyntaxKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -980,22 +948,18 @@ 211989BA1B2EC3B600F0D786 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit; PRODUCT_NAME = SyntaxKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -1004,32 +968,28 @@ 211989BC1B2EC3B600F0D786 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = SyntaxKit/Tests/Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.samsoffes.syntaxkit-ios.tests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; }; name = Debug; }; 211989BD1B2EC3B600F0D786 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = SyntaxKit/Tests/Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.samsoffes.syntaxkit-ios.tests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -1058,6 +1018,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1084,15 +1045,17 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 13.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Debug; }; @@ -1120,6 +1083,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1140,14 +1104,16 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 13.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; @@ -1155,23 +1121,19 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit; PRODUCT_NAME = SyntaxKit; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1179,28 +1141,26 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit; PRODUCT_NAME = SyntaxKit; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; }; name = Release; }; 2122A6F81B22B9320006409B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; COMBINE_HIDPI_IMAGES = YES; ENABLE_BITCODE = NO; @@ -1212,17 +1172,16 @@ "DEBUG=1", "$(inherited)", ); - INFOPLIST_FILE = SyntaxKit/Tests/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.samsoffes.syntaxkit-macos.tests"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; }; name = Debug; }; 2122A6F91B22B9320006409B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; COMBINE_HIDPI_IMAGES = YES; ENABLE_BITCODE = NO; @@ -1230,58 +1189,48 @@ "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", ); - INFOPLIST_FILE = SyntaxKit/Tests/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.samsoffes.syntaxkit-macos.tests"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; }; name = Release; }; 2198CECF1B36D5D700BD463F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit.watchos; PRODUCT_NAME = SyntaxKit; SDKROOT = watchos; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; }; 2198CED01B36D5D700BD463F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/SyntaxKit/Resources/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.samsoffes.syntaxkit.watchos; PRODUCT_NAME = SyntaxKit; SDKROOT = watchos; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 4; VALIDATE_PRODUCT = YES; - WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; diff --git a/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKit-iOS.xcscheme b/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKit-iOS.xcscheme index 36486f5..d78a5a9 100644 --- a/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKit-iOS.xcscheme +++ b/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKit-iOS.xcscheme @@ -1,6 +1,6 @@ + + + + @@ -39,17 +48,6 @@ - - - - - - - - + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + + + + @@ -40,17 +49,6 @@ - - - - - - - - + + + + @@ -39,17 +48,6 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKitTests-macOS.xcscheme b/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKitTests-macOS.xcscheme new file mode 100644 index 0000000..1146e39 --- /dev/null +++ b/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKitTests-macOS.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKitTests-tvOS.xcscheme b/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKitTests-tvOS.xcscheme new file mode 100644 index 0000000..36a5ca1 --- /dev/null +++ b/SyntaxKit.xcodeproj/xcshareddata/xcschemes/SyntaxKitTests-tvOS.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SyntaxKit/SyntaxKit.h b/SyntaxKit/SyntaxKit.h deleted file mode 100644 index 72a44a4..0000000 --- a/SyntaxKit/SyntaxKit.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// SyntaxKit.h -// SyntaxKit -// -// Created by Sam Soffes on 9/18/14. -// Copyright © 2014-2015 Sam Soffes. All rights reserved. -// - -@import Foundation; - -//! Project version number for SyntaxKit. -FOUNDATION_EXPORT double SyntaxKitVersionNumber; - -//! Project version string for SyntaxKit. -FOUNDATION_EXPORT const unsigned char SyntaxKitVersionString[]; diff --git a/SyntaxKit/Tests/Resources/Info.plist b/SyntaxKit/Tests/Resources/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/SyntaxKit/Tests/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/SyntaxKit/Theme.swift b/SyntaxKit/Theme.swift deleted file mode 100644 index 1a76903..0000000 --- a/SyntaxKit/Theme.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// Theme.swift -// SyntaxKit -// -// Represents a TextMate theme file (.tmTheme). Currently only supports the -// foreground text color attribute on a local scope. -// -// Created by Sam Soffes on 10/11/14. -// Copyright © 2014-2015 Sam Soffes. All rights reserved. -// - -#if os(OSX) - import AppKit -#else - import UIKit -#endif - -public typealias Attributes = [NSAttributedString.Key: Any] - -public struct Theme { - - // MARK: - Properties - - public let uuid: UUID - public let name: String - public let attributes: [String: Attributes] - - public var backgroundColor: Color { - return attributes[Language.globalScope]?[NSAttributedString.Key.backgroundColor] as? Color ?? Color.white - } - - public var foregroundColor: Color { - return attributes[Language.globalScope]?[NSAttributedString.Key.foregroundColor] as? Color ?? Color.black - } - - // MARK: - Initializers - - init?(dictionary: [String: Any]) { - guard let uuidString = dictionary["uuid"] as? String, - let uuid = UUID(uuidString: uuidString), - let name = dictionary["name"] as? String, - let rawSettings = dictionary["settings"] as? [[String: AnyObject]] - else { return nil } - - self.uuid = uuid - self.name = name - - var attributes = [String: Attributes]() - for raw in rawSettings { - guard var setting = raw["settings"] as? [NSAttributedString.Key: Any] else { continue } - - if let value = setting.removeValue(forKey: NSAttributedString.Key(rawValue: "foreground")) as? String { - setting[NSAttributedString.Key.foregroundColor] = Color(hex: value) - } - - if let value = setting.removeValue(forKey: NSAttributedString.Key(rawValue: "background")) as? String { - setting[NSAttributedString.Key.backgroundColor] = Color(hex: value) - } - - if let patternIdentifiers = raw["scope"] as? String { - for patternIdentifier in patternIdentifiers.components(separatedBy: ",") { - let key = patternIdentifier.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) - attributes[key] = setting - } - } else if !setting.isEmpty { - attributes[Language.globalScope] = setting - } - } - self.attributes = attributes - } -} diff --git a/SyntaxKit/Tests/AttributedParserTests.swift b/Tests/SyntaxKitTests/AttributedParserTests.swift similarity index 62% rename from SyntaxKit/Tests/AttributedParserTests.swift rename to Tests/SyntaxKitTests/AttributedParserTests.swift index e4b2754..ee562d9 100644 --- a/SyntaxKit/Tests/AttributedParserTests.swift +++ b/Tests/SyntaxKitTests/AttributedParserTests.swift @@ -32,9 +32,9 @@ internal class AttributedParserTests: XCTestCase { func testParsing() { let string = parser?.attributedString(for: "title: Hello World\ncount: 42\n") - XCTAssertEqual(["color": "blue"], string?.attributes(at: 0, effectiveRange: nil) as NSDictionary?) - XCTAssertEqual(["color": "red"], string?.attributes(at: 7, effectiveRange: nil) as NSDictionary?) - XCTAssertEqual(["color": "blue"], string?.attributes(at: 19, effectiveRange: nil) as NSDictionary?) - XCTAssertEqual(["color": "purple"], string?.attributes(at: 25, effectiveRange: nil) as NSDictionary?) + XCTAssertEqual("blue", string?.attributes(at: 0, effectiveRange: nil)[NSAttributedString.Key("color")] as? String) + XCTAssertEqual("red", string?.attributes(at: 7, effectiveRange: nil)[NSAttributedString.Key("color")] as? String) + XCTAssertEqual("blue", string?.attributes(at: 19, effectiveRange: nil)[NSAttributedString.Key("color")] as? String) + XCTAssertEqual("purple", string?.attributes(at: 25, effectiveRange: nil)[NSAttributedString.Key("color")] as? String) } } diff --git a/Tests/SyntaxKitTests/BackReferenceTests.swift b/Tests/SyntaxKitTests/BackReferenceTests.swift new file mode 100644 index 0000000..b1725a5 --- /dev/null +++ b/Tests/SyntaxKitTests/BackReferenceTests.swift @@ -0,0 +1,98 @@ +// +// BackReferenceTests.swift +// SyntaxKit +// +// Created by Zheng Wu on 2021/2/19. +// Copyright © 2021 Sam Soffes. All rights reserved. +// + +@testable import SyntaxKit +import XCTest + +internal class BackReferenceTests: XCTestCase { + + // MARK: - Properties + + private var parser: Parser? + private let manager: BundleManager = getBundleManager() + + // MARK: - Tests + + override func setUp() { + super.setUp() + if let lua = manager.language(withIdentifier: "source.lua") { + parser = Parser(language: lua) + } else { + XCTFail("Should be able to load lua language fixture") + } + } + + func testBackReferenceHelpers() throws { + XCTAssertFalse("title: \"Hello World\"\n".hasBackReferencePlaceholder) + XCTAssertFalse("title: Hello World\ncomments: 24\nposts: \"12\"zz\n".hasBackReferencePlaceholder) + XCTAssert("title: Hello World\ncomments: 24\nposts: \"12\\3\"zz\n".hasBackReferencePlaceholder) + + let testString1 = "title: Hello World\ncomments: \\24\nposts: \"12\\3\"zz\n" + let testString2 = "title: Hello World\ncomments: $24\nposts: \"12$3\"zz\n" + XCTAssertEqual(testString1.convertToICUBackReferencedRegex(), testString2) + XCTAssertEqual(testString2.convertToBackReferencedRegex(), testString1) + + XCTAssertEqual("(?<=\\.) {2,}(?=[A-Z])".addingRegexEscapedCharacters(), "\\(\\?<=\\\\\\.\\) \\{2,\\}\\(\\?=\\[A-Z\\]\\)") + } + + func testBackReference() throws { + var blockComment: NSRange? + var commentBegin: NSRange? + var commentEnd: NSRange? + + parser?.parse("\"Emmmm...\" --[=[ This is \na multi-line comment. ]=]") { (scope: String, range: NSRange) in + if blockComment == nil && scope.hasPrefix("comment.block.lua") { + blockComment = range + } + + if commentBegin == nil && scope.hasPrefix("punctuation.definition.comment.begin.lua") { + commentBegin = range + } + + if commentEnd == nil && scope.hasPrefix("punctuation.definition.comment.end.lua") { + commentEnd = range + } + } + + XCTAssertEqual(NSRange(location: 11, length: 40), blockComment) + XCTAssertEqual(NSRange(location: 11, length: 5), commentBegin) + XCTAssertEqual(NSRange(location: 48, length: 3), commentEnd) + + var blockString: NSRange? + var stringBegin: NSRange? + var stringEnd: NSRange? + + parser?.parse("--[=[ Emmmm...]=] [===[ This is \na multi-line string. ]===]") { (scope: String, range: NSRange) in + debugPrint(scope, range) + + if blockString == nil && scope.hasPrefix("string.quoted.other.multiline.lua") { + blockString = range + } + + if stringBegin == nil && scope.hasPrefix("punctuation.definition.string.begin.lua") { + stringBegin = range + } + + if stringEnd == nil && scope.hasPrefix("punctuation.definition.string.end.lua") { + stringEnd = range + } + } + + XCTAssertEqual(NSRange(location: 18, length: 41), blockString) + XCTAssertEqual(NSRange(location: 18, length: 5), stringBegin) + XCTAssertEqual(NSRange(location: 54, length: 5), stringEnd) + } + + func testBackReferencePerformance() throws { + self.measure { + let input = fixture("test.lua", "txt") + parser?.parse(input) { _, _ in return } + } + } + +} diff --git a/SyntaxKit/Tests/Resources/Fixtures/Latex.tmLanguage b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Latex.tmLanguage similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Latex.tmLanguage rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Latex.tmLanguage diff --git a/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Lua.tmLanguage b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Lua.tmLanguage new file mode 100755 index 0000000..9cf783d --- /dev/null +++ b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Lua.tmLanguage @@ -0,0 +1,368 @@ + + + + + fileTypes + + lua + p8 + rockspec + + firstLineMatch + \A#!.*?\blua(\d+(\.\d+)?)?\b|\A--\s+-\*-\s*lua\s*-\*- + keyEquivalent + ^~L + repository + + escaped_char + + patterns + + + match + \\[abfnrtvz\\"'\n] + name + constant.character.escape.lua + + + match + \\\d{1,3} + name + constant.character.escape.byte.lua + + + match + \\x[0-9A-Fa-f][0-9A-Fa-f] + name + constant.character.escape.byte.lua + + + match + \\u\{[0-9A-Fa-f]+\} + name + constant.character.escape.unicode.lua + + + match + \\. + name + invalid.illegal.character.escape.lua + + + + + uuid + 93E017CC-6F27-11D9-90EB-000D93589AF7 + patterns + + + end + \) + begin + \b((local\b)\s+)?(function)\s*(\s+[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*(:[a-zA-Z_][a-zA-Z0-9_]*)?\s*)?(\() + beginCaptures + + 3 + + name + keyword.control.lua + + 4 + + name + entity.name.function.lua + + 5 + + name + punctuation.definition.parameters.begin.lua + + 1 + + name + storage.modifier.local.lua + + + patterns + + + match + [a-zA-Z_][a-zA-Z0-9_]* + name + variable.parameter.function.lua + + + endCaptures + + 0 + + name + punctuation.definition.parameters.end.lua + + + name + meta.function.lua + + + match + (?<![\w\d.])0[xX][0-9A-Fa-f]+(?![pPeE.0-9]) + name + constant.numeric.integer.hexadecimal.lua + + + match + (?<![\w\d.])0[xX][0-9A-Fa-f]+(\.[0-9A-Fa-f]+)?([eE]-?\d*)?([pP][-+]\d+)? + name + constant.numeric.float.hexadecimal.lua + + + match + (?<![\w\d.])\d+(?![pPeE.0-9]) + name + constant.numeric.integer.lua + + + match + (?<![\w\d.])\d+(\.\d+)?([eE]-?\d*)? + name + constant.numeric.float.lua + + + end + ' + begin + ' + beginCaptures + + 0 + + name + punctuation.definition.string.begin.lua + + + patterns + + + include + #escaped_char + + + endCaptures + + 0 + + name + punctuation.definition.string.end.lua + + + name + string.quoted.single.lua + + + end + " + begin + " + beginCaptures + + 0 + + name + punctuation.definition.string.begin.lua + + + patterns + + + include + #escaped_char + + + endCaptures + + 0 + + name + punctuation.definition.string.end.lua + + + name + string.quoted.double.lua + + + end + \]\1\] + begin + (?<!--)\[(=*)\[ + beginCaptures + + 0 + + name + punctuation.definition.string.begin.lua + + + endCaptures + + 0 + + name + punctuation.definition.string.end.lua + + + name + string.quoted.other.multiline.lua + + + match + \A(#!).*$\n? + captures + + 1 + + name + punctuation.definition.comment.lua + + + name + comment.line.shebang.lua + + + end + \]\1\] + begin + --\[(=*)\[ + beginCaptures + + 0 + + name + punctuation.definition.comment.begin.lua + + + endCaptures + + 0 + + name + punctuation.definition.comment.end.lua + + + name + comment.block.lua + + + end + \n + begin + -- + beginCaptures + + 0 + + name + punctuation.definition.comment.lua + + + name + comment.line.double-dash.lua + + + match + \b(goto)\s+([a-zA-Z_][a-zA-Z0-9_]*) + captures + + 1 + + name + keyword.control.goto.lua + + 2 + + name + constant.other.placeholder.lua + + + + + match + (::)[a-zA-Z_][a-zA-Z0-9_]*(::) + captures + + 1 + + name + punctuation.definition.label.begin.lua + + 2 + + name + punctuation.definition.label.end.lua + + + name + constant.other.placeholder.lua + + + match + \b(break|do|else|for|if|elseif|goto|return|then|repeat|while|until|end|function|local|in)\b + name + keyword.control.lua + + + match + (?<![^.]\.|:)\b(false|nil|true|_G|_VERSION|math\.(pi|huge))\b|(?<![.])\.{3}(?!\.) + name + constant.language.lua + + + match + (?<![^.]\.|:)\b(self)\b + name + variable.language.self.lua + + + match + (?<![^.]\.|:)\b(assert|collectgarbage|dofile|error|getfenv|getmetatable|ipairs|loadfile|loadstring|module|next|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|tonumber|tostring|type|unpack|xpcall)\b(?=\s*(?:[({"']|\[\[)) + name + support.function.lua + + + match + (?<![^.]\.|:)\b(coroutine\.(create|resume|running|status|wrap|yield)|string\.(byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(concat|insert|maxn|remove|sort)|math\.(abs|acos|asin|atan2?|ceil|cosh?|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pow|rad|random|randomseed|sinh?|sqrt|tanh?)|io\.(close|flush|input|lines|open|output|popen|read|tmpfile|type|write)|os\.(clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(cpath|loaded|loadlib|path|preload|seeall)|debug\.(debug|[gs]etfenv|[gs]ethook|getinfo|[gs]etlocal|[gs]etmetatable|getregistry|[gs]etupvalue|traceback))\b(?=\s*(?:[({"']|\[\[)) + name + support.function.library.lua + + + match + \b(and|or|not)\b + name + keyword.operator.lua + + + match + \b([a-zA-Z_][a-zA-Z0-9_]*)\b(?=\s*(?:[({"']|\[\[)) + name + support.function.any-method.lua + + + match + (?<=[^.]\.|:)\b([a-zA-Z_][a-zA-Z0-9_]*) + name + variable.other.lua + + + match + \+|-|%|#|\*|\/|\^|==?|~=|<=?|>=?|(?<!\.)\.{2}(?!\.) + name + keyword.operator.lua + + + comment + Lua Syntax: version 0.8 + name + Lua + scopeName + source.lua + + diff --git a/SyntaxKit/Tests/Resources/Fixtures/Ruby.tmLanguage b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Ruby.tmLanguage similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Ruby.tmLanguage rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Ruby.tmLanguage diff --git a/SyntaxKit/Tests/Resources/Fixtures/Solarized.tmTheme b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Solarized.tmTheme similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Solarized.tmTheme rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Solarized.tmTheme diff --git a/SyntaxKit/Tests/Resources/Fixtures/Swift.tmLanguage b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Swift.tmLanguage similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Swift.tmLanguage rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Swift.tmLanguage diff --git a/SyntaxKit/Tests/Resources/Fixtures/Tex.tmLanguage b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Tex.tmLanguage similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Tex.tmLanguage rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Tex.tmLanguage diff --git a/SyntaxKit/Tests/Resources/Fixtures/Tomorrow.tmTheme b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Tomorrow.tmTheme similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Tomorrow.tmTheme rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Tomorrow.tmTheme diff --git a/SyntaxKit/Tests/Resources/Fixtures/Yaml.tmLanguage b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Yaml.tmLanguage similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/Yaml.tmLanguage rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/Yaml.tmLanguage diff --git a/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.lua.txt b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.lua.txt new file mode 100644 index 0000000..20239f9 --- /dev/null +++ b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.lua.txt @@ -0,0 +1,3758 @@ +#!/usr/bin/env lua + +local parser = require "lua-parser.parser" +local pp = require "lua-parser.pp" + +-- expected result, result, subject +local e, r, s + +local filename = "test.lua" + +local function parse (s) + local t,m = parser.parse(s,filename) + local r + if not t then + r = m + else + r = pp.tostring(t) + end + return r .. "\n" +end + +local function fixint (s) + return _VERSION < "Lua 5.3" and s:gsub("%.0","") or s +end + +print("> testing lexer...") + +-- syntax ok + +-- empty files + +s = [=[ +]=] +e = [=[ +{ } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- testing empty file +]=] +e = [=[ +{ } +]=] + +r = parse(s) +assert(r == e) + +-- expressions + +s = [=[ +_nil,_false,_true,_dots = nil,false,true,... +]=] +e = [=[ +{ `Set{ { `Id "_nil", `Id "_false", `Id "_true", `Id "_dots" }, { `Nil, `Boolean "false", `Boolean "true", `Dots } } } +]=] + +r = parse(s) +assert(r == e) + +-- floating points + +s = [=[ +f1 = 1. +f2 = 1.1 +]=] +e = [=[ +{ `Set{ { `Id "f1" }, { `Number "1.0" } }, `Set{ { `Id "f2" }, { `Number "1.1" } } } +]=] + +r = parse(s) +assert(r == fixint(e)) + +s = [=[ +f1 = 1.e-1 +f2 = 1.e1 +]=] +e = [=[ +{ `Set{ { `Id "f1" }, { `Number "0.1" } }, `Set{ { `Id "f2" }, { `Number "10.0" } } } +]=] + +r = parse(s) +assert(r == fixint(e)) + +s = [=[ +f1 = 1.1e+1 +f2 = 1.1e1 +]=] +e = [=[ +{ `Set{ { `Id "f1" }, { `Number "11.0" } }, `Set{ { `Id "f2" }, { `Number "11.0" } } } +]=] + +r = parse(s) +assert(r == fixint(e)) + +s = [=[ +f1 = .1 +f2 = .1e1 +]=] +e = [=[ +{ `Set{ { `Id "f1" }, { `Number "0.1" } }, `Set{ { `Id "f2" }, { `Number "1.0" } } } +]=] + +r = parse(s) +assert(r == fixint(e)) + +s = [=[ +f1 = 1E1 +f2 = 1e-1 +]=] +e = [=[ +{ `Set{ { `Id "f1" }, { `Number "10.0" } }, `Set{ { `Id "f2" }, { `Number "0.1" } } } +]=] + +r = parse(s) +assert(r == fixint(e)) + +-- integers + +s = [=[ +i = 1 +h = 0xff +]=] +e = [=[ +{ `Set{ { `Id "i" }, { `Number "1" } }, `Set{ { `Id "h" }, { `Number "255" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +h = 0x76c +i = 4294967296 -- 2^32 +]=] +e = [=[ +{ `Set{ { `Id "h" }, { `Number "1900" } }, `Set{ { `Id "i" }, { `Number "4294967296" } } } +]=] + +r = parse(s) +assert(r == e) + +-- long comments + +s = [=[ +--[======[ +testing +long +comment +[==[ one ]==] +[===[ more ]===] +[====[ time ]====] +bye +]======] +]=] +e = [=[ +{ } +]=] + +r = parse(s) +assert(r == e) + +-- long strings + +s = [=[ +--[[ +testing long string1 begin +]] + +ls1 = +[[ +testing long string +]] + +--[[ +testing long string1 end +]] +]=] +e = [=[ +{ `Set{ { `Id "ls1" }, { `String "testing long string\n" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +--[==[ +testing long string2 begin +]==] + +ls2 = [==[ testing \n [[ long ]] \t [===[ string ]===] +\a ]==] + +--[==[ +[[ testing long string2 end ]] +]==] +]=] +e = [=[ +{ `Set{ { `Id "ls2" }, { `String " testing \\n [[ long ]] \\t [===[ string ]===]\n\\a " } } } +]=] + +r = parse(s) +assert(r == e) + +-- short strings + +s = [=[ +-- short string test begin + +ss1_a = "ola mundo\a" +ss1_b = 'ola mundo\a' + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "ss1_a" }, { `String "ola mundo\a" } }, `Set{ { `Id "ss1_b" }, { `String "ola mundo\a" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +ss2_a = "testando,\tteste\n1\n2\n3 --> \"tchau\"" +ss2_b = 'testando,\tteste\n1\n2\n3 --> \'tchau\'' + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "ss2_a" }, { `String "testando,\tteste\n1\n2\n3 --> \"tchau\"" } }, `Set{ { `Id "ss2_b" }, { `String "testando,\tteste\n1\n2\n3 --> 'tchau'" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +ss3_a = "ola \ +'mundo'!" + +ss3_b = 'ola \ +"mundo"!' + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "ss3_a" }, { `String "ola \n'mundo'!" } }, `Set{ { `Id "ss3_b" }, { `String "ola \n\"mundo\"!" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +ss4_a = "C:\\Temp/" + +ss4_b = 'C:\\Temp/' + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "ss4_a" }, { `String "C:\\Temp/" } }, `Set{ { `Id "ss4_b" }, { `String "C:\\Temp/" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +lf = "\\n" + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "lf" }, { `String "\\n" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +ss5_a = "ola \ +mundo \\ \ +cruel" + +ss5_b = 'ola \ +mundo \\ \ +cruel' + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "ss5_a" }, { `String "ola \nmundo \\ \ncruel" } }, `Set{ { `Id "ss5_b" }, { `String "ola \nmundo \\ \ncruel" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +s1 = 'a \z b' +s2 = "adeus \z + mundo\ +\z maravilhoso" + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "s1" }, { `String "a b" } }, `Set{ { `Id "s2" }, { `String "adeus mundo\nmaravilhoso" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +deci = '\28' +hex = '\x1C' +uni = '\u{001C}' + +-- short string test end +]=] +e = [=[ +{ `Set{ { `Id "deci" }, { `String "\028" } }, `Set{ { `Id "hex" }, { `String "\028" } }, `Set{ { `Id "uni" }, { `String "\028" } } } +]=] + +r = parse(s) +assert(r == e) + +-- syntax error + +-- floating points + +s = [=[ +f = 9e +]=] +e = [=[ +test.lua:2:1: syntax error, expected one or more digits for the exponent +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +f = 5.e +]=] +e = [=[ +test.lua:2:1: syntax error, expected one or more digits for the exponent +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +f = .9e- +]=] +e = [=[ +test.lua:2:1: syntax error, expected one or more digits for the exponent +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +f = 5.9e+ +]=] +e = [=[ +test.lua:2:1: syntax error, expected one or more digits for the exponent +]=] + +r = parse(s) +assert(r == e) + +-- integers + +s = [=[ +-- invalid hexadecimal number + +hex = 0xG +]=] +e = [=[ +test.lua:3:9: syntax error, expected one or more hexadecimal digits after '0x' +]=] + +r = parse(s) +assert(r == e) + +-- long strings + +s = [=[ +--[==[ +testing long string3 begin +]==] + +ls3 = [===[ +testing +unfinised +long string +]==] + +--[==[ +[[ testing long string3 end ]] +]==] +]=] +e = [=[ +test.lua:14:1: syntax error, unclosed long string +]=] + +r = parse(s) +assert(r == e) + +-- short strings + +s = [=[ +-- short string test begin + +ss6 = "testing unfinished string + +-- short string test end +]=] +e = [=[ +test.lua:4:1: syntax error, unclosed string +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +-- short string test begin + +ss7 = 'testing \\ +unfinished \\ +string' + +-- short string test end +]=] +e = [=[ +test.lua:4:1: syntax error, unclosed string +]=] + +r = parse(s) +assert(r == e) + +-- unfinished comments + +s = [=[ +--[[ testing +unfinished +comment +]=] +e = [=[ +test.lua:4:1: syntax error, unclosed long string +]=] + +r = parse(s) +assert(r == e) + +print("> testing parser...") + +-- syntax ok + +-- anonymous functions + +s = [=[ +local a,b,c = function () end +]=] +e = [=[ +{ `Local{ { `Id "a", `Id "b", `Id "c" }, { `Function{ { }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local test = function ( a , b , ... ) end +]=] +e = [=[ +{ `Local{ { `Id "test" }, { `Function{ { `Id "a", `Id "b", `Dots }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +test = function (...) return ...,0 end +]=] +e = [=[ +{ `Set{ { `Id "test" }, { `Function{ { `Dots }, { `Return{ `Dots, `Number "0" } } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- arithmetic expressions + +s = [=[ +arithmetic = 1 - 2 * 3 + 4 +]=] +e = [=[ +{ `Set{ { `Id "arithmetic" }, { `Op{ "add", `Op{ "sub", `Number "1", `Op{ "mul", `Number "2", `Number "3" } }, `Number "4" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +pow = -3^-2^2 +]=] +e = [=[ +{ `Set{ { `Id "pow" }, { `Op{ "unm", `Op{ "pow", `Number "3", `Op{ "unm", `Op{ "pow", `Number "2", `Number "2" } } } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +q, r, f = 3//2, 3%2, 3/2 +]=] +e = [=[ +{ `Set{ { `Id "q", `Id "r", `Id "f" }, { `Op{ "idiv", `Number "3", `Number "2" }, `Op{ "mod", `Number "3", `Number "2" }, `Op{ "div", `Number "3", `Number "2" } } } } +]=] + +r = parse(s) +assert(r == e) + +-- assignments + +s = [=[ +a = f()[1] +]=] +e = [=[ +{ `Set{ { `Id "a" }, { `Index{ `Call{ `Id "f" }, `Number "1" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +a()[1] = 1; +]=] +e = [=[ +{ `Set{ { `Index{ `Call{ `Id "a" }, `Number "1" } }, { `Number "1" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +i = a.f(1) +]=] +e = [=[ +{ `Set{ { `Id "i" }, { `Call{ `Index{ `Id "a", `String "f" }, `Number "1" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +i = a[f(1)] +]=] +e = [=[ +{ `Set{ { `Id "i" }, { `Index{ `Id "a", `Call{ `Id "f", `Number "1" } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +a[f()] = sub +i = i + 1 +]=] +e = [=[ +{ `Set{ { `Index{ `Id "a", `Call{ `Id "f" } } }, { `Id "sub" } }, `Set{ { `Id "i" }, { `Op{ "add", `Id "i", `Number "1" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +a:b(1)._ = some_value +]=] +e = [=[ +{ `Set{ { `Index{ `Invoke{ `Id "a", `String "b", `Number "1" }, `String "_" } }, { `Id "some_value" } } } +]=] + +r = parse(s) +assert(r == e) + +-- bitwise expressions + +s = [=[ +b = 1 & 0 | 1 ~ 1 +]=] +e = [=[ +{ `Set{ { `Id "b" }, { `Op{ "bor", `Op{ "band", `Number "1", `Number "0" }, `Op{ "bxor", `Number "1", `Number "1" } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +b = 1 & 0 | 1 >> 1 ~ 1 +]=] +e = [=[ +{ `Set{ { `Id "b" }, { `Op{ "bor", `Op{ "band", `Number "1", `Number "0" }, `Op{ "bxor", `Op{ "shr", `Number "1", `Number "1" }, `Number "1" } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- break + +s = [=[ +while 1 do + break +end +]=] +e = [=[ +{ `While{ `Number "1", { `Break } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while 1 do + while 1 do + break + end + break +end +]=] +e = [=[ +{ `While{ `Number "1", { `While{ `Number "1", { `Break } }, `Break } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +repeat + if 2 > 1 then break end +until 1 +]=] +e = [=[ +{ `Repeat{ { `If{ `Op{ "gt", `Number "2", `Number "1" }, { `Break } } }, `Number "1" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +for i=1,10 do + do + break + break + return + end +end +]=] +e = [=[ +{ `Fornum{ `Id "i", `Number "1", `Number "10", { `Do{ `Break, `Break, `Return } } } } +]=] + +r = parse(s) +assert(r == e) + +-- block statements + +s = [=[ +do + var = 2+2; + return +end +]=] +e = [=[ +{ `Do{ `Set{ { `Id "var" }, { `Op{ "add", `Number "2", `Number "2" } } }, `Return } } +]=] + +r = parse(s) +assert(r == e) + +-- concatenation expressions + +s = [=[ +concat1 = 1 .. 2^3 +]=] +e = [=[ +{ `Set{ { `Id "concat1" }, { `Op{ "concat", `Number "1", `Op{ "pow", `Number "2", `Number "3" } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- empty files + +s = [=[ +; +]=] +e = [=[ +{ } +]=] + +r = parse(s) +assert(r == e) + +-- for generic + +s = [=[ +for k,v in pairs(t) do print (k,v) end +]=] +e = [=[ +{ `Forin{ { `Id "k", `Id "v" }, { `Call{ `Id "pairs", `Id "t" } }, { `Call{ `Id "print", `Id "k", `Id "v" } } } } +]=] + +r = parse(s) +assert(r == e) + +-- for numeric + +s = [=[ +for i = 1 , 10 , 2 do end +]=] +e = [=[ +{ `Fornum{ `Id "i", `Number "1", `Number "10", `Number "2", { } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +for i=1,10 do end +]=] +e = [=[ +{ `Fornum{ `Id "i", `Number "1", `Number "10", { } } } +]=] + +r = parse(s) +assert(r == e) + +-- global functions + +s = [=[ +function test(a , b , ...) end +]=] +e = [=[ +{ `Set{ { `Id "test" }, { `Function{ { `Id "a", `Id "b", `Dots }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function test (...) end +]=] +e = [=[ +{ `Set{ { `Id "test" }, { `Function{ { `Dots }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function t.a:b() end +]=] +e = [=[ +{ `Set{ { `Index{ `Index{ `Id "t", `String "a" }, `String "b" } }, { `Function{ { `Id "self" }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function t.a() end +]=] +e = [=[ +{ `Set{ { `Index{ `Id "t", `String "a" } }, { `Function{ { }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function testando . funcao . com : espcacos ( e, com , parametros, ... ) end +]=] +e = [=[ +{ `Set{ { `Index{ `Index{ `Index{ `Id "testando", `String "funcao" }, `String "com" }, `String "espcacos" } }, { `Function{ { `Id "self", `Id "e", `Id "com", `Id "parametros", `Dots }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- goto + +s = [=[ +goto label +:: label :: return +]=] +e = [=[ +{ `Goto{ "label" }, `Label{ "label" }, `Return } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +::label:: +goto label +]=] +e = [=[ +{ `Label{ "label" }, `Goto{ "label" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +goto label +::label:: +]=] +e = [=[ +{ `Goto{ "label" }, `Label{ "label" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +::label:: +do ::label:: goto label end +]=] +e = [=[ +{ `Label{ "label" }, `Do{ `Label{ "label" }, `Goto{ "label" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +::label:: +do goto label ; ::label:: end +]=] +e = [=[ +{ `Label{ "label" }, `Do{ `Goto{ "label" }, `Label{ "label" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +::label:: +do goto label end +]=] +e = [=[ +{ `Label{ "label" }, `Do{ `Goto{ "label" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +do goto label end +::label:: +]=] +e = [=[ +{ `Do{ `Goto{ "label" } }, `Label{ "label" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +do do do do do goto label end end end end end +::label:: +]=] +e = [=[ +{ `Do{ `Do{ `Do{ `Do{ `Do{ `Goto{ "label" } } } } } }, `Label{ "label" } } +]=] + +r = parse(s) +assert(r == e) + +-- if-else + +s = [=[ +if a then end +]=] +e = [=[ +{ `If{ `Id "a", { } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then return a else return end +]=] +e = [=[ +{ `If{ `Id "a", { `Return{ `Id "a" } }, { `Return } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then + return a +else + local c = d + d = d + 1 + return d +end +]=] +e = [=[ +{ `If{ `Id "a", { `Return{ `Id "a" } }, { `Local{ { `Id "c" }, { `Id "d" } }, `Set{ { `Id "d" }, { `Op{ "add", `Id "d", `Number "1" } } }, `Return{ `Id "d" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then + return a +elseif b then + return b +elseif c then + return c +end +]=] +e = [=[ +{ `If{ `Id "a", { `Return{ `Id "a" } }, `Id "b", { `Return{ `Id "b" } }, `Id "c", { `Return{ `Id "c" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then return a +elseif b then return +else ; +end +]=] +e = [=[ +{ `If{ `Id "a", { `Return{ `Id "a" } }, `Id "b", { `Return }, { } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then + return +elseif c then +end +]=] +e = [=[ +{ `If{ `Id "a", { `Return }, `Id "c", { } } } +]=] + +r = parse(s) +assert(r == e) + +-- labels + +s = [=[ +::label:: +do ::label:: end +::other_label:: +]=] +e = [=[ +{ `Label{ "label" }, `Do{ `Label{ "label" } }, `Label{ "other_label" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local x = glob +::label:: +foo() +]=] +e = [=[ +{ `Local{ { `Id "x" }, { `Id "glob" } }, `Label{ "label" }, `Call{ `Id "foo" } } +]=] + +r = parse(s) +assert(r == e) + +-- locals + +s = [=[ +local a +]=] +e = [=[ +{ `Local{ { `Id "a" }, { } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local a,b,c +]=] +e = [=[ +{ `Local{ { `Id "a", `Id "b", `Id "c" }, { } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local a = 1 , 1 + 2, 5.1 +]=] +e = [=[ +{ `Local{ { `Id "a" }, { `Number "1", `Op{ "add", `Number "1", `Number "2" }, `Number "5.1" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local a,b,c = 1.9 +]=] +e = [=[ +{ `Local{ { `Id "a", `Id "b", `Id "c" }, { `Number "1.9" } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function test() end +]=] +e = [=[ +{ `Localrec{ { `Id "test" }, { `Function{ { }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function test ( a , b , c , ... ) end +]=] +e = [=[ +{ `Localrec{ { `Id "test" }, { `Function{ { `Id "a", `Id "b", `Id "c", `Dots }, { } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function test(...) return ... end +]=] +e = [=[ +{ `Localrec{ { `Id "test" }, { `Function{ { `Dots }, { `Return{ `Dots } } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- relational expressions + +s = [=[ +relational = 1 < 2 >= 3 == 4 ~= 5 < 6 <= 7 +]=] +e = [=[ +{ `Set{ { `Id "relational" }, { `Op{ "le", `Op{ "lt", `Op{ "ne", `Op{ "eq", `Op{ "ge", `Op{ "lt", `Number "1", `Number "2" }, `Number "3" }, `Number "4" }, `Number "5" }, `Number "6" }, `Number "7" } } } } +]=] + +r = parse(s) +assert(r == e) + +-- repeat + +s = [=[ +repeat + a,b,c = 1+1,2+2,3+3 + break +until a < 1 +]=] +e = [=[ +{ `Repeat{ { `Set{ { `Id "a", `Id "b", `Id "c" }, { `Op{ "add", `Number "1", `Number "1" }, `Op{ "add", `Number "2", `Number "2" }, `Op{ "add", `Number "3", `Number "3" } } }, `Break }, `Op{ "lt", `Id "a", `Number "1" } } } +]=] + +r = parse(s) +assert(r == e) + +-- return + +s = [=[ +return +]=] +e = [=[ +{ `Return } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +return 1 +]=] +e = [=[ +{ `Return{ `Number "1" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +return 1,1-2*3+4,"alo" +]=] +e = [=[ +{ `Return{ `Number "1", `Op{ "add", `Op{ "sub", `Number "1", `Op{ "mul", `Number "2", `Number "3" } }, `Number "4" }, `String "alo" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +return; +]=] +e = [=[ +{ `Return } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +return 1; +]=] +e = [=[ +{ `Return{ `Number "1" } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +return 1,1-2*3+4,"alo"; +]=] +e = [=[ +{ `Return{ `Number "1", `Op{ "add", `Op{ "sub", `Number "1", `Op{ "mul", `Number "2", `Number "3" } }, `Number "4" }, `String "alo" } } +]=] + +r = parse(s) +assert(r == e) + +-- tables + +s = [=[ +t = { [1] = "alo", alo = 1, 2; } +]=] +e = [=[ +{ `Set{ { `Id "t" }, { `Table{ `Pair{ `Number "1", `String "alo" }, `Pair{ `String "alo", `Number "1" }, `Number "2" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +t = { 1.5 } +]=] +e = [=[ +{ `Set{ { `Id "t" }, { `Table{ `Number "1.5" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +t = {1,2; +3, +4, + + + +5} +]=] +e = [=[ +{ `Set{ { `Id "t" }, { `Table{ `Number "1", `Number "2", `Number "3", `Number "4", `Number "5" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +t = {[1]=1,[2]=2; +[3]=3, +[4]=4, + + + +[5]=5} +]=] +e = [=[ +{ `Set{ { `Id "t" }, { `Table{ `Pair{ `Number "1", `Number "1" }, `Pair{ `Number "2", `Number "2" }, `Pair{ `Number "3", `Number "3" }, `Pair{ `Number "4", `Number "4" }, `Pair{ `Number "5", `Number "5" } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local t = {{{}}, {"alo"}} +]=] +e = [=[ +{ `Local{ { `Id "t" }, { `Table{ `Table{ `Table }, `Table{ `String "alo" } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local x = 0 +local t = {x} +]=] +e = [=[ +{ `Local{ { `Id "x" }, { `Number "0" } }, `Local{ { `Id "t" }, { `Table{ `Id "x" } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local x = 0 +local t = {x = 1} +]=] +e = [=[ +{ `Local{ { `Id "x" }, { `Number "0" } }, `Local{ { `Id "t" }, { `Table{ `Pair{ `String "x", `Number "1" } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local x = 0 +local t = {x == 1} +]=] +e = [=[ +{ `Local{ { `Id "x" }, { `Number "0" } }, `Local{ { `Id "t" }, { `Table{ `Op{ "eq", `Id "x", `Number "1" } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- vararg + +s = [=[ +function f (...) + return ... +end +]=] +e = [=[ +{ `Set{ { `Id "f" }, { `Function{ { `Dots }, { `Return{ `Dots } } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function f () + function g (x, y, ...) + return ...,...,... + end +end +]=] +e = [=[ +{ `Set{ { `Id "f" }, { `Function{ { }, { `Set{ { `Id "g" }, { `Function{ { `Id "x", `Id "y", `Dots }, { `Return{ `Dots, `Dots, `Dots } } } } } } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function f (x, ...) + return ... +end +]=] +e = [=[ +{ `Localrec{ { `Id "f" }, { `Function{ { `Id "x", `Dots }, { `Return{ `Dots } } } } } } +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local f = function (x, ...) + return ... +end +]=] +e = [=[ +{ `Local{ { `Id "f" }, { `Function{ { `Id "x", `Dots }, { `Return{ `Dots } } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- while + +s = [=[ +i = 0 +while (i < 10) +do + i = i + 1 +end +]=] +e = [=[ +{ `Set{ { `Id "i" }, { `Number "0" } }, `While{ `Paren{ `Op{ "lt", `Id "i", `Number "10" } }, { `Set{ { `Id "i" }, { `Op{ "add", `Id "i", `Number "1" } } } } } } +]=] + +r = parse(s) +assert(r == e) + +-- syntax error + +-- anonymous functions + +s = [=[ +a = function (a,b,) end +]=] +e = [=[ +test.lua:1:19: syntax error, expected a variable name or '...' after ',' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +a = function (...,a) end +]=] +e = [=[ +test.lua:1:18: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local a = function (1) end +]=] +e = [=[ +test.lua:1:21: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local test = function ( a , b , c , ... ) +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the function body +]=] + +r = parse(s) +assert(r == e) + +-- arithmetic expressions + +s = [=[ +a = 3 / / 2 +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +-- bitwise expressions + +s = [=[ +b = 1 && 1 +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after '&' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +b = 1 <> 0 +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +b = 1 < < 0 +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +-- break + +s = [=[ +break +]=] +e = [=[ +test.lua:1:1: syntax error, not inside a loop +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function f (x) + if 1 then break end +end +]=] +e = [=[ +test.lua:2:13: syntax error, not inside a loop +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while 1 do +end +break +]=] +e = [=[ +test.lua:3:1: syntax error, not inside a loop +]=] + +r = parse(s) +assert(r == e) + +-- concatenation expressions + +s = [=[ +concat2 = 2^3..1 +]=] +e = [=[ +test.lua:1:15: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local s = "1 + 1 = " +print(s .. 1+1) +]=] +e = [=[ +{ `Local{ { `Id "s" }, { `String "1 + 1 = " } }, `Call{ `Id "print", `Op{ "concat", `Id "s", `Op{ "add", `Number "1", `Number "1" } } } } +]=] + +r = parse(s) +assert(r == e) + +-- for generic + +s = [=[ +for k;v in pairs(t) do end +]=] +e = [=[ +test.lua:1:6: syntax error, expected '=' or 'in' after the variable(s) +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +for k,v in pairs(t:any) do end +]=] +e = [=[ +test.lua:1:23: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +-- for numeric + +s = [=[ +for i=1,10, do end +]=] +e = [=[ +test.lua:1:13: syntax error, expected a step expression for the numeric range after ',' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +for i=1,n:number do end +]=] +e = [=[ +test.lua:1:18: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +-- global functions + +s = [=[ +function func(a,b,c,) end +]=] +e = [=[ +test.lua:1:21: syntax error, expected a variable name or '...' after ',' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function func(...,a) end +]=] +e = [=[ +test.lua:1:18: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function a.b:c:d () end +]=] +e = [=[ +test.lua:1:15: syntax error, expected '(' for the parameter list +]=] + +r = parse(s) +assert(r == e) + +-- goto + +s = [=[ +:: label :: return +goto label +]=] +e = [=[ +test.lua:2:1: syntax error, unexpected character(s), expected EOF +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +goto label +]=] +e = [=[ +test.lua:1:1: syntax error, no visible label 'label' for +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +goto label +::other_label:: +]=] +e = [=[ +test.lua:1:1: syntax error, no visible label 'label' for +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +::other_label:: +do do do goto label end end end +]=] +e = [=[ +test.lua:2:10: syntax error, no visible label 'label' for +]=] + +r = parse(s) +assert(r == e) + +-- if-else + +s = [=[ +if a then +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the if statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then else +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the if statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then + return a +elseif b then + return b +elseif + +end +]=] +e = [=[ +test.lua:7:1: syntax error, expected a condition after 'elseif' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a:any then else end +]=] +e = [=[ +test.lua:1:10: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +-- labels + +s = [=[ +:: blah :: +:: not :: +]=] +e = [=[ +test.lua:2:4: syntax error, expected a label name after '::' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +::label:: +::other_label:: +::label:: +]=] +e = [=[ +test.lua:3:1: syntax error, label 'label' already defined at line 1 +]=] + +r = parse(s) +assert(r == e) + +-- locals + +s = [=[ +local a = +]=] +e = [=[ +test.lua:2:1: syntax error, expected one or more expressions after '=' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function t.a() end +]=] +e = [=[ +test.lua:1:17: syntax error, expected '(' for the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function test (a,) end +]=] +e = [=[ +test.lua:1:24: syntax error, expected a variable name or '...' after ',' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function test(...,a) end +]=] +e = [=[ +test.lua:1:24: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function (a, b, c, ...) end +]=] +e = [=[ +test.lua:1:16: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +-- repeat + +s = [=[ +repeat + a,b,c = 1+1,2+2,3+3 + break +]=] +e = [=[ +test.lua:4:1: syntax error, expected 'until' at the end of the repeat loop +]=] + +r = parse(s) +assert(r == e) + +-- return + +s = [=[ +return +return 1 +return 1,1-2*3+4,"alo" +return; +return 1; +return 1,1-2*3+4,"alo"; +]=] +e = [=[ +test.lua:2:1: syntax error, unexpected character(s), expected EOF +]=] + +r = parse(s) +assert(r == e) + +-- tables + +s = [=[ +t = { , } +]=] +e = [=[ +test.lua:1:7: syntax error, expected '}' to close the table constructor +]=] + +r = parse(s) +assert(r == e) + +-- vararg + +s = [=[ +function f () + return ... +end +]=] +e = [=[ +test.lua:2:10: syntax error, cannot use '...' outside a vararg function +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function f () + function g (x, y) + return ...,...,... + end +end +]=] +e = [=[ +test.lua:3:12: syntax error, cannot use '...' outside a vararg function +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function f (x) + return ... +end +]=] +e = [=[ +test.lua:2:10: syntax error, cannot use '...' outside a vararg function +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local f = function (x) + return ... +end +]=] +e = [=[ +test.lua:2:10: syntax error, cannot use '...' outside a vararg function +]=] + +r = parse(s) +assert(r == e) + +-- while + +s = [=[ +i = 0 +while (i < 10) + i = i + 1 +end +]=] +e = [=[ +test.lua:3:3: syntax error, expected 'do' after the condition +]=] + +r = parse(s) +assert(r == e) + +print("> testing more syntax errors...") + +-- ErrExtra +s = [=[ +return; print("hello") +]=] +e = [=[ +test.lua:1:9: syntax error, unexpected character(s), expected EOF +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while foo do if bar then baz() end end end +]=] +e = [=[ +test.lua:1:40: syntax error, unexpected character(s), expected EOF +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local func f() + g() +end +]=] +e = [=[ +test.lua:3:1: syntax error, unexpected character(s), expected EOF +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function qux() + if false then + -- do + return 0 + end + end + return 1 +end +print(qux()) +]=] +e = [=[ +test.lua:8:1: syntax error, unexpected character(s), expected EOF +]=] + +r = parse(s) +assert(r == e) + +-- ErrInvalidStat +s = [=[ +find_solution() ? print("yes") : print("no") +]=] +e = [=[ +test.lua:1:17: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local i : int = 0 +]=] +e = [=[ +test.lua:1:9: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local a = 1, b = 2 +]=] +e = [=[ +test.lua:1:16: syntax error, unexpected token, invalid start of statement +]=] + +s = [=[ +x = - +y = 2 +]=] +e = [=[ +test.lua:2:3: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +obj::hello() +]=] +e = [=[ +test.lua:1:1: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while foo() do + // not a lua comment + bar() +end +]=] +e = [=[ +test.lua:2:3: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +repeat: + action() +until condition +end +]=] +e = [=[ +test.lua:1:7: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function f(x) + local result + ... -- TODO: compute for the next result + return result +end +]=] +e = [=[ +test.lua:3:3: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x; +]=] +e = [=[ +test.lua:1:1: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +a, b, c +]=] +e = [=[ +test.lua:1:1: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local x = 42 // the meaning of life +]=] +e = [=[ +test.lua:1:21: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +let x = 2 +]=] +e = [=[ +test.lua:1:1: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if p then + f() +elif q then + g() +end +]=] +e = [=[ +test.lua:3:1: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo() + bar() +emd +]=] +e = [=[ +test.lua:3:1: syntax error, unexpected token, invalid start of statement +]=] + +r = parse(s) +assert(r == e) + +-- ErrEndIf +s = [=[ +if 1 > 2 then print("impossible") +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the if statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if 1 > 2 then return; print("impossible") end +]=] +e = [=[ +test.lua:1:23: syntax error, expected 'end' to close the if statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if condA then doThis() +else if condB then doThat() end +]=] +e = [=[ +test.lua:3:1: syntax error, expected 'end' to close the if statement +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if a then + b() +else + c() +else + d() +end +]=] +e = [=[ +test.lua:5:1: syntax error, expected 'end' to close the if statement +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprIf +s = [=[ +if then print("that") end +]=] +e = [=[ +test.lua:1:4: syntax error, expected a condition after 'if' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +if !ok then error("fail") end +]=] +e = [=[ +test.lua:1:4: syntax error, expected a condition after 'if' +]=] + +r = parse(s) +assert(r == e) + +-- ErrThenIf +s = [=[ +if age < 18 + print("too young!") +end +]=] +e = [=[ +test.lua:2:3: syntax error, expected 'then' after the condition +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprEIf +s = [=[ +if age < 18 then print("too young!") +elseif then print("too old") end +]=] +e = [=[ +test.lua:2:8: syntax error, expected a condition after 'elseif' +]=] + +r = parse(s) +assert(r == e) + +-- ErrThenEIf +s = [=[ +if not result then error("fail") +elseif result > 0: + process(result) +end +]=] +e = [=[ +test.lua:2:18: syntax error, expected 'then' after the condition +]=] + +r = parse(s) +assert(r == e) + +-- ErrEndDo +s = [=[ +do something() +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the do block +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +do + return arr[i] + i = i + 1 +end +]=] +e = [=[ +test.lua:3:3: syntax error, expected 'end' to close the do block +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprWhile +s = [=[ +while !done do done = work() end +]=] +e = [=[ +test.lua:1:7: syntax error, expected a condition after 'while' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while do print("hello again!") end +]=] +e = [=[ +test.lua:1:7: syntax error, expected a condition after 'while' +]=] + +r = parse(s) +assert(r == e) + +-- ErrDoWhile +s = [=[ +while not done then work() end +]=] +e = [=[ +test.lua:1:16: syntax error, expected 'do' after the condition +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while not done + work() +end +]=] +e = [=[ +test.lua:2:3: syntax error, expected 'do' after the condition +]=] + +r = parse(s) +assert(r == e) + +-- ErrEndWhile +s = [=[ +while not found do i = i + 1 +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the while loop +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +while i < #arr do + if arr[i] == target then break + i = i +1 +end +]=] +e = [=[ +test.lua:5:1: syntax error, expected 'end' to close the while loop +]=] + +r = parse(s) +assert(r == e) + +-- ErrUntilRep +s = [=[ +repeat play_song() +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'until' at the end of the repeat loop +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprRep +s = [=[ +repeat film() until end +]=] +e = [=[ +test.lua:1:21: syntax error, expected a conditions after 'until' +]=] + +r = parse(s) +assert(r == e) + +-- ErrForRange +s = [=[ +for (key, val) in obj do + print(key .. " -> " .. val) +end +]=] +e = [=[ +test.lua:1:5: syntax error, expected a numeric or generic range after 'for' +]=] + +r = parse(s) +assert(r == e) + +-- ErrEndFor +s = [=[ +for i = 1,10 do print(i) +]=] +e = [=[ +test.lua:2:1: syntax error, expected 'end' to close the for loop +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprFor1 +s = [=[ +for i = ,10 do print(i) end +]=] +e = [=[ +test.lua:1:9: syntax error, expected a starting expression for the numeric range +]=] + +r = parse(s) +assert(r == e) + +-- ErrCommaFor +s = [=[ +for i = 1 to 10 do print(i) end +]=] +e = [=[ +test.lua:1:11: syntax error, expected ',' to split the start and end of the range +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprFor2 +s = [=[ +for i = 1, do print(i) end +]=] +e = [=[ +test.lua:1:12: syntax error, expected an ending expression for the numeric range +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprFor3 +s = [=[ +for i = 1,10, do print(i) end +]=] +e = [=[ +test.lua:1:15: syntax error, expected a step expression for the numeric range after ',' +]=] + +r = parse(s) +assert(r == e) + +-- ErrInFor +s = [=[ +for arr do print(arr[i]) end +]=] +e = [=[ +test.lua:1:9: syntax error, expected '=' or 'in' after the variable(s) +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +for nums := 1,10 do print(i) end +]=] +e = [=[ +test.lua:1:10: syntax error, expected '=' or 'in' after the variable(s) +]=] + +r = parse(s) +assert(r == e) + +-- ErrEListFor +s = [=[ +for i in ? do print(i) end +]=] +e = [=[ +test.lua:1:10: syntax error, expected one or more expressions after 'in' +]=] + +r = parse(s) +assert(r == e) + +-- ErrDoFor +s = [=[ +for i = 1,10 doo print(i) end +]=] +e = [=[ +test.lua:1:14: syntax error, expected 'do' after the range of the for loop +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +for _, elem in ipairs(list) + print(elem) +end +]=] +e = [=[ +test.lua:2:3: syntax error, expected 'do' after the range of the for loop +]=] + +r = parse(s) +assert(r == e) + +-- ErrDefLocal +s = [=[ +local +]=] +e = [=[ +test.lua:2:1: syntax error, expected a function definition or assignment after local +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local; x = 2 +]=] +e = [=[ +test.lua:1:6: syntax error, expected a function definition or assignment after local +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local *p = nil +]=] +e = [=[ +test.lua:1:7: syntax error, expected a function definition or assignment after local +]=] + +r = parse(s) +assert(r == e) + +-- ErrNameLFunc +s = [=[ +local function() return 0 end +]=] +e = [=[ +test.lua:1:15: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function 3dprint(x, y, z) end +]=] +e = [=[ +test.lua:1:16: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local function repeat(f, ntimes) for i = 1,ntimes do f() end end +]=] +e = [=[ +test.lua:1:16: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +-- ErrEListLAssign +s = [=[ +local x = ? +]=] +e = [=[ +test.lua:1:11: syntax error, expected one or more expressions after '=' +]=] + +r = parse(s) +assert(r == e) + +-- ErrEListAssign +s = [=[ +x = ? +]=] +e = [=[ +test.lua:1:5: syntax error, expected one or more expressions after '=' +]=] + +r = parse(s) +assert(r == e) + +-- ErrFuncName +s = [=[ +function() return 0 end +]=] +e = [=[ +test.lua:1:9: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function 3dprint(x, y, z) end +]=] +e = [=[ +test.lua:1:10: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function repeat(f, ntimes) for i = 1,ntimes do f() end end +]=] +e = [=[ +test.lua:1:10: syntax error, expected a function name after 'function' +]=] + +r = parse(s) +assert(r == e) + +-- ErrNameFunc1 +s = [=[ +function foo.() end +]=] +e = [=[ +test.lua:1:14: syntax error, expected a function name after '.' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo.1() end +]=] +e = [=[ +test.lua:1:14: syntax error, expected a function name after '.' +]=] + +r = parse(s) +assert(r == e) + +-- ErrNameFunc2 +s = [=[ +function foo:() end +]=] +e = [=[ +test.lua:1:14: syntax error, expected a method name after ':' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo:1() end +]=] +e = [=[ +test.lua:1:14: syntax error, expected a method name after ':' +]=] + +r = parse(s) +assert(r == e) + +-- ErrOParenPList +s = [=[ +function foo + return bar +end +]=] +e = [=[ +test.lua:2:3: syntax error, expected '(' for the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo?(bar) + return bar +end +]=] +e = [=[ +test.lua:1:13: syntax error, expected '(' for the parameter list +]=] + +r = parse(s) +assert(r == e) + +-- ErrCParenPList +s = [=[ +function foo(bar + return bar +end +]=] +e = [=[ +test.lua:2:3: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo(bar; baz) + return bar +end +]=] +e = [=[ +test.lua:1:17: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo(a, b, ...rest) end +]=] +e = [=[ +test.lua:1:23: syntax error, expected ')' to close the parameter list +]=] + +r = parse(s) +assert(r == e) + +-- ErrEndFunc +s = [=[ +function foo(bar) + return bar +]=] +e = [=[ +test.lua:3:1: syntax error, expected 'end' to close the function body +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +function foo() do + bar() +end +]=] +e = [=[ +test.lua:4:1: syntax error, expected 'end' to close the function body +]=] + +r = parse(s) +assert(r == e) + +-- ErrParList +s = [=[ +function foo(bar, baz,) + return bar +end +]=] +e = [=[ +test.lua:1:23: syntax error, expected a variable name or '...' after ',' +]=] + +r = parse(s) +assert(r == e) + +-- ErrLabel +s = [=[ +::1:: +]=] +e = [=[ +test.lua:1:3: syntax error, expected a label name after '::' +]=] + +r = parse(s) +assert(r == e) + +-- ErrCloseLabel +s = [=[ +::loop +]=] +e = [=[ +test.lua:2:1: syntax error, expected '::' after the label +]=] + +r = parse(s) +assert(r == e) + +-- ErrGoto +s = [=[ +goto; +]=] +e = [=[ +test.lua:1:5: syntax error, expected a label after 'goto' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +goto 1 +]=] +e = [=[ +test.lua:1:6: syntax error, expected a label after 'goto' +]=] + +r = parse(s) +assert(r == e) + +-- ErrRetList +s = [=[ +return a, b, +]=] +e = [=[ +test.lua:2:1: syntax error, expected an expression after ',' in the return statement +]=] + +r = parse(s) +assert(r == e) + +-- ErrVarList +s = [=[ +x, y, = 0, 0 +]=] +e = [=[ +test.lua:1:7: syntax error, expected a variable name after ',' +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprList +s = [=[ +x, y = 0, 0, +]=] +e = [=[ +test.lua:2:1: syntax error, expected an expression after ',' +]=] + +r = parse(s) +assert(r == e) + +-- ErrOrExpr +s = [=[ +foo(a or) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after 'or' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a or $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after 'or' +]=] + +r = parse(s) +assert(r == e) + +-- ErrAndExpr +s = [=[ +foo(a and) +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after 'and' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a and $b +]=] +e = [=[ +test.lua:1:11: syntax error, expected an expression after 'and' +]=] + +r = parse(s) +assert(r == e) + +-- ErrRelExpr +s = [=[ +foo(a <) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a < $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a <=) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a <= $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a >) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a > $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a >=) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a >= $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a ==) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a == $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a ~=) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a ~= $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the relational operator +]=] + +r = parse(s) +assert(r == e) + +-- ErrBOrExpr +s = [=[ +foo(a |) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after '|' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a | $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after '|' +]=] + +r = parse(s) +assert(r == e) + +-- ErrBXorExpr +s = [=[ +foo(a ~) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after '~' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a ~ $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after '~' +]=] + +r = parse(s) +assert(r == e) + +-- ErrBAndExpr +s = [=[ +foo(a &) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after '&' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a & $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after '&' +]=] + +r = parse(s) +assert(r == e) + +-- ErrShiftExpr +s = [=[ +foo(a >>) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the bit shift +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a >> $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the bit shift +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a <<) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the bit shift +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a >> $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the bit shift +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a >>> b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the bit shift +]=] + +r = parse(s) +assert(r == e) + +-- ErrConcatExpr +s = [=[ +foo(a ..) +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after '..' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a .. $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after '..' +]=] + +r = parse(s) +assert(r == e) + +-- ErrAddExpr +s = [=[ +foo(a +, b) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after the additive operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a + $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the additive operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a -, b) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after the additive operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a - $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the additive operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +arr[i++] +]=] +e = [=[ +test.lua:1:7: syntax error, expected an expression after the additive operator +]=] + +r = parse(s) +assert(r == e) + +-- ErrMulExpr +s = [=[ +foo(b, a *) +]=] +e = [=[ +test.lua:1:11: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a * $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(b, a /) +]=] +e = [=[ +test.lua:1:11: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a / $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(b, a //) +]=] +e = [=[ +test.lua:1:12: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a // $b +]=] +e = [=[ +test.lua:1:10: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(b, a %) +]=] +e = [=[ +test.lua:1:11: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a % $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after the multiplicative operator +]=] + +r = parse(s) +assert(r == e) + +-- ErrUnaryExpr +s = [=[ +x, y = a + not, b +]=] +e = [=[ +test.lua:1:15: syntax error, expected an expression after the unary operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x, y = a + -, b +]=] +e = [=[ +test.lua:1:13: syntax error, expected an expression after the unary operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x, y = a + #, b +]=] +e = [=[ +test.lua:1:13: syntax error, expected an expression after the unary operator +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x, y = a + ~, b +]=] +e = [=[ +test.lua:1:13: syntax error, expected an expression after the unary operator +]=] + +r = parse(s) +assert(r == e) + +-- ErrPowExpr +s = [=[ +foo(a ^) +]=] +e = [=[ +test.lua:1:8: syntax error, expected an expression after '^' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x = a ^ $b +]=] +e = [=[ +test.lua:1:9: syntax error, expected an expression after '^' +]=] + +r = parse(s) +-- assert(r == e) + +-- ErrExprParen +s = [=[ +x = () +]=] +e = [=[ +test.lua:1:6: syntax error, expected an expression after '(' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +y = (???) +]=] +e = [=[ +test.lua:1:6: syntax error, expected an expression after '(' +]=] + +r = parse(s) +assert(r == e) + +-- ErrCParenExpr +s = [=[ +z = a*(b+c +]=] +e = [=[ +test.lua:2:1: syntax error, expected ')' to close the expression +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +w = (0xBV) +]=] +e = [=[ +test.lua:1:9: syntax error, expected ')' to close the expression +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +ans = 2^(m*(n-1) +]=] +e = [=[ +test.lua:2:1: syntax error, expected ')' to close the expression +]=] + +r = parse(s) +assert(r == e) + +-- ErrNameIndex +s = [=[ +f = t. +]=] +e = [=[ +test.lua:2:1: syntax error, expected a field name after '.' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +f = t.['f'] +]=] +e = [=[ +test.lua:1:7: syntax error, expected a field name after '.' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x. +]=] +e = [=[ +test.lua:2:1: syntax error, expected a field name after '.' +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprIndex +s = [=[ +f = t[] +]=] +e = [=[ +test.lua:1:7: syntax error, expected an expression after '[' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +f = t[?] +]=] +e = [=[ +test.lua:1:7: syntax error, expected an expression after '[' +]=] + +r = parse(s) +assert(r == e) + +-- ErrCBracketIndex +s = [=[ +f = t[x[y] +]=] +e = [=[ +test.lua:2:1: syntax error, expected ']' to close the indexing expression +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +f = t[x,y] +]=] +e = [=[ +test.lua:1:8: syntax error, expected ']' to close the indexing expression +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +arr[i--] +]=] +e = [=[ +test.lua:2:1: syntax error, expected ']' to close the indexing expression +]=] + +r = parse(s) +assert(r == e) + +-- ErrNameMeth +s = [=[ +x = obj: +]=] +e = [=[ +test.lua:2:1: syntax error, expected a method name after ':' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +x := 0 +]=] +e = [=[ +test.lua:1:4: syntax error, expected a method name after ':' +]=] + +r = parse(s) +assert(r == e) + +-- ErrMethArgs +s = [=[ +cow:moo +]=] +e = [=[ +test.lua:2:1: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +dog:bark msg +]=] +e = [=[ +test.lua:1:10: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +duck:quack[4] +]=] +e = [=[ +test.lua:1:11: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local t = { + x = X: + y = Y; +} +]=] +e = [=[ +test.lua:3:5: syntax error, expected some arguments for the method call (or '()') +]=] + +r = parse(s) +assert(r == e) + +-- ErrArgList +s = [=[ +foo(a, b, ) +]=] +e = [=[ +test.lua:1:11: syntax error, expected an expression after ',' in the argument list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(a, b, ..) +]=] +e = [=[ +test.lua:1:11: syntax error, expected an expression after ',' in the argument list +]=] + +r = parse(s) +assert(r == e) + +-- ErrCParenArgs +s = [=[ +foo(a + (b - c) +]=] +e = [=[ +test.lua:2:1: syntax error, expected ')' to close the argument list +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +foo(arg1 arg2) +]=] +e = [=[ +test.lua:1:10: syntax error, expected ')' to close the argument list +]=] + +r = parse(s) +assert(r == e) + +-- ErrCBraceTable +s = [=[ +nums = {1, 2, 3] +]=] +e = [=[ +test.lua:1:16: syntax error, expected '}' to close the table constructor +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +nums = { + one = 1; + two = 2 + three = 3; + four = 4 +} +]=] +e = [=[ +test.lua:4:3: syntax error, expected '}' to close the table constructor +]=] + +r = parse(s) +assert(r == e) + +-- ErrEqField +s = [=[ +words2nums = { ['one'] -> 1 } +]=] +e = [=[ +test.lua:1:24: syntax error, expected '=' after the table key +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprField +s = [=[ +words2nums = { ['one'] => 2 } +]=] +e = [=[ +test.lua:1:25: syntax error, expected an expression after '=' +]=] + +r = parse(s) +assert(r == e) + +-- ErrExprFKey +s = [=[ +table = { [] = value } +]=] +e = [=[ +test.lua:1:12: syntax error, expected an expression after '[' for the table key +]=] + +r = parse(s) +assert(r == e) + +-- ErrCBracketFKey +s = [=[ +table = { [key = value } +]=] +e = [=[ +test.lua:1:16: syntax error, expected ']' to close the table key +]=] + +r = parse(s) +assert(r == e) + + +-- ErrDigitHex +s = [=[ +print(0x) +]=] +e = [=[ +test.lua:1:9: syntax error, expected one or more hexadecimal digits after '0x' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print(0xGG) +]=] +e = [=[ +test.lua:1:9: syntax error, expected one or more hexadecimal digits after '0x' +]=] + +r = parse(s) +assert(r == e) + +-- ErrDigitDeci +s = [=[ +print(1 + . 0625) +]=] +e = [=[ +test.lua:1:12: syntax error, expected one or more digits after the decimal point +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print(.) +]=] +e = [=[ +test.lua:1:8: syntax error, expected one or more digits after the decimal point +]=] + +r = parse(s) +assert(r == e) + +-- ErrDigitExpo +s = [=[ +print(1.0E) +]=] +e = [=[ +test.lua:1:11: syntax error, expected one or more digits for the exponent +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print(3E) +]=] +e = [=[ +test.lua:1:9: syntax error, expected one or more digits for the exponent +]=] + +r = parse(s) +assert(r == e) + +-- ErrQuote +s = [=[ +local message = "Hello +]=] +e = [=[ +test.lua:2:1: syntax error, unclosed string +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local message = "******* +Welcome +*******" +]=] +e = [=[ +test.lua:2:1: syntax error, unclosed string +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local message = 'Hello +]=] +e = [=[ +test.lua:2:1: syntax error, unclosed string +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +local message = '******* +Welcome +*******' +]=] +e = [=[ +test.lua:2:1: syntax error, unclosed string +]=] + +r = parse(s) +assert(r == e) + +-- ErrHexEsc +s = [=[ +print("\x") +]=] +e = [=[ +test.lua:1:10: syntax error, expected exactly two hexadecimal digits after '\x' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print("\xF") +]=] +e = [=[ +test.lua:1:10: syntax error, expected exactly two hexadecimal digits after '\x' +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print("\xG") +]=] +e = [=[ +test.lua:1:10: syntax error, expected exactly two hexadecimal digits after '\x' +]=] + +r = parse(s) +assert(r == e) + +-- ErrOBraceUEsc +s = [=[ +print("\u3D") +]=] +e = [=[ +test.lua:1:10: syntax error, expected '{' after '\u' +]=] + +r = parse(s) +assert(r == e) + +-- ErrDigitUEsc +s = [=[ +print("\u{}") +]=] +e = [=[ +test.lua:1:11: syntax error, expected one or more hexadecimal digits for the UTF-8 code point +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print("\u{XD}") +]=] +e = [=[ +test.lua:1:11: syntax error, expected one or more hexadecimal digits for the UTF-8 code point +]=] + +r = parse(s) +assert(r == e) + +-- ErrCBraceUEsc +s = [=[ +print("\u{0x3D}") +]=] +e = [=[ +test.lua:1:12: syntax error, expected '}' after the code point +]=] + +r = parse(s) +assert(r == e) + +s = [=[ +print("\u{FFFF Hi") +]=] +e = [=[ +test.lua:1:15: syntax error, expected '}' after the code point +]=] + +r = parse(s) +assert(r == e) + +-- ErrEscSeq +s = [=[ +print("\m") +]=] +e = [=[ +test.lua:1:9: syntax error, invalid escape sequence +]=] + +r = parse(s) +assert(r == e) + +-- ErrCloseLStr +s = [===[ +local message = [==[ + ******* + WELCOME + ******* +]=] +]===] +e = [=[ +test.lua:6:1: syntax error, unclosed long string +]=] + +r = parse(s) +assert(r == e) + +print("> testing issues...") + +-- issue #12 +s = [===[ +gl_f_ct = 0 + +function f() + if gl_f_ct <= 0 then + gl_f_ct=1 + return 1000 + end + return -1000 +end + +print( f("1st call") > f("2nd call") ) +gl_f_ct = 0 +print( f("1st call") < f("2nd call") ) +]===] +e = [=[ +{ `Set{ { `Id "gl_f_ct" }, { `Number "0" } }, `Set{ { `Id "f" }, { `Function{ { }, { `If{ `Op{ "le", `Id "gl_f_ct", `Number "0" }, { `Set{ { `Id "gl_f_ct" }, { `Number "1" } }, `Return{ `Number "1000" } } }, `Return{ `Op{ "unm", `Number "1000" } } } } } }, `Call{ `Id "print", `Op{ "gt", `Call{ `Id "f", `String "1st call" }, `Call{ `Id "f", `String "2nd call" } } }, `Set{ { `Id "gl_f_ct" }, { `Number "0" } }, `Call{ `Id "print", `Op{ "lt", `Call{ `Id "f", `String "1st call" }, `Call{ `Id "f", `String "2nd call" } } } } +]=] + +r = parse(s) +assert(r == e) + +print("OK") diff --git a/SyntaxKit/Tests/Resources/Fixtures/test.rb.txt b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.rb.txt similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/test.rb.txt rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.rb.txt diff --git a/SyntaxKit/Tests/Resources/Fixtures/swifttest.swift.txt b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.swift.txt similarity index 99% rename from SyntaxKit/Tests/Resources/Fixtures/swifttest.swift.txt rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.swift.txt index 12e7413..3e82356 100644 --- a/SyntaxKit/Tests/Resources/Fixtures/swifttest.swift.txt +++ b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.swift.txt @@ -72,4 +72,4 @@ final class Pattern { } self.patterns = patterns } -} \ No newline at end of file +} diff --git a/SyntaxKit/Tests/Resources/Fixtures/textest.tex.txt b/Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.tex.txt similarity index 100% rename from SyntaxKit/Tests/Resources/Fixtures/textest.tex.txt rename to Tests/SyntaxKitTests/Fixtures/TestSyntaxKit.bundle/test.tex.txt diff --git a/SyntaxKit/Tests/IncrementalParsingTests.swift b/Tests/SyntaxKitTests/IncrementalParsingTests.swift similarity index 94% rename from SyntaxKit/Tests/IncrementalParsingTests.swift rename to Tests/SyntaxKitTests/IncrementalParsingTests.swift index 29028fb..cf70adf 100644 --- a/SyntaxKit/Tests/IncrementalParsingTests.swift +++ b/Tests/SyntaxKitTests/IncrementalParsingTests.swift @@ -25,7 +25,7 @@ internal class IncrementalParsingTests: XCTestCase { } func testEdits() { - input = fixture("swifttest.swift", "txt") + input = fixture("test.swift", "txt") parsingOperation = getParsingOperation() parsingOperation?.main() @@ -62,7 +62,7 @@ internal class IncrementalParsingTests: XCTestCase { } func testPerformanceInScope() { - input = fixture("swifttest.swift", "txt") + input = fixture("test.swift", "txt") parsingOperation = getParsingOperation() parsingOperation?.main() @@ -75,7 +75,7 @@ internal class IncrementalParsingTests: XCTestCase { } func testPerformanceEdgeCases() { - input = fixture("swifttest.swift", "txt") + input = fixture("test.swift", "txt") parsingOperation = getParsingOperation() parsingOperation?.main() @@ -92,7 +92,7 @@ internal class IncrementalParsingTests: XCTestCase { private func getParsingOperation() -> AttributedParsingOperation? { if let language = manager.language(withIdentifier: "Source.swift"), let theme = manager.theme(withIdentifier: "tomorrow") { - return AttributedParsingOperation(string: input, language: language, theme: theme) { (results: [(range: NSRange, attributes: Attributes?)], _: AttributedParsingOperation) in + return AttributedParsingOperation(string: input, language: language, theme: theme) { (results: [AttributedParsingOperation.OperationTuple], _: AttributedParsingOperation) in for result in results { if let range = self.totalRange { self.totalRange = NSUnionRange(range, result.range) diff --git a/SyntaxKit/Tests/LanguageTests.swift b/Tests/SyntaxKitTests/LanguageTests.swift similarity index 100% rename from SyntaxKit/Tests/LanguageTests.swift rename to Tests/SyntaxKitTests/LanguageTests.swift diff --git a/SyntaxKit/Tests/ParserTests.swift b/Tests/SyntaxKitTests/ParserTests.swift similarity index 100% rename from SyntaxKit/Tests/ParserTests.swift rename to Tests/SyntaxKitTests/ParserTests.swift diff --git a/SyntaxKit/Tests/PerformanceTests.swift b/Tests/SyntaxKitTests/PerformanceTests.swift similarity index 94% rename from SyntaxKit/Tests/PerformanceTests.swift rename to Tests/SyntaxKitTests/PerformanceTests.swift index 17849c4..af83820 100644 --- a/SyntaxKit/Tests/PerformanceTests.swift +++ b/Tests/SyntaxKitTests/PerformanceTests.swift @@ -27,7 +27,7 @@ internal class PerformanceTests: XCTestCase { } func testLongTexFilePerformance() { - let input = fixture("textest.tex", "txt") + let input = fixture("test.tex", "txt") self.measure { _ = self.parser?.attributedString(for: input) } diff --git a/SyntaxKit/Tests/ScopedStringTests.swift b/Tests/SyntaxKitTests/ScopedStringTests.swift similarity index 100% rename from SyntaxKit/Tests/ScopedStringTests.swift rename to Tests/SyntaxKitTests/ScopedStringTests.swift diff --git a/SyntaxKit/Tests/SwiftBaselineHighlightingTests.swift b/Tests/SyntaxKitTests/SwiftBaselineHighlightingTests.swift similarity index 96% rename from SyntaxKit/Tests/SwiftBaselineHighlightingTests.swift rename to Tests/SyntaxKitTests/SwiftBaselineHighlightingTests.swift index a5be91c..1719d70 100644 --- a/SyntaxKit/Tests/SwiftBaselineHighlightingTests.swift +++ b/Tests/SyntaxKitTests/SwiftBaselineHighlightingTests.swift @@ -30,7 +30,7 @@ internal class SwiftBaselineHighlightingTests: XCTestCase { } func testColors() { - let input = fixture("swifttest.swift", "txt") + let input = fixture("test.swift", "txt") if let string = parser?.attributedString(for: input) { // line comment assertEqualColors(Color(hex: "#93A1A1"), string.attributes(at: 10, effectiveRange: nil)[NSAttributedString.Key.foregroundColor] as? Color) @@ -59,7 +59,7 @@ internal class SwiftBaselineHighlightingTests: XCTestCase { } func testHighlightingPerformance() { - let input = fixture("swifttest.swift", "txt") + let input = fixture("test.swift", "txt") self.measure { _ = self.parser?.attributedString(for: input) } diff --git a/SyntaxKit/Tests/TestHelper.swift b/Tests/SyntaxKitTests/TestHelper.swift similarity index 78% rename from SyntaxKit/Tests/TestHelper.swift rename to Tests/SyntaxKitTests/TestHelper.swift index facf4d6..9569024 100644 --- a/SyntaxKit/Tests/TestHelper.swift +++ b/Tests/SyntaxKitTests/TestHelper.swift @@ -10,22 +10,28 @@ import Foundation @testable import SyntaxKit import XCTest +private let fixturesBundleURL = URL(fileURLWithPath: #file).deletingLastPathComponent().appendingPathComponent("Fixtures").appendingPathComponent("TestSyntaxKit.bundle") + internal func fixture(_ name: String, _ type: String) -> String { - if let path = Bundle(for: LanguageTests.self).path(forResource: name, ofType: type) { - do { - return try String(contentsOfFile: path) - } catch { - return "" - } + guard let testBundle = Bundle(url: fixturesBundleURL) else { + return "" + } + guard let url = testBundle.url(forResource: name, withExtension: type) else { + return "" + } + do { + return try String(contentsOf: url) + } catch { + return "" } - return "" } internal func getBundleManager() -> BundleManager { return BundleManager { identifier, kind in let name = kind == .language ? String(identifier.split(separator: ".")[1]) : identifier let ext = kind == .language ? ".tmLanguage" : ".tmTheme" - return Bundle(for: LanguageTests.self).url(forResource: name.capitalized, withExtension: ext) ?? URL(fileURLWithPath: "") + print("[*] Loading resources for \(name.capitalized)\(ext)") + return Bundle(url: fixturesBundleURL)?.url(forResource: name.capitalized, withExtension: ext) ?? URL(fileURLWithPath: "") } } diff --git a/SyntaxKit/Tests/ThemeTests.swift b/Tests/SyntaxKitTests/ThemeTests.swift similarity index 100% rename from SyntaxKit/Tests/ThemeTests.swift rename to Tests/SyntaxKitTests/ThemeTests.swift diff --git a/Tests/SyntaxKitTests/XCTestManifests.swift b/Tests/SyntaxKitTests/XCTestManifests.swift new file mode 100644 index 0000000..c1f363b --- /dev/null +++ b/Tests/SyntaxKitTests/XCTestManifests.swift @@ -0,0 +1,9 @@ +import XCTest + +#if !canImport(ObjectiveC) +public func allTests() -> [XCTestCaseEntry] { + return [ + testCase(SyntaxKitTests.allTests), + ] +} +#endif