From 3bdaccd9886863c7c9b9bcc890b0a175ea65c8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCcke?= Date: Thu, 24 Aug 2023 16:18:17 +0200 Subject: [PATCH] Made protocol compositions available for EJS templates. (#1192) --- CHANGELOG.md | 1 + .../Sources/AST/ProtocolComposition.swift | 1 - SourceryRuntime/Sources/AST/Typealias.swift | 1 - .../Generated/JSExport.generated.swift | 63 +++++++++++++++++++ SourceryRuntime/Sources/TemplateContext.swift | 3 +- .../Generating/JavaScriptTemplateSpecs.swift | 11 ++++ .../ProtocolCompositions.ejs | 12 ++++ SourceryTests/Stub/Result/FooBar.swift | 11 ++++ SourceryTests/Stub/Source/FooBar.swift | 11 ++++ 9 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 SourceryTests/Stub/JavaScriptTemplates/ProtocolCompositions.ejs create mode 100644 SourceryTests/Stub/Result/FooBar.swift create mode 100644 SourceryTests/Stub/Source/FooBar.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 5af7a72e0..7668e59fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Added support for Swift Package Manager config ([#1184](https://github.com/krzysztofzablocki/Sourcery/pull/1184)) - Add support to any keyword for function parameter type to AutoMockable.stencil ([#1169](https://github.com/krzysztofzablocki/Sourcery/pull/1169)) - Add support to any keyword for function return type to AutoMockable.stencil([#1186](https://github.com/krzysztofzablocki/Sourcery/pull/1186)) +- Add support for protocol compositions in EJS templates. ([#1192](https://github.com/krzysztofzablocki/Sourcery/pull/1192)) ## 2.0.3 ## Internal Changes diff --git a/SourceryRuntime/Sources/AST/ProtocolComposition.swift b/SourceryRuntime/Sources/AST/ProtocolComposition.swift index ab7b4f2d6..4cff7200f 100644 --- a/SourceryRuntime/Sources/AST/ProtocolComposition.swift +++ b/SourceryRuntime/Sources/AST/ProtocolComposition.swift @@ -3,7 +3,6 @@ import Foundation -// sourcery: skipJSExport /// Describes a Swift [protocol composition](https://docs.swift.org/swift-book/ReferenceManual/Types.html#ID454). @objcMembers public final class ProtocolComposition: Type { diff --git a/SourceryRuntime/Sources/AST/Typealias.swift b/SourceryRuntime/Sources/AST/Typealias.swift index af66e093e..2049eee9c 100644 --- a/SourceryRuntime/Sources/AST/Typealias.swift +++ b/SourceryRuntime/Sources/AST/Typealias.swift @@ -1,6 +1,5 @@ import Foundation -// sourcery: skipJSExport /// :nodoc: @objcMembers public final class Typealias: NSObject, Typed, SourceryModel { // New typealias name diff --git a/SourceryRuntime/Sources/Generated/JSExport.generated.swift b/SourceryRuntime/Sources/Generated/JSExport.generated.swift index 6c8fd556a..355f26a6f 100644 --- a/SourceryRuntime/Sources/Generated/JSExport.generated.swift +++ b/SourceryRuntime/Sources/Generated/JSExport.generated.swift @@ -408,6 +408,54 @@ extension Modifier: ModifierAutoJSExport {} extension Protocol: ProtocolAutoJSExport {} +@objc protocol ProtocolCompositionAutoJSExport: JSExport { + var kind: String { get } + var composedTypeNames: [TypeName] { get } + var composedTypes: [Type]? { get } + var module: String? { get } + var imports: [Import] { get } + var allImports: [Import] { get } + var accessLevel: String { get } + var name: String { get } + var isUnknownExtension: Bool { get } + var globalName: String { get } + var isGeneric: Bool { get } + var localName: String { get } + var variables: [Variable] { get } + var rawVariables: [Variable] { get } + var allVariables: [Variable] { get } + var methods: [Method] { get } + var rawMethods: [Method] { get } + var allMethods: [Method] { get } + var subscripts: [Subscript] { get } + var rawSubscripts: [Subscript] { get } + var allSubscripts: [Subscript] { get } + var initializers: [Method] { get } + var annotations: Annotations { get } + var documentation: Documentation { get } + var staticVariables: [Variable] { get } + var staticMethods: [Method] { get } + var classMethods: [Method] { get } + var instanceVariables: [Variable] { get } + var instanceMethods: [Method] { get } + var computedVariables: [Variable] { get } + var storedVariables: [Variable] { get } + var inheritedTypes: [String] { get } + var based: [String: String] { get } + var basedTypes: [String: Type] { get } + var inherits: [String: Type] { get } + var implements: [String: Type] { get } + var containedTypes: [Type] { get } + var containedType: [String: Type] { get } + var parentName: String? { get } + var parent: Type? { get } + var supertype: Type? { get } + var attributes: AttributeList { get } + var modifiers: [SourceryModifier] { get } + var fileName: String? { get } +} + +extension ProtocolComposition: ProtocolCompositionAutoJSExport {} @@ -585,6 +633,21 @@ extension Type: TypeAutoJSExport {} extension TypeName: TypeNameAutoJSExport {} +@objc protocol TypealiasAutoJSExport: JSExport { + var aliasName: String { get } + var typeName: TypeName { get } + var type: Type? { get } + var module: String? { get } + var parent: Type? { get } + var accessLevel: String { get } + var parentName: String? { get } + var name: String { get } + var isOptional: Bool { get } + var isImplicitlyUnwrappedOptional: Bool { get } + var unwrappedTypeName: String { get } +} + +extension Typealias: TypealiasAutoJSExport {} @objc protocol TypesCollectionAutoJSExport: JSExport { diff --git a/SourceryRuntime/Sources/TemplateContext.swift b/SourceryRuntime/Sources/TemplateContext.swift index f2ab4e0b4..1412931f2 100644 --- a/SourceryRuntime/Sources/TemplateContext.swift +++ b/SourceryRuntime/Sources/TemplateContext.swift @@ -70,7 +70,8 @@ import Foundation "extensions": types.extensions, "based": types.based, "inheriting": types.inheriting, - "implementing": types.implementing + "implementing": types.implementing, + "protocolCompositions": types.protocolCompositions ], "functions": functions, "type": types.typesByName, diff --git a/SourceryTests/Generating/JavaScriptTemplateSpecs.swift b/SourceryTests/Generating/JavaScriptTemplateSpecs.swift index e71664297..a2a0be304 100644 --- a/SourceryTests/Generating/JavaScriptTemplateSpecs.swift +++ b/SourceryTests/Generating/JavaScriptTemplateSpecs.swift @@ -28,6 +28,17 @@ class JavaScriptTemplateTests: QuickSpec { let result = (try? (outputDir + Sourcery().generatedPath(for: templatePath)).read(.utf8)) expect(result).to(equal(expectedResult)) } + + it("provides protocol compositions") { + let templatePath = Stubs.jsTemplates + Path("ProtocolCompositions.ejs") + let expectedResult = try? (Stubs.resultDirectory + Path("FooBar.swift")).read(.utf8) + + expect { try Sourcery(cacheDisabled: true).processFiles(.sources(Paths(include: [Stubs.sourceDirectory])), usingTemplates: Paths(include: [templatePath]), output: output, baseIndentation: 0) }.toNot(throwError()) + + let result = (try? (outputDir + Sourcery().generatedPath(for: templatePath)).read(.utf8)) + print("expected:\n\(expectedResult)\n\ngot:\n\(result)") + expect(result).to(equal(expectedResult)) + } it("handles includes") { let templatePath = Stubs.jsTemplates + Path("Includes.ejs") diff --git a/SourceryTests/Stub/JavaScriptTemplates/ProtocolCompositions.ejs b/SourceryTests/Stub/JavaScriptTemplates/ProtocolCompositions.ejs new file mode 100644 index 000000000..32aa63244 --- /dev/null +++ b/SourceryTests/Stub/JavaScriptTemplates/ProtocolCompositions.ejs @@ -0,0 +1,12 @@ +<%_ +for (composition of types.protocolCompositions.filter((t) => t.annotations.AutoStruct != null)) { %> +struct Any<%- composition.name %>: <%- composition.name %> { +<%_ for (type of composition.composedTypes) { -%> + + // MARK: <%- type.name %> properties +<%_ for (variable of type.instanceVariables) { -%> + var <%- variable.name %>: <%- variable.typeName.asSource %> +<% } +} -%> +} +<%_ } -%> diff --git a/SourceryTests/Stub/Result/FooBar.swift b/SourceryTests/Stub/Result/FooBar.swift new file mode 100644 index 000000000..fcbb4a979 --- /dev/null +++ b/SourceryTests/Stub/Result/FooBar.swift @@ -0,0 +1,11 @@ +// Generated using Sourcery Major.Minor.Patch — https://github.com/krzysztofzablocki/Sourcery +// DO NOT EDIT + +struct AnyFooBar: FooBar { + + // MARK: HasFoo properties + var foo: Foo + + // MARK: HasBar properties + var bar: Bar +} diff --git a/SourceryTests/Stub/Source/FooBar.swift b/SourceryTests/Stub/Source/FooBar.swift new file mode 100644 index 000000000..1bac576ca --- /dev/null +++ b/SourceryTests/Stub/Source/FooBar.swift @@ -0,0 +1,11 @@ +import Foundation + +protocol HasFoo { + var foo: Foo { get } +} +protocol HasBar { + var bar: Bar { get } +} + +// sourcery: AutoStruct +typealias FooBar = HasFoo & HasBar