#!/usr/bin/env python3 """ Swift Language Detection Patterns Comprehensive regex patterns for detecting Swift code including: - Pure Swift syntax (structs, protocols, extensions, optionals, generics) - iOS/UIKit patterns (UIViewController, IBOutlet, lifecycle methods) - macOS/AppKit patterns (NSViewController, NSWindow, AppKit classes) - SwiftUI patterns (@State, @Binding, View protocol, modifiers) - Combine framework patterns (Publishers, Subscribers) - Swift Concurrency (async/await, actors, Tasks) - Foundation Models (iOS/macOS 26+: @Generable, LanguageModelSession, SystemLanguageModel) Weight Scale: - 5: Unique to Swift (no other language uses this) - 4: Strong Swift indicator (rarely seen elsewhere) - 3: Common Swift pattern (moderate indicator) - 2: Moderate indicator (seen in some other languages) - 1: Weak indicator (commonly seen elsewhere) Author: iLearn Project (Swift Support Extension) """ import logging logger = logging.getLogger(__name__) SWIFT_PATTERNS: dict[str, list[tuple[str, int]]] = { "swift": [ # ===== PURE SWIFT SYNTAX (Weight 4-5) ===== # Function declarations with return type arrow (Swift-specific syntax) (r"\bfunc\s+\w+\s*\([^)]*\)\s*->", 5), # func foo() -> ReturnType (r"\bfunc\s+\w+\s*\([^)]*\)\s*\{", 4), # func foo() { # Struct/class/enum declarations (r"\bstruct\s+\w+\s*:", 5), # struct Foo: Protocol (r"\bstruct\s+\w+\s*\{", 4), # struct Foo { (r"\bclass\s+\w+\s*:\s*\w+", 4), # class Foo: SuperClass (r"\benum\s+\w+\s*:\s*\w+", 4), # enum Foo: String (r"\benum\s+\w+\s*\{", 3), # enum Foo { # Protocol declarations (weight 5 - Swift-specific in this context) (r"\bprotocol\s+\w+\s*\{", 5), # protocol Foo { (r"\bprotocol\s+\w+\s*:\s*\w+", 5), # protocol Foo: AnotherProtocol # Extension (weight 5 - very Swift-specific syntax) (r"\bextension\s+\w+\s*:", 5), # extension Foo: Protocol (r"\bextension\s+\w+\s*\{", 5), # extension Foo { (r"\bextension\s+\w+\s*where\s+", 5), # extension Foo where T: Equatable # Property wrappers (weight 5 - unique to Swift) (r"@\w+\s+var\s+\w+", 4), # @Something var foo (r"@propertyWrapper", 5), # @propertyWrapper attribute # Optionals and unwrapping (weight 5 - unique to Swift) (r"\bguard\s+let\s+\w+\s*=", 5), # guard let foo = (r"\bguard\s+var\s+\w+\s*=", 5), # guard var foo = (r"\bif\s+let\s+\w+\s*=", 5), # if let foo = (r"\bif\s+var\s+\w+\s*=", 5), # if var foo = (r"\bguard\s+.*\s+else\s*\{", 4), # guard ... else { (r"\w+\?\.", 4), # foo?.bar (optional chaining) (r"\w+!\.\w+", 4), # foo!.bar (forced unwrap) (r"\?\?", 4), # nil coalescing ?? # Closures (weight 4-5 - Swift closure syntax) (r"\{\s*\([^)]*\)\s*in\b", 5), # { (params) in (r"\{\s*\$0", 4), # { $0 (shorthand argument) (r"\$[0-9]+", 3), # $0, $1, etc. # Type annotations (weight 3-4) (r":\s*\[\w+\]", 4), # : [Type] (array type) (r":\s*\[\w+\s*:\s*\w+\]", 4), # : [Key: Value] (dictionary type) (r":\s*\w+\?", 4), # : Type? (optional type) (r"->\s*\w+\?", 4), # -> Type? (optional return) # Keywords (weight 2-4) (r"\blet\s+\w+\s*:", 3), # let foo: Type (r"\bvar\s+\w+\s*:", 3), # var foo: Type (r"\blet\s+\w+\s*=", 2), # let foo = (also JS const) (r"\bself\.\w+", 3), # self.property (also Python) (r"\bSelf\b", 4), # Self (Swift-specific) # Imports (weight 2-5 based on specificity) (r"\bimport\s+Foundation", 4), # import Foundation (r"\bimport\s+\w+", 2), # import Something # Access modifiers (weight 3-5) (r"\bprivate\s*\(set\)", 5), # private(set) - Swift-specific (r"\bfileprivate\s+", 5), # fileprivate - Swift-only keyword (r"\binternal\s+", 2), # internal (also C#) (r"\bopen\s+class", 4), # open class (Swift-specific) # Error handling (weight 4-5) (r"\bthrows\s*->", 5), # throws -> ReturnType (r"\bthrows\s*\{", 4), # func foo() throws { (r"\brethrows\b", 5), # rethrows keyword (Swift-only) (r"\btry\?\s+", 5), # try? (optional try - Swift) (r"\btry!\s+", 5), # try! (forced try - Swift) (r"\bdo\s*\{", 3), # do { (try block) (r"\bcatch\s+\w+", 3), # catch error # Generics (weight 3-4) (r"<\w+:\s*\w+>", 4), # (r"\bwhere\s+\w+\s*:", 4), # where T: Protocol # NOTE: 'some' and 'any' require capitalized type names to avoid matching # English prose ("some example", "any variable"). Swift types are capitalized # by convention (View, Protocol, etc.). The (?-i:[A-Z]) syntax enforces # case-sensitive matching for the first letter despite global IGNORECASE flag. (r"\bsome\s+(?-i:[A-Z])\w+", 5), # some Protocol (opaque type - Swift 5.1+) (r"\bany\s+(?-i:[A-Z])\w+", 4), # any Protocol (existential type - Swift 5.6+) # Actors and concurrency (weight 5 - Swift 5.5+) (r"\bactor\s+\w+", 5), # actor MyActor (r"\basync\s+throws", 5), # async throws (Swift-specific combo) (r"\basync\s+func", 5), # async func (r"\bawait\s+\w+", 3), # await (also JS/Python/C#) (r"\bTask\s*\{", 4), # Task { (Swift concurrency) (r"\bTask\.\w+", 4), # Task.detached, Task.sleep (r"@MainActor", 5), # @MainActor attribute (r"@Sendable", 5), # @Sendable attribute (r"\bnonisolated\b", 5), # nonisolated keyword # Result builders (weight 5) (r"@resultBuilder", 5), # @resultBuilder attribute # Type aliases and associated types (weight 5) (r"\btypealias\s+\w+\s*=", 5), # typealias Foo = Bar (r"\bassociatedtype\s+\w+", 5), # associatedtype Element # Print function (r"\bprint\s*\(", 2), # print() (also Python) # String interpolation (weight 4) (r"\\\(\w+", 4), # \(variable) interpolation # Memory management (weight 4-5) (r"\bweak\s+var", 5), # weak var (r"\bunowned\s+", 5), # unowned (Swift-specific) (r"\[weak\s+self\]", 5), # [weak self] capture list (r"\[unowned\s+self\]", 5), # [unowned self] capture list (r"\blazy\s+var", 4), # lazy var # ===== iOS/UIKit PATTERNS (Weight 4-5) ===== (r"\bimport\s+UIKit", 5), # import UIKit (r"\bUIViewController\b", 5), # UIViewController class (r"\bUIView\b", 4), # UIView class (r"\bUITableView\b", 5), # UITableView (r"\bUICollectionView\b", 5), # UICollectionView (r"\bUINavigationController\b", 5), # UINavigationController (r"\bUITabBarController\b", 5), # UITabBarController (r"\bUIButton\b", 4), # UIButton (r"\bUILabel\b", 4), # UILabel (r"\bUIImageView\b", 4), # UIImageView (r"\bUITextField\b", 4), # UITextField (r"\bUITextView\b", 4), # UITextView (r"\bUIStackView\b", 4), # UIStackView (r"\bUIScrollView\b", 4), # UIScrollView (r"\bUIAlertController\b", 5), # UIAlertController (r"\bUIApplication\b", 5), # UIApplication (r"\bUIWindow\b", 4), # UIWindow (r"\bUIScreen\b", 4), # UIScreen (r"\bUIDevice\b", 5), # UIDevice # UIKit Lifecycle methods (weight 5) (r"\bviewDidLoad\s*\(\s*\)", 5), # viewDidLoad() (r"\bviewWillAppear\s*\(", 5), # viewWillAppear(_:) (r"\bviewDidAppear\s*\(", 5), # viewDidAppear(_:) (r"\bviewWillDisappear\s*\(", 5), # viewWillDisappear(_:) (r"\bviewDidDisappear\s*\(", 5), # viewDidDisappear(_:) (r"\bviewWillLayoutSubviews\s*\(\)", 5), # viewWillLayoutSubviews() (r"\bviewDidLayoutSubviews\s*\(\)", 5), # viewDidLayoutSubviews() # Interface Builder outlets/actions (weight 5) (r"@IBOutlet", 5), # @IBOutlet (r"@IBAction", 5), # @IBAction (r"@IBDesignable", 5), # @IBDesignable (r"@IBInspectable", 5), # @IBInspectable # UIKit delegates and datasources (weight 5) (r"\bUITableViewDelegate\b", 5), (r"\bUITableViewDataSource\b", 5), (r"\bUICollectionViewDelegate\b", 5), (r"\bUICollectionViewDataSource\b", 5), (r"\bUITextFieldDelegate\b", 5), (r"\bUIScrollViewDelegate\b", 5), # Auto Layout (weight 4-5) (r"\bNSLayoutConstraint\b", 5), # NSLayoutConstraint (r"\.constraint\(", 4), # constraint methods (r"\btranslatesAutoresizingMaskIntoConstraints", 5), (r"NSLayoutConstraint\.activate", 5), # GCD / DispatchQueue (weight 5) (r"\bDispatchQueue\b", 5), # DispatchQueue (r"\bDispatchQueue\.main", 5), # DispatchQueue.main (r"\bDispatchQueue\.global", 5), # DispatchQueue.global (r"\.async\s*\{", 4), # .async { (r"\.sync\s*\{", 4), # .sync { # ===== macOS/AppKit PATTERNS (Weight 4-5) ===== (r"\bimport\s+AppKit", 5), # import AppKit (r"\bimport\s+Cocoa", 5), # import Cocoa (r"\bNSViewController\b", 5), # NSViewController (r"\bNSView\b", 4), # NSView (r"\bNSWindow\b", 5), # NSWindow (r"\bNSWindowController\b", 5), # NSWindowController (r"\bNSApplication\b", 5), # NSApplication (r"\bNSTableView\b", 5), # NSTableView (r"\bNSOutlineView\b", 5), # NSOutlineView (r"\bNSCollectionView\b", 5), # NSCollectionView (r"\bNSButton\b", 4), # NSButton (r"\bNSTextField\b", 4), # NSTextField (r"\bNSTextView\b", 4), # NSTextView (r"\bNSImageView\b", 4), # NSImageView (r"\bNSStackView\b", 4), # NSStackView (r"\bNSScrollView\b", 4), # NSScrollView (r"\bNSSplitView\b", 5), # NSSplitView (r"\bNSTabView\b", 5), # NSTabView (r"\bNSMenu\b", 5), # NSMenu (r"\bNSMenuItem\b", 5), # NSMenuItem (r"\bNSToolbar\b", 5), # NSToolbar (r"\bNSAlert\b", 5), # NSAlert (r"\bNSPanel\b", 5), # NSPanel (r"\bNSOpenPanel\b", 5), # NSOpenPanel (r"\bNSSavePanel\b", 5), # NSSavePanel (r"\bNSWorkspace\b", 5), # NSWorkspace (r"\bNSRunningApplication\b", 5), # NSRunningApplication (r"\bNSScreen\b", 4), # NSScreen (r"\bNSColor\b", 4), # NSColor (r"\bNSFont\b", 4), # NSFont (r"\bNSImage\b", 4), # NSImage (r"\bNSBezierPath\b", 5), # NSBezierPath (r"\bNSSound\b", 5), # NSSound (r"\bNSEvent\b", 5), # NSEvent (r"\bNSResponder\b", 5), # NSResponder (r"\bNSPasteboard\b", 5), # NSPasteboard (r"\bNSStatusBar\b", 5), # NSStatusBar (r"\bNSStatusItem\b", 5), # NSStatusItem # macOS Lifecycle methods (weight 5) # Note: viewDidLoad() is defined in the UIKit section above since it's shared # between iOS (UIViewController) and macOS (NSViewController) (r"\bviewWillAppear\s*\(\)", 5), # NSViewController viewWillAppear (r"\bviewDidAppear\s*\(\)", 5), # NSViewController viewDidAppear (r"\bawakeFromNib\s*\(\)", 5), # awakeFromNib() (r"\bapplicationDidFinishLaunching", 5), # NSApplicationDelegate (r"\bapplicationWillTerminate", 5), # NSApplicationDelegate (r"\bwindowDidLoad\s*\(\)", 5), # NSWindowController # macOS delegates (weight 5) (r"\bNSTableViewDelegate\b", 5), (r"\bNSTableViewDataSource\b", 5), (r"\bNSOutlineViewDelegate\b", 5), (r"\bNSOutlineViewDataSource\b", 5), (r"\bNSWindowDelegate\b", 5), (r"\bNSApplicationDelegate\b", 5), (r"\bNSTextFieldDelegate\b", 5), (r"\bNSTextViewDelegate\b", 5), # ===== SwiftUI PATTERNS (Weight 5) ===== (r"\bimport\s+SwiftUI", 5), # import SwiftUI (r"\bstruct\s+\w+\s*:\s*View", 5), # struct Foo: View (r"\bvar\s+body\s*:\s*some\s+View", 5), # var body: some View (r":\s*some\s+View", 5), # : some View # SwiftUI property wrappers (weight 5 - unique to SwiftUI) (r"@State\s+", 5), # @State var (r"@Binding\s+", 5), # @Binding var (r"@Published\s+", 5), # @Published var (r"@ObservedObject\s+", 5), # @ObservedObject var (r"@StateObject\s+", 5), # @StateObject var (r"@EnvironmentObject\s+", 5), # @EnvironmentObject var (r"@Environment\s*\(", 5), # @Environment(\.keyPath) (r"@FetchRequest\s*\(", 5), # @FetchRequest (Core Data) (r"@AppStorage\s*\(", 5), # @AppStorage (r"@SceneStorage\s*\(", 5), # @SceneStorage (r"@FocusState\s+", 5), # @FocusState (r"@FocusedBinding\s*\(", 5), # @FocusedBinding (r"@Observable\b", 5), # @Observable (Swift 5.9+) (r"@Bindable\s+", 5), # @Bindable (Swift 5.9+) (r"@Query\s*\(", 5), # @Query (SwiftData) (r"@Model\b", 5), # @Model (SwiftData) (r"@ViewBuilder", 5), # @ViewBuilder # SwiftUI Views (weight 4-5) (r"\bText\s*\(", 4), # Text("Hello") (r"\bImage\s*\(", 3), # Image(systemName:) (r"\bButton\s*\(", 3), # Button("Label") { } (r"\bVStack\s*[\(\{]", 5), # VStack { } or VStack(alignment:) (r"\bHStack\s*[\(\{]", 5), # HStack { } (r"\bZStack\s*[\(\{]", 5), # ZStack { } (r"\bList\s*[\(\{]", 4), # List { } (r"\bForEach\s*\(", 4), # ForEach(items) { } (r"\bNavigationView\s*\{", 5), # NavigationView { } (r"\bNavigationStack\s*[\(\{]", 5), # NavigationStack { } (iOS 16+) (r"\bNavigationSplitView\s*[\(\{]", 5), # NavigationSplitView (macOS/iPad) (r"\bNavigationLink\s*\(", 5), # NavigationLink (r"\bTabView\s*[\(\{]", 5), # TabView { } (r"\bScrollView\s*[\(\{]", 5), # ScrollView { } (r"\bLazyVStack\s*[\(\{]", 5), # LazyVStack { } (r"\bLazyHStack\s*[\(\{]", 5), # LazyHStack { } (r"\bLazyVGrid\s*\(", 5), # LazyVGrid (r"\bLazyHGrid\s*\(", 5), # LazyHGrid (r"\bGrid\s*[\(\{]", 4), # Grid { } (iOS 16+) (r"\bGridRow\s*[\(\{]", 5), # GridRow { } (r"\bGeometryReader\s*\{", 5), # GeometryReader { } (r"\bSpacer\s*\(\)", 5), # Spacer() (r"\bDivider\s*\(\)", 5), # Divider() (r"\bForm\s*\{", 4), # Form { } (r"\bSection\s*[\(\{]", 4), # Section { } (r"\bGroup\s*\{", 4), # Group { } (r"\bGroupBox\s*[\(\{]", 5), # GroupBox { } (r"\bDisclosureGroup\s*\(", 5), # DisclosureGroup (r"\bOutlineGroup\s*\(", 5), # OutlineGroup (r"\bToggle\s*\(", 4), # Toggle (r"\bPicker\s*\(", 4), # Picker (r"\bSlider\s*\(", 4), # Slider (r"\bStepper\s*\(", 4), # Stepper (r"\bDatePicker\s*\(", 5), # DatePicker (r"\bColorPicker\s*\(", 5), # ColorPicker (r"\bProgressView\s*[\(\{]", 5), # ProgressView (r"\bLabel\s*\(", 4), # Label (r"\bLink\s*\(", 4), # Link (r"\bMenu\s*[\(\{]", 4), # Menu (r"\bContextMenu\s*\{", 5), # ContextMenu (r"\bToolbar\s*\{", 5), # Toolbar (r"\bToolbarItem\s*\(", 5), # ToolbarItem (r"\bCanvas\s*\{", 5), # Canvas (r"\bTimelineView\s*\(", 5), # TimelineView (r"\bShareLink\s*\(", 5), # ShareLink (iOS 16+) (r"\bPhotosPicker\s*\(", 5), # PhotosPicker (r"\bTextField\s*\(", 4), # TextField (r"\bSecureField\s*\(", 5), # SecureField (r"\bTextEditor\s*\(", 5), # TextEditor # SwiftUI Modifiers (weight 4-5) (r"\.padding\s*\(", 4), # .padding() (r"\.frame\s*\(", 4), # .frame(width:height:) (r"\.foregroundColor\s*\(", 5), # .foregroundColor(.red) (r"\.foregroundStyle\s*\(", 5), # .foregroundStyle (iOS 15+) (r"\.background\s*\(", 3), # .background() (r"\.cornerRadius\s*\(", 4), # .cornerRadius() (r"\.clipShape\s*\(", 5), # .clipShape() (r"\.shadow\s*\(", 3), # .shadow() (r"\.font\s*\(", 3), # .font(.title) (r"\.fontWeight\s*\(", 4), # .fontWeight() (r"\.bold\s*\(\)", 4), # .bold() (r"\.italic\s*\(\)", 4), # .italic() (r"\.onAppear\s*\{", 5), # .onAppear { } (r"\.onDisappear\s*\{", 5), # .onDisappear { } (r"\.onTapGesture\s*\{", 5), # .onTapGesture { } (r"\.gesture\s*\(", 4), # .gesture() (r"\.sheet\s*\(", 5), # .sheet(isPresented:) (r"\.fullScreenCover\s*\(", 5), # .fullScreenCover() (r"\.popover\s*\(", 5), # .popover() (r"\.alert\s*\(", 4), # .alert() (r"\.confirmationDialog\s*\(", 5), # .confirmationDialog() (r"\.navigationTitle\s*\(", 5), # .navigationTitle() (r"\.navigationBarTitleDisplayMode", 5), # .navigationBarTitleDisplayMode (r"\.toolbar\s*\{", 5), # .toolbar { } (r"\.toolbarBackground\s*\(", 5), # .toolbarBackground() (r"\.environmentObject\s*\(", 5), # .environmentObject() (r"\.environment\s*\(", 4), # .environment() (r"\.task\s*\{", 5), # .task { } (async) (r"\.refreshable\s*\{", 5), # .refreshable { } (r"\.searchable\s*\(", 5), # .searchable() (r"\.onChange\s*\(", 5), # .onChange(of:) (r"\.onSubmit\s*\{", 5), # .onSubmit { } (r"\.focused\s*\(", 5), # .focused() (r"\.disabled\s*\(", 4), # .disabled() (r"\.opacity\s*\(", 3), # .opacity() (r"\.offset\s*\(", 4), # .offset() (r"\.rotationEffect\s*\(", 5), # .rotationEffect() (r"\.scaleEffect\s*\(", 5), # .scaleEffect() (r"\.animation\s*\(", 4), # .animation() (r"\.transition\s*\(", 5), # .transition() (r"\.withAnimation\s*\{", 5), # withAnimation { } (r"\.matchedGeometryEffect\s*\(", 5), # .matchedGeometryEffect() (r"\.contentShape\s*\(", 5), # .contentShape() (r"\.allowsHitTesting\s*\(", 5), # .allowsHitTesting() (r"\.overlay\s*\(", 4), # .overlay() (r"\.mask\s*\(", 4), # .mask() (r"\.zIndex\s*\(", 4), # .zIndex() (r"\.layoutPriority\s*\(", 5), # .layoutPriority() (r"\.preference\s*\(", 5), # .preference() (r"\.onPreferenceChange\s*\(", 5), # .onPreferenceChange() (r"\.coordinateSpace\s*\(", 5), # .coordinateSpace() (r"\.ignoresSafeArea\s*\(", 5), # .ignoresSafeArea() (r"\.safeAreaInset\s*\(", 5), # .safeAreaInset() (r"\.listStyle\s*\(", 5), # .listStyle() (r"\.buttonStyle\s*\(", 5), # .buttonStyle() (r"\.textFieldStyle\s*\(", 5), # .textFieldStyle() (r"\.pickerStyle\s*\(", 5), # .pickerStyle() (r"\.labelStyle\s*\(", 5), # .labelStyle() (r"\.toggleStyle\s*\(", 5), # .toggleStyle() (r"\.presentationDetents\s*\(", 5), # .presentationDetents() (iOS 16+) (r"\.interactiveDismissDisabled\s*\(", 5), # .interactiveDismissDisabled() # SwiftUI Scene types (macOS/multi-window) (r"\bWindowGroup\s*\{", 5), # WindowGroup { } (r"\bWindow\s*\(", 5), # Window (macOS) (r"\bSettings\s*\{", 5), # Settings { } (macOS) (r"\bMenuBarExtra\s*\(", 5), # MenuBarExtra (macOS) (r"\bDocumentGroup\s*\(", 5), # DocumentGroup (r":\s*App\s*\{", 5), # : App { (r"@main\b", 5), # @main (r"var\s+body:\s*some\s+Scene", 5), # var body: some Scene # ===== Combine Framework (Weight 5) ===== (r"\bimport\s+Combine", 5), # import Combine (r"\bAnyPublisher\b", 5), # AnyPublisher (r"\bPassthroughSubject\b", 5), # PassthroughSubject (r"\bCurrentValueSubject\b", 5), # CurrentValueSubject (r"\bPublisher\b", 4), # Publisher protocol (r"\bSubscriber\b", 4), # Subscriber protocol (r"\.sink\s*\{", 5), # .sink { } (r"\.receive\s*\(on:\s*", 5), # .receive(on: RunLoop.main) (r"\bAnyCancellable\b", 5), # AnyCancellable (r"\.store\s*\(in:\s*&", 5), # .store(in: &cancellables) (r"\.eraseToAnyPublisher\s*\(\)", 5), # .eraseToAnyPublisher() (r"\.map\s*\{\s*\$0", 5), # .map { $0 (Combine map) (r"\.flatMap\s*\{", 4), # .flatMap { (r"\.compactMap\s*\{", 4), # .compactMap { (r"\.filter\s*\{", 3), # .filter { (r"\.debounce\s*\(", 5), # .debounce() (r"\.throttle\s*\(", 5), # .throttle() (r"\.removeDuplicates\s*\(", 5), # .removeDuplicates() (r"\.combineLatest\s*\(", 5), # .combineLatest() (r"\.merge\s*\(", 4), # .merge() (r"\.zip\s*\(", 3), # .zip() (r"@Published\s+var", 5), # @Published var # ===== Codable/JSON (Weight 5) ===== (r"\bCodable\b", 5), # Codable protocol (r"\bEncodable\b", 4), # Encodable protocol (r"\bDecodable\b", 4), # Decodable protocol (r"\bJSONDecoder\s*\(\)", 5), # JSONDecoder() (r"\bJSONEncoder\s*\(\)", 5), # JSONEncoder() (r"\bCodingKeys\b", 5), # CodingKeys enum (r"\bPropertyListDecoder\b", 5), # PropertyListDecoder (r"\bPropertyListEncoder\b", 5), # PropertyListEncoder # ===== Core Data (Weight 5) ===== (r"\bimport\s+CoreData", 5), # import CoreData (r"\bNSManagedObject\b", 5), # NSManagedObject (r"\bNSManagedObjectContext\b", 5), # NSManagedObjectContext (r"\bNSPersistentContainer\b", 5), # NSPersistentContainer (r"\bNSFetchRequest\b", 5), # NSFetchRequest (r"\b@FetchRequest\b", 5), # @FetchRequest property wrapper (r"\bNSPredicate\b", 5), # NSPredicate (r"\bNSSortDescriptor\b", 5), # NSSortDescriptor # ===== SwiftData (Weight 5 - iOS 17+) ===== (r"\bimport\s+SwiftData", 5), # import SwiftData (r"@Model\s+", 5), # @Model class (r"@Attribute\s*\(", 5), # @Attribute (r"@Relationship\s*\(", 5), # @Relationship (r"\bModelContext\b", 5), # ModelContext (r"\bModelContainer\b", 5), # ModelContainer # ===== Common Apple Frameworks (Weight 4-5) ===== (r"\bimport\s+MapKit", 5), # import MapKit (r"\bimport\s+CoreLocation", 5), # import CoreLocation (r"\bimport\s+AVFoundation", 5), # import AVFoundation (r"\bimport\s+Photos", 5), # import Photos (r"\bimport\s+PhotosUI", 5), # import PhotosUI (r"\bimport\s+HealthKit", 5), # import HealthKit (r"\bimport\s+StoreKit", 5), # import StoreKit (r"\bimport\s+CloudKit", 5), # import CloudKit (r"\bimport\s+UserNotifications", 5), # import UserNotifications (r"\bimport\s+EventKit", 5), # import EventKit (r"\bimport\s+Contacts", 5), # import Contacts (r"\bimport\s+MessageUI", 5), # import MessageUI (r"\bimport\s+SafariServices", 5), # import SafariServices (r"\bimport\s+WebKit", 5), # import WebKit (r"\bimport\s+PDFKit", 5), # import PDFKit (r"\bimport\s+QuickLook", 5), # import QuickLook (r"\bimport\s+AuthenticationServices", 5), # import AuthenticationServices (r"\bimport\s+LocalAuthentication", 5), # import LocalAuthentication (r"\bimport\s+GameKit", 5), # import GameKit (r"\bimport\s+SpriteKit", 5), # import SpriteKit (r"\bimport\s+SceneKit", 5), # import SceneKit (r"\bimport\s+RealityKit", 5), # import RealityKit (r"\bimport\s+ARKit", 5), # import ARKit (r"\bimport\s+Metal", 5), # import Metal (r"\bimport\s+CoreML", 5), # import CoreML (r"\bimport\s+Vision", 5), # import Vision (r"\bimport\s+NaturalLanguage", 5), # import NaturalLanguage (r"\bimport\s+Speech", 5), # import Speech (r"\bimport\s+CoreBluetooth", 5), # import CoreBluetooth (r"\bimport\s+NetworkExtension", 5), # import NetworkExtension (r"\bimport\s+WidgetKit", 5), # import WidgetKit (r"\bimport\s+ActivityKit", 5), # import ActivityKit (r"\bimport\s+AppIntents", 5), # import AppIntents # ===== Foundation Models Framework (iOS/macOS/visionOS 26+) ===== # Apple's on-device AI/ML framework for language model interactions # Import statement (r"\bimport\s+FoundationModels", 5), # import FoundationModels # Core classes (r"\bSystemLanguageModel\b", 5), # Main model class (r"\bLanguageModelSession\b", 5), # Session for interactions (r"\bLanguageModelFeedback\b", 5), # Feedback reporting # Key structs (r"\bInstructionsBuilder\b", 5), # Result builder for instructions (r"\bPromptBuilder\b", 5), # Result builder for prompts (r"\bGenerationOptions\b", 5), # Controls generation behavior (r"\bGeneratedContent\b", 5), # Structured output type (r"\bGenerationID\b", 5), # Unique generation identifier (r"\bGenerationSchema\b", 5), # Schema for guided generation (r"\bDynamicGenerationSchema\b", 5), # Runtime schema definition (r"\bGenerationGuide\b", 5), # Value constraint guides # Macros (unique to FoundationModels) (r"@Generable\b", 5), # Guided generation macro (r"@Generable\s*\(\s*description:", 5), # @Generable with description (r"@Guide\b", 5), # Property constraint macro (r"@Guide\s*\(\s*description:", 5), # @Guide with description # Key protocols (r"\bGenerable\b", 4), # Core protocol (also common word) (r"\bInstructionsRepresentable\b", 5), # Instructions protocol (r"\bPromptRepresentable\b", 5), # Prompt protocol (r"\bConvertibleFromGeneratedContent\b", 5), # Content conversion (r"\bConvertibleToGeneratedContent\b", 5), # Content conversion # Nested types (SystemLanguageModel.*) (r"\bSystemLanguageModel\.default\b", 5), # Default model access (r"\bSystemLanguageModel\.UseCase\b", 5), # Use case type (r"\bSystemLanguageModel\.Guardrails\b", 5), # Safety guardrails (r"\bSystemLanguageModel\.Adapter\b", 5), # Custom adapters (r"\bSystemLanguageModel\.Availability\b", 5), # Availability enum # Key methods (r"\.respond\s*\(to:", 4), # Primary response method (r"\.respond\s*\([^)]*generating:", 5), # Guided generation response (r"\.streamResponse\s*\(", 4), # Streaming response (r"\.prewarm\s*\(", 5), # Session prewarming (r"\.logFeedbackAttachment\s*\(", 5), # Feedback logging # Transcript types (r"\bTranscript\.Entry\b", 5), # Transcript entry (r"\bTranscript\.Segment\b", 5), # Transcript segment (r"\bTranscript\.ToolCall\b", 5), # Tool call record (r"\bTranscript\.ToolOutput\b", 5), # Tool output record (r"\bTranscript\.Response\b", 5), # Response record # Error types and availability (r"\bGenerationError\b", 4), # Generation error type (r"\bToolCallError\b", 5), # Tool execution error (r"\.exceededContextWindowSize\b", 5), # Context window error (r"\.guardrailViolation\b", 5), # Safety guardrail error (r"\.appleIntelligenceNotEnabled\b", 5), # Availability reason (r"\.deviceNotEligible\b", 5), # Device eligibility (r"\.modelNotReady\b", 5), # Model readiness # Use cases and guardrails (r"\.contentTagging\b", 5), # Content tagging use case (r"\.permissiveContentTransformations\b", 5), # Guardrail setting # Common usage patterns (r"LanguageModelSession\s*\(\s*instructions:", 5), # Session init (r"for\s+try\s+await.*streamResponse", 5), # Streaming iteration (r"\.PartiallyGenerated\b", 5), # Partial generation type ], } def _validate_patterns(patterns: dict[str, list[tuple[str, int]]]) -> None: """ Validate pattern structure at module load time. Ensures all patterns follow the expected format: - Each pattern is a (regex_string, weight) tuple - Weight is an integer between 1 and 5 - Regex string is a valid string Raises: ValueError: If any pattern is malformed """ for lang, pattern_list in patterns.items(): for i, item in enumerate(pattern_list): if not isinstance(item, tuple) or len(item) != 2: raise ValueError(f"Pattern {i} for '{lang}' is not a (regex, weight) tuple: {item}") pattern, weight = item if not isinstance(pattern, str): raise ValueError( f"Pattern {i} for '{lang}': regex must be a string, got {type(pattern).__name__}" ) if not isinstance(weight, int) or weight < 1 or weight > 5: raise ValueError( f"Pattern {i} for '{lang}': weight must be int 1-5, got {weight!r}" ) # Validate patterns at module load time try: _validate_patterns(SWIFT_PATTERNS) except ValueError as e: logger.error( "Swift pattern validation failed: %s. Swift detection will be disabled. " "This indicates a bug in swift_patterns.py - please file an issue.", e, ) # Clear patterns to prevent broken detection with invalid data SWIFT_PATTERNS = {}