From 726c2411598b06dce9e22ae7e31e66d19881d4e1 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Sun, 18 Oct 2020 22:11:33 -0400 Subject: [PATCH] Fixes #12 - The project is not compatible with Xcode 12 --- .../project.pbxproj | 43 +++++++++++++++---- .../xcschemes/AutocompleteTextField.xcscheme | 24 +++++------ Example/AppDelegate.swift | 2 +- Example/DomainCompletionSource.swift | 2 +- Source/AutocompleteTextField.swift | 2 +- Tests/AutocompleteTextFieldUITests.swift | 20 ++++----- 6 files changed, 58 insertions(+), 35 deletions(-) diff --git a/AutocompleteTextField.xcodeproj/project.pbxproj b/AutocompleteTextField.xcodeproj/project.pbxproj index 5e18c8f..5d7f62f 100644 --- a/AutocompleteTextField.xcodeproj/project.pbxproj +++ b/AutocompleteTextField.xcodeproj/project.pbxproj @@ -227,23 +227,25 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1200; ORGANIZATIONNAME = Mozilla; TargetAttributes = { D31083311EAA7BF500ECF778 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = 43AQ936H96; - LastSwiftMigration = 0820; + LastSwiftMigration = 1200; ProvisioningStyle = Automatic; }; D310834F1EAA7C3600ECF778 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = 43AQ936H96; + LastSwiftMigration = 1200; ProvisioningStyle = Automatic; }; D370686F1EAE68B2000D6BA7 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = 43AQ936H96; + LastSwiftMigration = 1200; ProvisioningStyle = Automatic; TestTargetID = D310834F1EAA7C3600ECF778; }; @@ -251,10 +253,9 @@ }; buildConfigurationList = D310832C1EAA7BF500ECF778 /* Build configuration list for PBXProject "AutocompleteTextField" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, ); @@ -364,20 +365,30 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + 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; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -401,7 +412,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -418,20 +429,30 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + 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; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -449,7 +470,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -473,12 +494,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.AutocompleteTextField; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -494,11 +516,12 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.AutocompleteTextField; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -512,6 +535,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.AutocompleteTextFieldExample; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -525,6 +549,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.AutocompleteTextFieldExample; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -536,6 +561,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.AutocompleteTextFieldUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TEST_TARGET_NAME = AutocompleteTextFieldExample; }; name = Debug; @@ -548,6 +574,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.AutocompleteTextFieldUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TEST_TARGET_NAME = AutocompleteTextFieldExample; }; name = Release; diff --git a/AutocompleteTextField.xcodeproj/xcshareddata/xcschemes/AutocompleteTextField.xcscheme b/AutocompleteTextField.xcodeproj/xcshareddata/xcschemes/AutocompleteTextField.xcscheme index a27545c..a66c4f5 100644 --- a/AutocompleteTextField.xcodeproj/xcshareddata/xcschemes/AutocompleteTextField.xcscheme +++ b/AutocompleteTextField.xcodeproj/xcshareddata/xcschemes/AutocompleteTextField.xcscheme @@ -1,6 +1,6 @@ + + + + @@ -39,17 +48,6 @@ - - - - - - - - Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { return true } } diff --git a/Example/DomainCompletionSource.swift b/Example/DomainCompletionSource.swift index eec34f9..020b0c0 100644 --- a/Example/DomainCompletionSource.swift +++ b/Example/DomainCompletionSource.swift @@ -28,7 +28,7 @@ class DomainCompletionSource: AutocompleteTextFieldCompletionSource { // We don't actually want to match the top-level domain ("com", "org", etc.) by itself, so // so make sure the result includes at least one ".". let range = domainWithDotPrefix.index(range.lowerBound, offsetBy: 1) - let matchedDomain: String = domainWithDotPrefix.substring(from: range) + let matchedDomain = String(domainWithDotPrefix[range...]) if matchedDomain.contains(".") { return matchedDomain + "/" } diff --git a/Source/AutocompleteTextField.swift b/Source/AutocompleteTextField.swift index e7ba6f7..3c6a477 100644 --- a/Source/AutocompleteTextField.swift +++ b/Source/AutocompleteTextField.swift @@ -145,7 +145,7 @@ open class AutocompleteTextField: UITextField, UITextFieldDelegate { guard !completion.isEmpty, completion.lowercased().hasPrefix(text.lowercased()) else { return } // Add the completion suffix to the current text and highlight it. - let completion = completion.substring(from: completion.index(completion.startIndex, offsetBy: text.characters.count)) + let completion = completion[text.endIndex...] let attributed = NSMutableAttributedString(string: text + completion) let range = NSMakeRange((text as NSString).length, (completion as NSString).length) attributed.addAttribute(NSAttributedString.Key.backgroundColor, value: highlightColor, range: range) diff --git a/Tests/AutocompleteTextFieldUITests.swift b/Tests/AutocompleteTextFieldUITests.swift index c428c44..2cbbab4 100644 --- a/Tests/AutocompleteTextFieldUITests.swift +++ b/Tests/AutocompleteTextFieldUITests.swift @@ -22,26 +22,26 @@ class AutocompleteTextFieldUITests: XCTestCase { field.typeText("w") XCTAssertEqual(field.value! as! String, "www.google.com/") - field.typeText(XCUIKeyboardKeyDelete) + field.typeText(XCUIKeyboardKey.delete.rawValue) XCTAssertEqual(field.value! as! String, "w") field.typeText("ww.yah") XCTAssertEqual(field.value! as! String, "www.yahoo.com/") - field.typeText(XCUIKeyboardKeyDelete) + field.typeText(XCUIKeyboardKey.delete.rawValue) XCTAssertEqual(field.value! as! String, "www.yah") - field.typeText(XCUIKeyboardKeyDelete) + field.typeText(XCUIKeyboardKey.delete.rawValue) XCTAssertEqual(field.value! as! String, "www.ya") - field.typeText(XCUIKeyboardKeyDelete) - field.typeText(XCUIKeyboardKeyDelete) - field.typeText(XCUIKeyboardKeyDelete) - field.typeText(XCUIKeyboardKeyDelete) - field.typeText(XCUIKeyboardKeyDelete) - field.typeText(XCUIKeyboardKeyDelete) + field.typeText(XCUIKeyboardKey.delete.rawValue) + field.typeText(XCUIKeyboardKey.delete.rawValue) + field.typeText(XCUIKeyboardKey.delete.rawValue) + field.typeText(XCUIKeyboardKey.delete.rawValue) + field.typeText(XCUIKeyboardKey.delete.rawValue) + field.typeText(XCUIKeyboardKey.delete.rawValue) XCTAssertEqual(field.value! as! String, "") field.typeText("g") XCTAssertEqual(field.value! as! String, "google.com/") field.typeText("z") XCTAssertEqual(field.value! as! String, "gz") - field.typeText(XCUIKeyboardKeyDelete) + field.typeText(XCUIKeyboardKey.delete.rawValue) XCTAssertEqual(field.value! as! String, "g") field.typeText("o") XCTAssertEqual(field.value! as! String, "google.com/")