Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change dynamic to Any or Any? in types of function parameters #369

Merged
merged 4 commits into from
Aug 20, 2020
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Change dynamic to Any or Any? in types of function parameters
  • Loading branch information
trilis committed Aug 14, 2020
commit 6b7115f531133d6d9d65af1bf0064a300012895a
Original file line number Diff line number Diff line change
@@ -24,5 +24,5 @@ external interface MyPromiseConstructor {
fun <T> ping(a: T)
fun <T> pong(): T
fun <Y, Z> bang(condition: (y: Y) -> Boolean): () -> Z
fun all(values: dynamic /* JsTuple<dynamic, dynamic> | JsTuple<dynamic, dynamic, dynamic> */): MyPromise<dynamic /* JsTuple<T1, T2> | JsTuple<T1, T2, T3> */>
fun all(values: Any /* JsTuple<Any?, Any?> | JsTuple<Any?, Any?, Any?> */): MyPromise<dynamic /* JsTuple<T1, T2> | JsTuple<T1, T2, T3> */>
}
2 changes: 1 addition & 1 deletion compiler/test/data/typescript/typeAlias/typeParams.d.kt
Original file line number Diff line number Diff line change
@@ -44,7 +44,7 @@ external fun stringOrMapKey(a: MultiMap<Number, String>)

external var listOfStringOrNumber: dynamic /* String | List<dynamic /* String | Number */> */

external fun listOfNumberOrString(a: List<dynamic /* Number | String */>)
external fun listOfNumberOrString(a: List<Any /* Number | String */>)

external var headers: MyHeaders

Original file line number Diff line number Diff line change
@@ -30,4 +30,4 @@ external fun aliasUnionFunction(a: MapLike<Number, Values<String>>)

external var listOfUnionVar: Values<dynamic /* String | Number */>

external fun listOfUnionFunction(a: Values<dynamic /* Number | String */>)
external fun listOfUnionFunction(a: Values<Any /* Number | String */>)
6 changes: 3 additions & 3 deletions compiler/test/data/typescript/unionType/aliases.d.kt
Original file line number Diff line number Diff line change
@@ -26,13 +26,13 @@ external fun barKey(a: Foo)

external fun barKey(a: Number)

external fun barList(a: List<dynamic /* String | Foo | Number */>)
external fun barList(a: List<Any /* String | Foo | Number */>)

external fun barArray(a: Array<dynamic /* String | Foo | Number */>)
external fun barArray(a: Array<Any /* String | Foo | Number */>)

external interface Parent {
@nativeInvoke
operator fun invoke(vararg children: dynamic /* String | Foo | Number */): Foo
operator fun invoke(vararg children: Any /* String | Foo | Number */): Foo
}

