mirror of
https://github.com/nicklockwood/SwiftFormat.git
synced 2026-05-17 10:30:35 +00:00
46 lines
1.5 KiB
Swift
46 lines
1.5 KiB
Swift
//
|
|
// LintFileCommand.swift
|
|
// Editor Extension
|
|
//
|
|
// Created by Nick Lockwood on 06/01/2020.
|
|
// Copyright © 2020 Nick Lockwood. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import XcodeKit
|
|
|
|
final class LintFileCommand: NSObject, XCSourceEditorCommand {
|
|
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
|
|
guard SupportedContentUTIs.contains(invocation.buffer.contentUTI) else {
|
|
return completionHandler(FormatCommandError.notSwiftLanguage)
|
|
}
|
|
|
|
// Grab the selected source to format
|
|
let sourceToFormat = invocation.buffer.completeBuffer
|
|
let input = tokenize(sourceToFormat)
|
|
|
|
// Get rules
|
|
let rules = FormatRules.named(RulesStore().rules.compactMap {
|
|
$0.isEnabled ? $0.name : nil
|
|
})
|
|
|
|
// Get options
|
|
let store = OptionsStore()
|
|
var formatOptions = store.inferOptions ? inferFormatOptions(from: input) : store.formatOptions
|
|
formatOptions.indent = invocation.buffer.indentationString
|
|
formatOptions.tabWidth = invocation.buffer.tabWidth
|
|
formatOptions.swiftVersion = store.formatOptions.swiftVersion
|
|
|
|
// Apply linting
|
|
do {
|
|
let changes = try lint(input, rules: rules, options: formatOptions)
|
|
if !changes.isEmpty {
|
|
return completionHandler(FormatCommandError.lintWarnings(changes))
|
|
}
|
|
return completionHandler(nil)
|
|
} catch {
|
|
return completionHandler(error)
|
|
}
|
|
}
|
|
}
|