This repository was archived by the owner on Nov 6, 2019. It is now read-only.
File tree Expand file tree Collapse file tree 3 files changed +31
-1
lines changed
src/main/kotlin/converter Expand file tree Collapse file tree 3 files changed +31
-1
lines changed Original file line number Diff line number Diff line change @@ -115,12 +115,32 @@ private fun ObjectTypeToKotlinTypeMapper.mapUnionType(type: UnionOrIntersectionT
115115
116116 val mappedTypes = notNullTypes.map { mapType(it, null ) }
117117 return KtTypeUnion (when {
118- ! nullable -> mappedTypes.distinct ()
118+ ! nullable -> mappedTypes.mergeToPreventCompilationConflicts ()
119119 notNullTypes.size == 1 -> mappedTypes.map { it.copy(isNullable = true ) }
120120 else -> (mappedTypes + KtType (NOTHING , isNullable = true )).distinct()
121121 })
122122}
123123
124+ /* *
125+ * Normalize to a KtType such that equals will be true if the KotlinJS compiler would consider them
126+ * conflicting if both were the only parameter to identically named functions.
127+ */
128+ private fun KtType.normalizeToDetectCompilationConflicts (): KtType {
129+ return copy(comment = null , typeArgs = typeArgs.map { it.normalizeToDetectCompilationConflicts() })
130+ }
131+
132+ /* *
133+ * Handle the case where a function is overloaded with the same Kotlin parameter types by merging them.
134+ * Comments are not taken into account for the comparison, but are preserved by concatenation using "|" since a "union".
135+ * This is especially useful for Typescript string literal unions.
136+ */
137+ private fun List<KtType>.mergeToPreventCompilationConflicts (): List <KtType > {
138+ return groupBy { it.normalizeToDetectCompilationConflicts() }.map { entry ->
139+ val comments = entry.value.mapNotNull { it.comment }
140+ entry.key.copy(comment = if (comments.isEmpty()) null else comments.joinToString(" | " ))
141+ }
142+ }
143+
124144private inline val UnionOrIntersectionType .containsUndefined: Boolean
125145 get() {
126146 val array = types.asDynamic()
Original file line number Diff line number Diff line change 1+ package stringValues
2+
3+ external interface MapGenerator {
4+ fun generate (scope : String /* "city" | "state" | "country" | "world" */ )
5+ }
Original file line number Diff line number Diff line change 1+ export type GeographicScope = 'city' | 'state' | 'country' | 'world' ;
2+
3+ export interface MapGenerator {
4+ generate ( scope : GeographicScope )
5+ }
You can’t perform that action at this time.
0 commit comments