Backtick values which correspond to Swift reserved keywords (#300)

* Backtick for values that correspond to reserved Swift keywords.

* Replace dictionaries with sets.
This commit is contained in:
Travis Prescott 2021-02-11 13:29:23 -08:00 коммит произвёл GitHub
Родитель 67f474d33c
Коммит ee79bce67b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
8 изменённых файлов: 129 добавлений и 93 удалений

1
.gitignore поставляемый
Просмотреть файл

@ -305,3 +305,4 @@ Pods/
.swiftpm/
test/integration/generated/**/**/xcuserdata/
**/Package.resolved
Podfile.lock

Просмотреть файл

@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
0A10427F25D483C4008E472E /* ReservedKeywords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A10427E25D483C4008E472E /* ReservedKeywords.swift */; };
0A22B0DC24D3671D00EC018E /* ClientMethodOptionsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A22B0C224D3301100EC018E /* ClientMethodOptionsViewModel.swift */; };
0A22B0DD24D3671D00EC018E /* EnumerationChoiceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A22B0AC24D2198D00EC018E /* EnumerationChoiceViewModel.swift */; };
0A22B0DE24D3671D00EC018E /* EnumerationFileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A22B05B24CA4CA400EC018E /* EnumerationFileViewModel.swift */; };
@ -331,6 +332,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0A10427E25D483C4008E472E /* ReservedKeywords.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReservedKeywords.swift; sourceTree = "<group>"; };
0A22B02C24C88EB000EC018E /* Podfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Podfile; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
0A22B03424C8964000EC018E /* LanguageShortcut.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageShortcut.swift; sourceTree = "<group>"; };
0A22B03524C8964000EC018E /* FileDestination.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileDestination.swift; sourceTree = "<group>"; };
@ -713,6 +715,7 @@
0A22B07924CB721900EC018E /* String+Extensions.swift */,
0A22B07A24CB721900EC018E /* Encodable+Extensions.swift */,
0A22B07B24CB721900EC018E /* URL+Extensions.swift */,
0A10427E25D483C4008E472E /* ReservedKeywords.swift */,
);
path = Utils;
sourceTree = "<group>";
@ -1333,6 +1336,7 @@
0AA2BA3024F57A5B00CEA1D6 /* ParameterType.swift in Sources */,
0A22B11724D3671E00EC018E /* Protocol.swift in Sources */,
0A22B11824D3671E00EC018E /* Request.swift in Sources */,
0A10427F25D483C4008E472E /* ReservedKeywords.swift in Sources */,
0A22B11924D3671E00EC018E /* Response.swift in Sources */,
0AA2BA1F24EC958600CEA1D6 /* Model.swift in Sources */,
0A22B11A24D3671E00EC018E /* Schema.swift in Sources */,

Просмотреть файл

@ -1,76 +0,0 @@
PODS:
- CNIOAtomics (2.20.2)
- CNIODarwin (2.20.2)
- CNIOLinux (2.20.2)
- CNIOSHA1 (2.20.2)
- PathKit (0.9.2)
- Stencil (0.13.1):
- PathKit (~> 0.9.0)
- SwiftFormat/CLI (0.44.17)
- SwiftLint (0.39.2)
- SwiftNIO (2.20.2):
- CNIOAtomics (= 2.20.2)
- CNIODarwin (= 2.20.2)
- CNIOLinux (= 2.20.2)
- CNIOSHA1 (= 2.20.2)
- SwiftNIOConcurrencyHelpers (= 2.20.2)
- SwiftNIOConcurrencyHelpers (2.20.2):
- CNIOAtomics (= 2.20.2)
- SwiftNIOFoundationCompat (2.20.2):
- SwiftNIO (= 2.20.2)
- Yams (4.0.0)
DEPENDENCIES:
- Stencil (from `https://github.com/stencilproject/Stencil.git`, branch `trim_whitespace`)
- SwiftFormat/CLI
- SwiftLint
- SwiftNIO
- SwiftNIOFoundationCompat
- Yams (from `https://github.com/tjprescott/Yams.git`, branch `CircularReferences`)
SPEC REPOS:
trunk:
- CNIOAtomics
- CNIODarwin
- CNIOLinux
- CNIOSHA1
- PathKit
- SwiftFormat
- SwiftLint
- SwiftNIO
- SwiftNIOConcurrencyHelpers
- SwiftNIOFoundationCompat
EXTERNAL SOURCES:
Stencil:
:branch: trim_whitespace
:git: https://github.com/stencilproject/Stencil.git
Yams:
:branch: CircularReferences
:git: https://github.com/tjprescott/Yams.git
CHECKOUT OPTIONS:
Stencil:
:commit: 8e327cf073ba3b8bf2d1b88f9ad2158b67567063
:git: https://github.com/stencilproject/Stencil.git
Yams:
:commit: 9baf4735fbe4fa45050e0e8b0e03420f2f323f2d
:git: https://github.com/tjprescott/Yams.git
SPEC CHECKSUMS:
CNIOAtomics: 7daf6423d00650104436c5f8a2a341679104ae83
CNIODarwin: 65509d8e6a65a3f3f7bf5b09455cbabd535f48f3
CNIOLinux: 380e2601f1f32f8f32a78437c5f4f5a688205e2b
CNIOSHA1: 5cc4fc5054beeb21c8e0017ad6bf559ce8095c10
PathKit: 273f59a38e3218eb95abd9f6a61730a8bcfd2f06
Stencil: ba3fc96199e0be13ba95c490d042532d784260dc
SwiftFormat: 3b5caa6389b2b9adbc00e133b3ccc8c6e687a6a4
SwiftLint: 22ccbbe3b8008684be5955693bab135e0ed6a447
SwiftNIO: a3c1b37da3e97ce44b3cfafc61c05fe0cac540b8
SwiftNIOConcurrencyHelpers: cd7afc3d1f1ceaf55bbd030e7d1a469d3024db92
SwiftNIOFoundationCompat: 573f44d5b24f7ead54b6b111264c0a420fc6eccf
Yams: 9d49b85824751ee13d31e9ec6617c4dfb9a8c3cd
PODFILE CHECKSUM: b9d02b9d727aa8afdca85686ae509a2235ce05c6
COCOAPODS: 1.9.3

