fix operator detect
This commit is contained in:
parent
a82ff332b4
commit
9b539c94da
|
@ -12,8 +12,24 @@ public struct Function {
|
||||||
public let parameters: [String]
|
public let parameters: [String]
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Function: CustomStringConvertible {
|
extension Function {
|
||||||
public var description: String {
|
private var isOperator: Bool {
|
||||||
parameters.reduce("\(name)(") { $0 + "\($1):" } + ")"
|
Validation.isOperator(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Function: CustomStringConvertible {
|
||||||
|
|
||||||
|
/// operator function naming rules are different from ordinary function, for example:
|
||||||
|
/// func ==> (lhs: String, rhs: Int) -> Bool {
|
||||||
|
/// return lhs == String(rhs)
|
||||||
|
/// }
|
||||||
|
/// name is ==>(_:_:)
|
||||||
|
public var description: String {
|
||||||
|
if isOperator {
|
||||||
|
return parameters.map { _ in "_" }.reduce("\(name)(") { $0 + "\($1):" } + ")"
|
||||||
|
} else {
|
||||||
|
return parameters.reduce("\(name)(") { $0 + "\($1):" } + ")"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
private func ~= (regex: Regex, string: String) -> Bool {
|
||||||
|
return regex.matches(string, options: [.anchored])
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Regex {
|
||||||
|
|
||||||
|
private let regex: NSRegularExpression
|
||||||
|
|
||||||
|
init(regex: NSRegularExpression) {
|
||||||
|
self.regex = regex
|
||||||
|
}
|
||||||
|
|
||||||
|
init(_ pattern: String, options: NSRegularExpression.Options = []) {
|
||||||
|
do {
|
||||||
|
regex = try NSRegularExpression(pattern: pattern, options: options)
|
||||||
|
} catch {
|
||||||
|
preconditionFailure("Invalid regex: \(error)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func matches(_ string: String, options: NSRegularExpression.MatchingOptions = []) -> Bool {
|
||||||
|
return regex.matchesWhole(string, options: options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Regex: ExpressibleByStringLiteral {
|
||||||
|
|
||||||
|
typealias StringLiteralType = String
|
||||||
|
|
||||||
|
init(stringLiteral value: StringLiteralType) {
|
||||||
|
self = Regex(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
init(unicodeScalarLiteral value: String) {
|
||||||
|
self.init(stringLiteral: value)
|
||||||
|
}
|
||||||
|
|
||||||
|
init(extendedGraphemeClusterLiteral value: String) {
|
||||||
|
self.init(stringLiteral: value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Regex: Hashable, Equatable {
|
||||||
|
|
||||||
|
func hash(into hasher: inout Hasher) {
|
||||||
|
hasher.combine(regex)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func == (lhs: Regex, rhs: Regex) -> Bool {
|
||||||
|
return lhs.regex == rhs.regex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private extension NSRegularExpression {
|
||||||
|
|
||||||
|
func matchesWhole(_ string: String, options: NSRegularExpression.MatchingOptions = []) -> Bool {
|
||||||
|
var isMatch = false
|
||||||
|
let length = (string as NSString).length
|
||||||
|
enumerateMatches(in: string, options: options, range: NSRange(location: 0, length: length)) { result, _, stop in
|
||||||
|
guard let match = result else { return }
|
||||||
|
|
||||||
|
if match.range.location == 0 && match.range.length == length {
|
||||||
|
isMatch = true
|
||||||
|
stop.pointee = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isMatch
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
class Validation {
|
||||||
|
|
||||||
|
private enum RegexTypes: Regex {
|
||||||
|
// TODO: This is not the most correct regex, optimized after
|
||||||
|
case notOperator = "^[a-zA-Z]"
|
||||||
|
}
|
||||||
|
|
||||||
|
static func isOperator(_ str: String) -> Bool {
|
||||||
|
return !RegexTypes.notOperator.rawValue.matches(str)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue