From b4f3a619fdfcb1be4d80555dad91c8e5cc0c47a1 Mon Sep 17 00:00:00 2001 From: Ewan Mellor Date: Thu, 30 Nov 2017 00:36:04 -0800 Subject: [PATCH] [Swift] Make ATNDeserializationOptions a simple struct. The previous code was ported from Java, which resulted in 70 lines of code to hold two bools. Use a struct instead. --- runtime/Swift/Sources/Antlr4/Parser.swift | 8 +-- runtime/Swift/Sources/Antlr4/atn/ATN.swift | 3 +- .../atn/ATNDeserializationOptions.swift | 72 +------------------ .../Sources/Antlr4/atn/ATNDeserializer.swift | 8 +-- 4 files changed, 12 insertions(+), 79 deletions(-) diff --git a/runtime/Swift/Sources/Antlr4/Parser.swift b/runtime/Swift/Sources/Antlr4/Parser.swift index 4962974b3..1f70f2eea 100644 --- a/runtime/Swift/Sources/Antlr4/Parser.swift +++ b/runtime/Swift/Sources/Antlr4/Parser.swift @@ -12,7 +12,7 @@ import Foundation /// This field maps from the serialized ATN string to the deserialized _org.antlr.v4.runtime.atn.ATN_ with /// bypass alternatives. /// -/// - SeeAlso: org.antlr.v4.runtime.atn.ATNDeserializationOptions#isGenerateRuleBypassTransitions() +/// - SeeAlso: `ATNDeserializationOptions.generateRuleBypassTransitions` /// private var bypassAltsAtnCache = [String: ATN]() @@ -421,9 +421,9 @@ open class Parser: Recognizer { return cachedResult } - let deserializationOptions = ATNDeserializationOptions() - try! deserializationOptions.setGenerateRuleBypassTransitions(true) - let result = try! ATNDeserializer(deserializationOptions).deserialize(Array(serializedAtn)) + var opts = ATNDeserializationOptions() + opts.generateRuleBypassTransitions = true + let result = try! ATNDeserializer(opts).deserialize(Array(serializedAtn)) bypassAltsAtnCache[serializedAtn] = result return result } diff --git a/runtime/Swift/Sources/Antlr4/atn/ATN.swift b/runtime/Swift/Sources/Antlr4/atn/ATN.swift index 7422db97f..a963c28ef 100644 --- a/runtime/Swift/Sources/Antlr4/atn/ATN.swift +++ b/runtime/Swift/Sources/Antlr4/atn/ATN.swift @@ -40,8 +40,7 @@ public class ATN { /// /// For lexer ATNs, this maps the rule index to the resulting token type. /// For parser ATNs, this maps the rule index to the generated bypass token - /// type if the - /// _org.antlr.v4.runtime.atn.ATNDeserializationOptions#isGenerateRuleBypassTransitions_ + /// type if the `ATNDeserializationOptions.generateRuleBypassTransitions` /// deserialization option was specified; otherwise, this is `null`. /// public final var ruleToTokenType: [Int]! diff --git a/runtime/Swift/Sources/Antlr4/atn/ATNDeserializationOptions.swift b/runtime/Swift/Sources/Antlr4/atn/ATNDeserializationOptions.swift index 7c5989ccb..135e90557 100644 --- a/runtime/Swift/Sources/Antlr4/atn/ATNDeserializationOptions.swift +++ b/runtime/Swift/Sources/Antlr4/atn/ATNDeserializationOptions.swift @@ -4,73 +4,7 @@ /// can be found in the LICENSE.txt file in the project root. /// - - -/// -/// -/// - Sam Harwell -/// - -public class ATNDeserializationOptions { - - static let defaultOptions: ATNDeserializationOptions = { - - let defaultOptions = ATNDeserializationOptions() - defaultOptions.makeReadOnly() - return defaultOptions - - }() - - - private var readOnly: Bool = false - private var verifyATN: Bool - private var generateRuleBypassTransitions: Bool - - public init() { - self.verifyATN = true - self.generateRuleBypassTransitions = false - } - - public init(_ options: ATNDeserializationOptions) { - self.verifyATN = options.verifyATN - self.generateRuleBypassTransitions = options.generateRuleBypassTransitions - } - - - public static func getDefaultOptions() -> ATNDeserializationOptions { - return defaultOptions - } - - public final func isReadOnly() -> Bool { - return readOnly - } - - public final func makeReadOnly() { - readOnly = true - } - - public final func isVerifyATN() -> Bool { - return verifyATN - } - - public final func setVerifyATN(_ verifyATN: Bool) throws { - try throwIfReadOnly() - self.verifyATN = verifyATN - } - - public final func isGenerateRuleBypassTransitions() -> Bool { - return generateRuleBypassTransitions - } - - public final func setGenerateRuleBypassTransitions(_ generateRuleBypassTransitions: Bool) throws { - try throwIfReadOnly() - self.generateRuleBypassTransitions = generateRuleBypassTransitions - } - - internal func throwIfReadOnly() throws { - if isReadOnly() { - throw ANTLRError.illegalState(msg: "This object is readonly") - - } - } +public struct ATNDeserializationOptions { + public var verifyATN = true + public var generateRuleBypassTransitions = false } diff --git a/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift b/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift index 7e65864f9..65b02efc6 100644 --- a/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift +++ b/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift @@ -60,7 +60,7 @@ public class ATNDeserializer { private let deserializationOptions: ATNDeserializationOptions public init(_ deserializationOptions: ATNDeserializationOptions? = nil) { - self.deserializationOptions = deserializationOptions ?? ATNDeserializationOptions.getDefaultOptions() + self.deserializationOptions = deserializationOptions ?? ATNDeserializationOptions() } /// @@ -667,13 +667,13 @@ public class ATNDeserializer { private func finalizeATN(_ atn: ATN) throws { markPrecedenceDecisions(atn) - if deserializationOptions.isVerifyATN() { + if deserializationOptions.verifyATN { try verifyATN(atn) } - if deserializationOptions.isGenerateRuleBypassTransitions() && atn.grammarType == ATNType.parser { + if deserializationOptions.generateRuleBypassTransitions && atn.grammarType == ATNType.parser { try generateRuleBypassTransitions(atn) - if deserializationOptions.isVerifyATN() { + if deserializationOptions.verifyATN { // reverify after modification try verifyATN(atn) }