Skip to content
This repository was archived by the owner on Nov 6, 2019. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
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
22 changes: 21 additions & 1 deletion src/main/kotlin/ts2kt/TypeScriptToKotlinBase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,27 @@ abstract class TypeScriptToKotlinBase(

open fun addFunction(symbol: Symbol?, name: String, callSignature: KtCallSignature, extendsType: KtType? = null, needsNoImpl: Boolean = true, additionalAnnotations: List<KtAnnotation> = listOf(), isOverride: Boolean = false, isOperator: Boolean = false) {
val annotations = defaultAnnotations + additionalAnnotations
addDeclaration(symbol, KtFunction(KtName(name), callSignature, extendsType?.let { KtHeritageType(it) }, annotations, needsNoImpl = needsNoImpl, isOverride = isOverride, hasOpenModifier = hasMembersOpenModifier, isOperator = isOperator))
var actualIsOverride = isOverride
val overrideCallSignature = if ("hashCode" == name && callSignature.params.isEmpty()) {
actualIsOverride = true
//force hashCode to return an Int so it will compile
callSignature.copy(returnType = callSignature.returnType.copy(type = KtType(INT)))
} else if ("toString" == name && callSignature.params.isEmpty()) {
actualIsOverride = true
//force toString to return a String so it will compile
callSignature.copy(returnType = callSignature.returnType.copy(type = KtType(STRING)))
} else if ("equals" == name && callSignature.params.size == 1 && callSignature.params[0].type.type.qualifiedName == ANY) {
actualIsOverride = true
callSignature.copy(
//force equals to take Any? (instead of Any) so that it overrides
params = callSignature.params.map { it.copy(type = it.type.copy(type = KtType(ANY, isNullable = true))) },
//force equals to return a Boolean so it will compile
returnType = callSignature.returnType.copy(type = KtType(BOOLEAN)))
} else {
callSignature
}
val heritageType = extendsType?.let { KtHeritageType(it) }
addDeclaration(symbol, KtFunction(KtName(name), overrideCallSignature, heritageType, annotations, needsNoImpl, actualIsOverride, hasMembersOpenModifier, isOperator))
}

protected fun addDeclaration(symbol: Symbol?, declaration: KtMember) {
Expand Down
16 changes: 0 additions & 16 deletions src/main/kotlin/ts2kt/translate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -86,20 +86,6 @@ fun translate(srcPath: String, basePackageName: String, declareModifierIsOptiona
// val fileNode = languageService.getSourceFile(normalizeSrcPath)
val fileNode = languageService.getProgram().getSourceFile(normalizeSrcPath)

inline fun isAnyMember(node: MethodDeclaration): Boolean {
val params = node.parameters.arr

return when (node.propertyName?.text) {
"equals" ->
params.size == 1 && params[0].type?.let { it.kind === SyntaxKind.AnyKeyword } ?: true
// TODO check return type ???
"hashCode", "toString" ->
params.size == 0
else ->
false
}
}

/*inline*/ fun isOverrideHelper(
node: Declaration,
/*crossinline*/ f: (TypeChecker, Type, String) -> Boolean
Expand Down Expand Up @@ -172,8 +158,6 @@ fun translate(srcPath: String, basePackageName: String, declareModifierIsOptiona
}

fun isOverride(node: MethodDeclaration): Boolean {
if (isAnyMember(node)) return true

var nodeSignature: Signature? = null

return isOverrideHelper(node) { typechecker, type, nodeName ->
Expand Down
1 change: 1 addition & 0 deletions src/main/kotlin/ts2kt/typeScriptAstUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import typescriptServices.ts.*
val ANY = KtQualifiedName("Any")
val NOTHING = KtQualifiedName("Nothing")
val NUMBER = KtQualifiedName("Number")
val INT = KtQualifiedName("Int")
val STRING = KtQualifiedName("String")
val BOOLEAN = KtQualifiedName("Boolean")
val UNIT = KtQualifiedName("Unit")
Expand Down
7 changes: 4 additions & 3 deletions testData/class/override/anyMembers.d.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package anyMembers

external open class ExpectedOverrides {
override fun equals(a: Any): Unit = definedExternally
override fun hashCode(): Number = definedExternally
override fun equals(a: Any?): Boolean = definedExternally
override fun hashCode(): Int = definedExternally
override fun toString(): String = definedExternally
}
external open class ExpectedOverrides2 {
override fun equals(a: Any): Unit = definedExternally
override fun equals(a: Any?): Boolean = definedExternally
override fun toString(): String = definedExternally
}
external open class ExpectedNoOverrides {
open fun equals(): Unit = definedExternally
Expand Down
1 change: 1 addition & 0 deletions testData/class/override/anyMembers.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ declare class ExpectedOverrides {

declare class ExpectedOverrides2 {
equals(a);
toString();
}

declare class ExpectedNoOverrides {
Expand Down
6 changes: 3 additions & 3 deletions testData/interface/override/anyMembers.d.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package anyMembers

external interface ExpectedOverrides {
override fun equals(a: Any)
override fun hashCode(): Number
override fun equals(a: Any?): Boolean
override fun hashCode(): Int
override fun toString(): String
}
external interface ExpectedOverrides2 {
override fun equals(a: Any)
override fun equals(a: Any?): Boolean
}
external interface ExpectedNoOverrides {
fun equals()
Expand Down