Skip to content
This repository has been archived by the owner on Jun 13, 2024. It is now read-only.

Commit

Permalink
Merge pull request #159 from square/sebastianv1/refactor-resolver-typing
Browse files Browse the repository at this point in the history
Refactoring improvements for Resolver.
  • Loading branch information
sebastianv1 authored Aug 3, 2020
2 parents 96d4222 + 19b99a7 commit cc65fff
Show file tree
Hide file tree
Showing 7 changed files with 210 additions and 198 deletions.
70 changes: 17 additions & 53 deletions cleansec/CleansecFramework/Resolver/CanonicalProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,68 +7,26 @@
//

import Foundation
import SwiftAstParser

/// This is the final form of a provider used by dependency graphs.
/// For example, tagged providers with a special tag turn into `TaggedProvider<MyTag>`.
public struct CanonicalProvider: Equatable {
public let type: String
public let dependencies: [String]
public let type: TypeKey
public let dependencies: [TypeKey]
public let isCollectionProvider: Bool
public let debugData: DebugData
}

extension CanonicalProvider: CustomStringConvertible {
public var description: String {
"Provider: \(type) --> \(dependencies)"
}
}

extension CanonicalProvider {
var lazyProvider: CanonicalProvider {
CanonicalProvider(
type: "Provider<\(type)>",
dependencies: dependencies,
isCollectionProvider: isCollectionProvider,
debugData: debugData
)
}

var implicitProvider: CanonicalProvider {
CanonicalProvider(
type: "() -> \(type)",
dependencies: dependencies,
isCollectionProvider: isCollectionProvider,
debugData: debugData
)
}

var weakProvider: CanonicalProvider {
CanonicalProvider(
type: "WeakProvider<\(type)>",
dependencies: dependencies,
isCollectionProvider: isCollectionProvider,
debugData: debugData
)
}

var isLazyProvider: Bool {
return type.matches("^Provider<.*>")
}

var isImplicitProvider: Bool {
return type.matches(#"^\(\)\s->"#)
}

var isWeakProvider: Bool {
return type.matches("^WeakProvider<.*>")
"Provider: \(type.primaryType) --> \(dependencies)"
}
}

extension LinkedComponent {
var seedProvider: CanonicalProvider {
return CanonicalProvider(
type: seed,
type: TypeKey(type: seed),
dependencies: [],
isCollectionProvider: false,
debugData: .empty
Expand All @@ -77,35 +35,41 @@ extension LinkedComponent {

var componentFactoryProvider: CanonicalProvider {
return CanonicalProvider(
type: "ComponentFactory<\(type)>",
type: TypeKey(type: "ComponentFactory<\(type)>"),
dependencies: [],
isCollectionProvider: false,
debugData: .empty
)
}
}

extension Array where Element == String {
func mapTypesToKey() -> [TypeKey] {
map { TypeKey(type: $0) }
}
}

extension StandardProvider {
func mapToCanonical() -> CanonicalProvider {
if let tag = tag {
return CanonicalProvider(
type: "TaggedProvider<\(tag)>",
dependencies: dependencies,
type: TypeKey(type: "TaggedProvider<\(tag)>"),
dependencies: dependencies.mapTypesToKey(),
isCollectionProvider: collectionType != nil,
debugData: debugData
)
}
if let collection = collectionType {
return CanonicalProvider(
type: collection,
dependencies: dependencies,
type: TypeKey(type: collection),
dependencies: dependencies.mapTypesToKey(),
isCollectionProvider: true,
debugData: debugData
)
}
return CanonicalProvider(
type: type,
dependencies: dependencies,
type: TypeKey(type: type),
dependencies: dependencies.mapTypesToKey(),
isCollectionProvider: false,
debugData: debugData
)
Expand Down
8 changes: 4 additions & 4 deletions cleansec/CleansecFramework/Resolver/ResolutionError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ public struct ResolutionError: Equatable, Error {
case missingModule(String)
case missingSubcomponent(String)
case duplicateProvider([CanonicalProvider])
case missingProvider(dependency: String, dependedUpon: CanonicalProvider?)
case cyclicalDependency(chain: [String])
case missingProvider(dependency: TypeKey, dependedUpon: CanonicalProvider?)
case cyclicalDependency(chain: [TypeKey])
}

let type: Error
Expand All @@ -25,7 +25,7 @@ extension ResolutionError: CustomStringConvertible {
switch type {
case .missingProvider(let provider, let parent):
var errorDescription = errorPrefix(debug: parent?.debugData)
errorDescription += "Missing Provider: '\(provider)'\n"
errorDescription += "Missing Provider: '\(provider.primaryType)'\n"
if let p = parent {
errorDescription += "Depended upon by: '\(p.type)'"
}
Expand All @@ -48,7 +48,7 @@ extension ResolutionError: CustomStringConvertible {

return errorDescription
case .cyclicalDependency(let chain):
let chainDescription = chain.joined(separator: " --> ")
let chainDescription = chain.map { $0.primaryType }.joined(separator: " --> ")
return "error: Cycle in dependencies found: \(chainDescription)"
}
}
Expand Down
4 changes: 2 additions & 2 deletions cleansec/CleansecFramework/Resolver/ResolvedComponent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ public final class ResolvedComponent {
public let type: String
public weak var parent: ResolvedComponent?
public var children: [ResolvedComponent]
public let providersByType: [String:[CanonicalProvider]]
public let providersByType: [TypeKey:[CanonicalProvider]]
public let diagnostics: [ResolutionError]

public init(type: String, providersByType: [String:[CanonicalProvider]], children: [ResolvedComponent], parent: ResolvedComponent? = nil, diagnostics: [ResolutionError] = []) {
public init(type: String, providersByType: [TypeKey:[CanonicalProvider]], children: [ResolvedComponent], parent: ResolvedComponent? = nil, diagnostics: [ResolutionError] = []) {
self.type = type
self.providersByType = providersByType
self.children = children
Expand Down
Loading

0 comments on commit cc65fff

Please sign in to comment.