Просмотреть файл

@ -43,7 +43,12 @@ protocol LanguageShortcut {
extension LanguageShortcut {
var name: String {
get {
return language.swift.name.trimmingCharacters(in: .whitespacesAndNewlines)
let name = language.swift.name.trimmingCharacters(in: .whitespacesAndNewlines)
// apply backticks to reserved keywords
if name.isReservedKeyword {
return "`\(name)`"
}
return name
}
set {
language.swift.name = newValue
@ -108,7 +113,14 @@ protocol OptionalLanguageShortcut {
extension OptionalLanguageShortcut {
var name: String? {
get {
return language?.swift.name.trimmingCharacters(in: .whitespacesAndNewlines)
if let name = language?.swift.name.trimmingCharacters(in: .whitespacesAndNewlines) {
// apply backticks to reserved keywords
if name.isReservedKeyword {
return "`\(name)`"
}
return name
}
return nil
}
set {
if let val = newValue {

Просмотреть файл

@ -38,7 +38,7 @@ class OperationGroup: Metadata {
}
var modelName: String {
return name.isReserved ? name + "Operation" : name
return name.isReservedType ? name + "Operation" : name
}
public required init(from decoder: Decoder) throws {

Просмотреть файл

@ -157,7 +157,7 @@ class Schema: Codable, LanguageShortcut {
}
var modelName: String {
return name.isReserved ? name + "Type" : name
return name.isReservedType ? name + "Type" : name
}
var bodyParamStrategy: BodyParamStrategy {

Просмотреть файл

@ -0,0 +1,105 @@
// --------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// The MIT License (MIT)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the ""Software""), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//
// --------------------------------------------------------------------------
import Foundation
private let reservedTypes: Set = [
"Error",
"Int",
"String",
"Bool",
"Enum",
"Array",
"Date",
"Self",
"Any"
]
private let reservedKeywords: Set = [
"associatedtype",
"class",
"deinit",
"enum",
"extension",
"fileprivate",
"func",
"import",
"init",
"inout",
"internal",
"let",
"open",
"operator",
"private",
"protocol",
"public",
"static",
"struct",
"subscript",
"typealias",
"var",
"break",
"case",
"continue",
"default",
"defer",
"do",
"else",
"fallthrough",
"for",
"guard",
"if",
"in",
"repeat",
"return",
"switch",
"where",
"while",
"as",
"catch",
"false",
"is",
"nil",
"rethrows",
"super",
"self",
"throw",
"throws",
"true",
"try"
]
extension String {
/// Returns `true` if the string corresponds to a reserved type
var isReservedType: Bool {
return reservedTypes.contains(self)
}
/// Returns `true` if the string corresponds to a reserved Swift keyword
var isReservedKeyword: Bool {
return reservedKeywords.contains(self)
}
}

Просмотреть файл

@ -76,6 +76,7 @@ extension String {
return components
}
/// Returns the substring without any trailing or leading whitespace.
func trimmed() -> Substring {
guard let firstElementIndex = firstIndex(where: { !$0.isWhitespace }) else {
return Substring("")
@ -85,20 +86,9 @@ extension String {
return self[firstElementIndex ..< lastElementIndex.base]
}
/// Returns the string with the first character lowercased.
var lowercasedFirst: String { return prefix(1).lowercased() + dropFirst() }
/// Returns the string with the first character uppercased.
var uppercasedFirst: String { return prefix(1).uppercased() + dropFirst() }
var isReserved: Bool {
let reserved = [
"Error",
"Int",
"String",
"Bool",
"Enum",
"Array",
"Date"
]
return reserved.contains(self)
}
}