dcf5951d10
This patch makes Splash correctly highlight strings in which a value is interpolated next to a delimiter character. The fix is to enable each `Grammar` implementation to decide whether two tokens should be *merged*, which in turn enables `SwiftGrammar` to veto that string interpolation delimiters should be merged with their predecesor.
40 lines
1.5 KiB
Swift
40 lines
1.5 KiB
Swift
/**
|
|
* Splash
|
|
* Copyright (c) John Sundell 2018
|
|
* MIT license - see LICENSE.md
|
|
*/
|
|
|
|
import Foundation
|
|
|
|
/// Protocol used to define the grammar of a language to use for
|
|
/// syntax highlighting. See `SwiftGrammar` for a default implementation
|
|
/// of the Swift language grammar.
|
|
public protocol Grammar {
|
|
/// The set of characters that make up the delimiters that separates
|
|
/// tokens within the language, such as punctuation characters. You
|
|
/// can control whether delimiters should be merged when forming
|
|
/// tokens by implementing the `isDelimiter(mergableWith:)` method.
|
|
var delimiters: CharacterSet { get }
|
|
/// The rules that define the syntax of the language. When tokenizing,
|
|
/// the rules will be iterated over in sequence, and the first rule
|
|
/// that matches a given code segment will be used to determine that
|
|
/// segment's token type.
|
|
var syntaxRules: [SyntaxRule] { get }
|
|
|
|
/// Return whether two delimiters should be merged into a single
|
|
/// token, or whether they should be treated as separate ones.
|
|
/// The delimiters are passed in the order in which they appear
|
|
/// in the source code to be highlighted.
|
|
/// - Parameter delimiterA: The first delimiter
|
|
/// - Parameter delimiterB: The second delimiter
|
|
func isDelimiter(_ delimiterA: Character,
|
|
mergableWith delimiterB: Character) -> Bool
|
|
}
|
|
|
|
public extension Grammar {
|
|
func isDelimiter(_ delimiterA: Character,
|
|
mergableWith delimiterB: Character) -> Bool {
|
|
return true
|
|
}
|
|
}
|