Skip to content

Commit 1745be6

Browse files
committed
Fix Api notes configuration for external types.
1 parent 36859a7 commit 1745be6

File tree

4 files changed

+29
-45
lines changed

4 files changed

+29
-45
lines changed

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/SkiePhaseScheduler.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import co.touchlab.skie.phases.memberconflicts.RenameCallableDeclarationsConflic
3131
import co.touchlab.skie.phases.memberconflicts.RenameConflictingCallableDeclarationsPhase
3232
import co.touchlab.skie.phases.memberconflicts.RenameParametersNamedSelfPhase
3333
import co.touchlab.skie.phases.oir.ConfigureExternalOirTypesBridgingPhase
34-
import co.touchlab.skie.phases.oir.ConfigureOirBuiltinsBridgingPhase
3534
import co.touchlab.skie.phases.oir.CreateFakeObjCConstructorsPhase
3635
import co.touchlab.skie.phases.oir.CreateOirMembersPhase
3736
import co.touchlab.skie.phases.oir.CreateOirTypesPhase
@@ -125,7 +124,6 @@ class SkiePhaseScheduler {
125124
CreateExternalSirTypesPhase,
126125
InitializeSirTypesCachePhase,
127126
InitializeSirTypesSuperTypesForOirPhase,
128-
ConfigureOirBuiltinsBridgingPhase,
129127
ConfigureExternalOirTypesBridgingPhase(context),
130128
CreateSirInternalTypeAliasesPhase,
131129

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/oir/ConfigureExternalOirTypesBridgingPhase.kt

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import co.touchlab.skie.phases.apinotes.builder.ApiNotes
77
import co.touchlab.skie.phases.apinotes.parser.ExternalApiNotesParser
88
import co.touchlab.skie.sir.SirFqName
99
import co.touchlab.skie.sir.element.SirClass
10+
import co.touchlab.skie.sir.element.SirTypeParameterParent
1011
import co.touchlab.skie.util.Command
1112
import java.io.File
1213

@@ -56,6 +57,7 @@ class ConfigureExternalOirTypesBridgingPhase(
5657
objCName = it.objCFqName,
5758
swiftName = it.swiftFqName,
5859
bridgeSwiftName = it.bridgeFqName,
60+
importAsNonGeneric = it.importAsNonGeneric,
5961
)
6062
}
6163
.filter { it.swiftName != null || it.bridgeSwiftName != null }
@@ -75,15 +77,15 @@ class ConfigureExternalOirTypesBridgingPhase(
7577
private fun configureBridging(apiNotesEntry: ApiNotesEntry) {
7678
val oirClass = oirProvider.findExistingExternalOirClass(apiNotesEntry.moduleName, apiNotesEntry.objCName) ?: return
7779

78-
val module = sirProvider.getExternalModule(apiNotesEntry.moduleName)
79-
8080
if (oirClass.bridgedSirClass == null && apiNotesEntry.bridgeSwiftName != null) {
81-
val bridgeFqName = SirFqName(module, apiNotesEntry.bridgeSwiftName)
81+
val bridgeFqName = apiNotesEntry.bridgeSwiftName.asApiNotesSirFqName()
8282

8383
oirClass.bridgedSirClass = getOrCreateSirClass(bridgeFqName)
8484
}
8585

8686
if (apiNotesEntry.swiftName != null) {
87+
val module = sirProvider.getExternalModule(apiNotesEntry.moduleName)
88+
8789
val fqName = SirFqName(module, apiNotesEntry.swiftName)
8890

8991
if (fqName.parent != null) {
@@ -93,7 +95,22 @@ class ConfigureExternalOirTypesBridgingPhase(
9395
oirClass.originalSirClass.baseName = fqName.simpleName
9496
}
9597

96-
// WIP importAsNonGeneric
98+
if (apiNotesEntry.importAsNonGeneric) {
99+
oirClass.originalSirClass.typeParameters.toList().forEach {
100+
it.parent = SirTypeParameterParent.None
101+
}
102+
}
103+
}
104+
105+
private fun String.asApiNotesSirFqName(): SirFqName {
106+
val parts = split('.')
107+
108+
check(parts.size == 2) { "Invalid ApiNotes fq name: $this. Expected format is \$moduleName.\$className" }
109+
110+
val module = sirProvider.getExternalModule(parts[0])
111+
val className = parts[1]
112+
113+
return SirFqName(module, className)
97114
}
98115

99116
private fun getOrCreateSirClass(fqName: SirFqName): SirClass {
@@ -120,5 +137,11 @@ class ConfigureExternalOirTypesBridgingPhase(
120137
}
121138
}
122139

123-
private data class ApiNotesEntry(val moduleName: String, val objCName: String, val swiftName: String?, val bridgeSwiftName: String?)
140+
private data class ApiNotesEntry(
141+
val moduleName: String,
142+
val objCName: String,
143+
val swiftName: String?,
144+
val bridgeSwiftName: String?,
145+
val importAsNonGeneric: Boolean,
146+
)
124147
}

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/oir/ConfigureOirBuiltinsBridgingPhase.kt

Lines changed: 0 additions & 37 deletions
This file was deleted.

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/SirProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class SirProvider(
9393
}
9494

9595
fun findClassByFqName(fqName: SirFqName): SirClass? {
96-
val parent = fqName.parent?.let { getClassByFqName(it) }
96+
val parent = fqName.parent?.let { findClassByFqName(it) ?: return null }
9797

9898
val possibleParentDeclarations = if (parent != null) {
9999
listOf(parent)

0 commit comments

Comments
 (0)