@@ -181,7 +181,9 @@ class Frontend {
181
181
/// it was provided, or by searching in paths inferred by `swiftFilePath` if one exists, or the
182
182
/// default configuration otherwise. If an error occurred when reading the configuration, a
183
183
/// diagnostic is emitted and `nil` is returned. If neither `pathOrString` nor `swiftFilePath`
184
- /// were provided, a default `Configuration()` will be returned.
184
+ /// were provided, a configuration is searched at the current working directory or upwards the
185
+ /// path. Next the configuration is searched for at the OS default config locations as
186
+ /// swift-format/config.json. Finally the default `Configuration()` will be returned.
185
187
private func configuration(
186
188
fromPathOrString pathOrString: String ? ,
187
189
orInferredFromSwiftFileAt swiftFileURL: URL ?
@@ -241,6 +243,57 @@ class Frontend {
241
243
}
242
244
}
243
245
246
+ // Load global configuration file
247
+ // First URLs are created, then they are queried. First match is loaded
248
+ var configLocations : [ URL ] = [ ]
249
+
250
+ if #available( macOS 13 . 0 , iOS 16 . 0 , * ) {
251
+ // From "~/Library/Application Support/" directory
252
+ configLocations. append ( URL . applicationSupportDirectory)
253
+ // From $XDG_CONFIG_HOME directory
254
+ if let xdgConfig: String = ProcessInfo . processInfo. environment [ " XDG_CONFIG_HOME " ] {
255
+ configLocations. append ( URL ( filePath: xdgConfig, directoryHint: . isDirectory) )
256
+ }
257
+ // From "~/.config/" directory
258
+ var dotconfig : URL = URL . homeDirectory
259
+ dotconfig. append ( component: " .config " , directoryHint: . isDirectory)
260
+ configLocations. append ( dotconfig)
261
+ } else {
262
+ // From "~/Library/Application Support/" directory
263
+ var appSupport : URL = FileManager . default. homeDirectoryForCurrentUser
264
+ appSupport. appendPathComponent ( " Library " , isDirectory: true )
265
+ appSupport. appendPathComponent ( " Application Support " , isDirectory: true )
266
+ configLocations. append ( appSupport)
267
+ // From $XDG_CONFIG_HOME directory
268
+ if let xdgConfig: String = ProcessInfo . processInfo. environment [ " XDG_CONFIG_HOME " ] {
269
+ configLocations. append ( URL ( fileURLWithPath: xdgConfig) )
270
+ }
271
+ // From "~/.config/" directory
272
+ var dotconfig : URL = FileManager . default. homeDirectoryForCurrentUser
273
+ dotconfig. appendPathComponent ( " .config " )
274
+ configLocations. append ( dotconfig)
275
+ }
276
+
277
+ for var location: URL in configLocations {
278
+ if #available( macOS 13 . 0 , iOS 16 . 0 , * ) {
279
+ location. append ( components: " swift-format " , " config.json " )
280
+ } else {
281
+ location. appendPathComponent ( " swift-format " , isDirectory: true )
282
+ location. appendPathComponent ( " config.json " , isDirectory: false )
283
+ }
284
+ if FileManager . default. fileExists ( atPath: location. path) {
285
+ do {
286
+ let configuration = try configurationLoader. configuration ( at: location)
287
+ self . checkForUnrecognizedRules ( in: configuration)
288
+ return configuration
289
+ } catch {
290
+ diagnosticsEngine. emitError (
291
+ " Unable to read configuration for \( location. path) : \( error. localizedDescription) " )
292
+ return nil
293
+ }
294
+ }
295
+ }
296
+
244
297
// An explicit configuration has not been given, and one cannot be found.
245
298
// Return the default configuration.
246
299
return Configuration ( )
0 commit comments