external interface `T$0` {
14 changes: 7 additions & 7 deletions compiler/test/data/typescript/unionType/boom.d.kt
Original file line number Diff line number Diff line change
@@ -48,7 +48,7 @@ external interface S

external interface T

external fun foo(a: dynamic /* A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | T */, b: Number)
external fun foo(a: Any /* A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | T */, b: Number)

external fun bar(a: A, b: Number)

@@ -64,15 +64,15 @@ external fun bar(a: F, b: Number)

external fun bar(a: G, b: Number)

external fun baz(a: A, b: dynamic /* A | B | C | D | E */)
external fun baz(a: A, b: Any /* A | B | C | D | E */)

external fun baz(a: B, b: dynamic /* A | B | C | D | E */)
external fun baz(a: B, b: Any /* A | B | C | D | E */)

external fun baz(a: C, b: dynamic /* A | B | C | D | E */)
external fun baz(a: C, b: Any /* A | B | C | D | E */)

external fun baz(a: D, b: dynamic /* A | B | C | D | E */)
external fun baz(a: D, b: Any /* A | B | C | D | E */)

external fun baz(a: E, b: dynamic /* A | B | C | D | E */)
external fun baz(a: E, b: Any /* A | B | C | D | E */)

external fun boo(a: A, b: A, c: A)

@@ -90,4 +90,4 @@ external fun boo(a: B, b: B, c: A)

external fun boo(a: B, b: B, c: B)

external fun boom(c: String, a: dynamic /* A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | T */, b: dynamic /* A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | T */)
external fun boom(c: String, a: Any /* A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | T */, b: Any /* A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | T */)
4 changes: 2 additions & 2 deletions compiler/test/data/typescript/unionType/externalAliases.d.kt
Original file line number Diff line number Diff line change
@@ -24,11 +24,11 @@ external fun barKey(a: Foo)

external fun barKey(a: Number)

external fun barArray(a: Array<dynamic /* String | Foo | Number */>)
external fun barArray(a: Array<Any /* String | Foo | Number */>)

external interface Parent {
@nativeInvoke
operator fun invoke(vararg children: dynamic /* String | Foo | Number */): Foo
operator fun invoke(vararg children: Any /* String | Foo | Number */): Foo
}

// ------------------------------------------------------------------------------------------
26 changes: 26 additions & 0 deletions compiler/test/data/typescript/unionType/overloadConflict.d.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// [test] overloadConflict.kt
@file:Suppress("INTERFACE_WITH_SUPERCLASS", "OVERRIDING_FINAL_MEMBER", "RETURN_TYPE_MISMATCH_ON_OVERRIDE", "CONFLICTING_OVERLOADS")

import kotlin.js.*
import kotlin.js.Json
import org.khronos.webgl.*
import org.w3c.dom.*
import org.w3c.dom.events.*
import org.w3c.dom.parsing.*
import org.w3c.dom.svg.*
import org.w3c.dom.url.*
import org.w3c.fetch.*
import org.w3c.files.*
import org.w3c.notifications.*
import org.w3c.performance.*
import org.w3c.workers.*
import org.w3c.xhr.*

external interface A<T>

external interface B<T>

external interface Api {
fun <T> check(values: Array<T>): T
fun <T> check(values: Array<Any /* A<T> | B<T> */>): T
}
7 changes: 7 additions & 0 deletions compiler/test/data/typescript/unionType/overloadConflict.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
interface A<T> { }
interface B<T> { }

interface Api {
check<T>(values: Array<T>): T
check<T>(values: Array<A<T> | B<T>>): T
}
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ external fun toTex(input: Equation?): String

external fun toTex(input: Any?): String

external fun toTex(input: Array<dynamic /* Fraction? | Any? */>?): String
external fun toTex(input: Array<Any? /* Fraction? | Any? */>?): String

external open class Equation

Original file line number Diff line number Diff line change
@@ -104,6 +104,7 @@ private fun MemberDeclaration.isStatic() = when (this) {
internal sealed class TranslationContext {
object IRRELEVANT : TranslationContext()
data class PROPERTY(val optional: Boolean) : TranslationContext()
object PARAMETER : TranslationContext()
}

private data class Members(
@@ -117,6 +118,7 @@ data class FqNode(val node: Entity, val fqName: NameEntity)

private val UNIT_TYPE = TypeValueModel(value = IdentifierEntity("Unit"), params = emptyList(), fqName = KLIBROOT.appendLeft(IdentifierEntity("Unit")), metaDescription = null)
private val JSON_TYPE = TypeValueModel(value = IdentifierEntity("Json"), params = emptyList(), fqName = KLIBROOT.appendLeft(IdentifierEntity("Json")), metaDescription = null)
private val ANY_TYPE = TypeValueModel(value = IdentifierEntity("Any"), params = emptyList(), fqName = KLIBROOT.appendLeft(IdentifierEntity("Any")), metaDescription = null)

private fun dynamicType(metaDescription: String? = null) = TypeValueModel(
IdentifierEntity("dynamic"),
@@ -125,6 +127,11 @@ private fun dynamicType(metaDescription: String? = null) = TypeValueModel(
null
)

private fun anyType(nullable: Boolean, metaDescription: String?) = ANY_TYPE.copy(
nullable = nullable,
metaDescription = metaDescription
)

// TODO: duplication, think of separate place to have this (but please don't call it utils )))
private fun unquote(name: String): String {
return name.replace("(?:^[\"|\'`])|(?:[\"|\'`]$)".toRegex(), "")
@@ -239,8 +246,30 @@ internal class DocumentConverter(
return (this is TypeValueModel) && (value == IdentifierEntity("dynamic"))
}

private fun ParameterValueDeclaration.isNullable(): Boolean {
return when (this) {
is UnionTypeDeclaration -> nullable || params.any { it.isNullable() }
is TypeParamReferenceDeclaration -> true
else -> nullable
}
}

private fun UnionTypeDeclaration.process(context: TranslationContext): TypeModel {
return when (context) {
TranslationContext.PARAMETER -> anyType(isNullable(), convertMeta())
else -> dynamicType(convertMeta())
}
}

private fun TupleDeclaration.process(context: TranslationContext): TypeModel {
val meta = "JsTuple<${params.map { it.process(context).translate() }.joinToString(", ")}>"
return when (context) {
TranslationContext.PARAMETER -> anyType(isNullable(), meta)
else -> dynamicType(meta)
}
}

fun ParameterValueDeclaration.process(context: TranslationContext = TranslationContext.IRRELEVANT): TypeModel {
val dynamicName = IdentifierEntity("dynamic")
return when (this) {
is LiteralUnionNode -> {
val value = when (kind) {
@@ -255,18 +284,8 @@ internal class DocumentConverter(
context == TranslationContext.PROPERTY(true)
)
}
is UnionTypeDeclaration -> TypeValueModel(
dynamicName,
emptyList(),
convertMeta(),
null
)
is TupleDeclaration -> TypeValueModel(
dynamicName,
emptyList(),
"JsTuple<${params.map { it.process().translate() }.joinToString(", ")}>",
null
)
is UnionTypeDeclaration -> process(context)
is TupleDeclaration -> process(context)
is TypeParamReferenceDeclaration -> {
TypeParameterReferenceModel(
name = value,
@@ -281,7 +300,7 @@ internal class DocumentConverter(
} else {
TypeValueModel(
value,
params.map { param -> param.process() }.map { TypeParameterModel(it, listOf()) },
params.map { param -> param.process(context) }.map { TypeParameterModel(it, listOf()) },
meta.processMeta(),
getFqName(),
nullable
@@ -291,9 +310,9 @@ internal class DocumentConverter(
is FunctionTypeDeclaration -> {
FunctionTypeModel(
parameters = (parameters.map { param ->
param.processAsLambdaParam()
param.processAsLambdaParam(context)
}),
type = type.process(),
type = type.process(context),
metaDescription = meta.processMeta(),
nullable = nullable
)
@@ -314,7 +333,7 @@ internal class DocumentConverter(
}
else -> typeParameters.map { typeParam ->
TypeParameterModel(
type = typeParam.process(),
type = typeParam.process(context),
constraints = emptyList()
)
}
@@ -329,13 +348,7 @@ internal class DocumentConverter(

}
else -> raiseConcern("unable to process TypeNode ${this}") {
TypeValueModel(
IdentifierEntity("dynamic"),
emptyList(),
null,
null,
false
)
dynamicType()
}
}
}
@@ -518,13 +531,13 @@ internal class DocumentConverter(
}


private fun ParameterDeclaration.process(context: TranslationContext = TranslationContext.IRRELEVANT): ParameterModel {
private fun ParameterDeclaration.process(): ParameterModel {
val initializerResolved = if (initializer != null || optional) {
TypeDeclaration(IdentifierEntity("definedExternally"), emptyList())
} else null

return ParameterModel(
type = type.process(context),
type = type.process(TranslationContext.PARAMETER),
name = name,
initializer = when {
initializerResolved != null -> ExpressionStatementModel(