Skip to content

Commit

Permalink
[J2KT] Add VarargOverloads to j2ktnotpassing and extend varargs reada…
Browse files Browse the repository at this point in the history
…ble to include vararg method call with null array.

PiperOrigin-RevId: 599168312
  • Loading branch information
Googler authored and copybara-github committed Jan 17, 2024
1 parent 94fbcf4 commit e2293ba
Show file tree
Hide file tree
Showing 7 changed files with 244 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright 2024 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package j2ktnotpassing;

// TODO(b/319620723): Move to j2kt readable when the bug is fixed.
// Kotlin requires explicit overload conflict resolution for method calls with empty varargs.
class VarargOverloads {
static class NewInstanceOverload {
NewInstanceOverload(int foo, Object... object) {}

NewInstanceOverload(int foo, String... object) {}

static void test() {
new NewInstanceOverload(0);
}
}

static class ThisConstructorCallOverload {
ThisConstructorCallOverload(Object... object) {}

ThisConstructorCallOverload(String... object) {}

ThisConstructorCallOverload(int foo) {
this();
}
}

static class SuperConstructorCallOverload {
SuperConstructorCallOverload(Object... object) {}

SuperConstructorCallOverload(String... object) {}

static class Explicit extends SuperConstructorCallOverload {
Explicit() {
super();
}
}

static class Implicit extends SuperConstructorCallOverload {
Implicit() {}
}

static class FromImplicitConstructor extends SuperConstructorCallOverload {}
}

static class MethodCallOverload {
void method(Object... object) {}

void method(String... object) {}

void test() {
method();
}
}

static class MethodCallOverloadInSubtype {
void method(Object... object) {}

static class Subtype extends MethodCallOverloadInSubtype {
void method(String... object) {}

void test() {
method();
}
}
}

enum EnumWithOverloadedConstructors {
CONSTRUCTOR_OVERLOAD,
SUPER_CONSTRUCTOR_OVERLOAD {};

EnumWithOverloadedConstructors(Object... args) {}

EnumWithOverloadedConstructors(String... args) {}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
// Generated from "j2ktnotpassing/VarargOverloads.java"
@file:Suppress(
"ALWAYS_NULL",
"PARAMETER_NAME_CHANGED_ON_OVERRIDE",
"REPEATED_BOUND",
"SENSELESS_COMPARISON",
"UNCHECKED_CAST",
"UNNECESSARY_LATEINIT",
"UNNECESSARY_NOT_NULL_ASSERTION",
"UNREACHABLE_CODE",
"UNUSED_ANONYMOUS_PARAMETER",
"UNUSED_PARAMETER",
"UNUSED_VARIABLE",
"USELESS_CAST",
"VARIABLE_IN_SINGLETON_WITHOUT_THREAD_LOCAL",
"VARIABLE_WITH_REDUNDANT_INITIALIZER")

package j2ktnotpassing

import javaemul.lang.*
import kotlin.Any
import kotlin.Array
import kotlin.Int
import kotlin.String
import kotlin.Suppress
import kotlin.jvm.JvmStatic

open class VarargOverloads internal constructor() {
open class NewInstanceOverload {
internal constructor(foo: Int, vararg `object`: Any?) {
val object_1: Array<Any?>? = `object` as Array<Any?>?
}

internal constructor(foo: Int, vararg `object`: String?) {
val object_1: Array<String?>? = `object` as Array<String?>?
}

companion object {
@JvmStatic
internal fun test_pp_j2ktnotpassing() {
VarargOverloads.NewInstanceOverload(0)
}
}
}

open class ThisConstructorCallOverload {
internal constructor(vararg `object`: Any?) {
val object_1: Array<Any?>? = `object` as Array<Any?>?
}

internal constructor(vararg `object`: String?) {
val object_1: Array<String?>? = `object` as Array<String?>?
}

internal constructor(foo: Int): this()
}

open class SuperConstructorCallOverload {
internal constructor(vararg `object`: Any?) {
val object_1: Array<Any?>? = `object` as Array<Any?>?
}

internal constructor(vararg `object`: String?) {
val object_1: Array<String?>? = `object` as Array<String?>?
}

open class Explicit: VarargOverloads.SuperConstructorCallOverload {
internal constructor(): super()
}

open class Implicit: VarargOverloads.SuperConstructorCallOverload {
internal constructor()
}

open class FromImplicitConstructor internal constructor(): VarargOverloads.SuperConstructorCallOverload() {}
}

open class MethodCallOverload internal constructor() {
internal open fun method_pp_j2ktnotpassing(vararg `object`: Any?) {
val object_1: Array<Any?>? = `object` as Array<Any?>?
}

internal open fun method_pp_j2ktnotpassing(vararg `object`: String?) {
val object_1: Array<String?>? = `object` as Array<String?>?
}

internal open fun test_pp_j2ktnotpassing() {
this.method_pp_j2ktnotpassing()
}
}

open class MethodCallOverloadInSubtype internal constructor() {
internal open fun method_pp_j2ktnotpassing(vararg `object`: Any?) {
val object_1: Array<Any?>? = `object` as Array<Any?>?
}

open class Subtype internal constructor(): VarargOverloads.MethodCallOverloadInSubtype() {
internal open fun method_pp_j2ktnotpassing(vararg `object`: String?) {
val object_1: Array<String?>? = `object` as Array<String?>?
}

internal open fun test_pp_j2ktnotpassing() {
this.method_pp_j2ktnotpassing()
}
}
}

enum class EnumWithOverloadedConstructors {
CONSTRUCTOR_OVERLOAD,
SUPER_CONSTRUCTOR_OVERLOAD {};

constructor(vararg args: Any?) {
val args_1: Array<Any?>? = args as Array<Any?>?
}

constructor(vararg args: String?) {
val args_1: Array<String?>? = args as Array<String?>?
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public void main() {
v.test(1, new Object[] {new Object()});
v.test(1, new Object[] {});
v.test(1, new Object[][] {});
v.test(1, null);
v.testCloneable(new Object[][] {});
v.testSerializable(new Object[][] {});
v.testLambda(it -> args = it);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class Varargs extends j_l_Object {
v.m_test__int__arrayOf_java_lang_Object__void(1, [j_l_Object.$create__()]);
v.m_test__int__arrayOf_java_lang_Object__void(1, []);
v.m_test__int__arrayOf_java_lang_Object__void(1, /**@type {!Array<Array<*>>}*/ ($Arrays.$init([], j_l_Object, 2)));
v.m_test__int__arrayOf_java_lang_Object__void(1, null);
v.m_testCloneable__arrayOf_java_lang_Cloneable__void(/**@type {!Array<Array<*>>}*/ ($Arrays.$init([], j_l_Object, 2)));
v.m_testSerializable__arrayOf_java_io_Serializable__void(/**@type {!Array<Array<*>>}*/ ($Arrays.$init([], j_l_Object, 2)));
v.m_testLambda__varargs_Varargs_FunctionalInterface__void(FunctionalInterface.$adapt((/** Array<?string> */ it) =>{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
[v.test(1, new Object[] {new Object()});] => [v.m_test__int__arrayOf_java_lang_Object__void(1, [j_l_Object.$create__()]);] "varargs.Varargs.main"
[v.test(1, new Object[] {});] => [v.m_test__int__arrayOf_java_lang_Object__void(1, []);] "varargs.Varargs.main"
[v.test(1, new Object[][] {});] => [v.m_test__int__arrayOf_java_lang_Object__void(1, /**@type {!Array<Array<*>>}*/ ($Arrays.$init([], j_l_Object, 2)));] "varargs.Varargs.main"
[v.test(1, null);] => [v.m_test__int__arrayOf_java_lang_Object__void(1, null);] "varargs.Varargs.main"
[v.testCloneable(new Object[][] {});] => [v.m_testCloneable__arrayOf_java_lang_Cloneable__void(/**@type {!Array<Array<*>>}*/ ($Arrays.$init([], j_l_Object, 2)));] "varargs.Varargs.main"
[v.testSerializable(new Object[][] {});] => [v.m_testSerializable__arrayOf_java_io_Serializable__void(/**@type {!Array<Array<*>>}*/ ($Arrays.$init([], j_l_Object, 2)));] "varargs.Varargs.main"
[v.testLambda(it -> args = it);] => [v.m_testLambda__varargs_Varargs_FunctionalInterface__void(FunctionalInterface.$adapt((/** Array<?string> */ it) =>{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ open class Varargs {
v!!.test(1, *arrayOf<Any?>(Any())!!)
v!!.test(1, *arrayOf<Any?>()!!)
v!!.test(1, *(arrayOf<Array<Any?>?>() as Array<Any?>?)!!)
v!!.test(1, *null!!)
v!!.testCloneable(*(arrayOf<Array<Any?>?>() as Array<Cloneable?>?)!!)
v!!.testSerializable(*(arrayOf<Array<Any?>?>() as Array<Serializable?>?)!!)
v!!.testLambda(Varargs.FunctionalInterface { it: Array<out String?>? ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,10 +422,12 @@
;;@ varargs/Varargs.java:57:4
(call_ref $function.m_test__int__arrayOf_java_lang_Object__void (ref.as_non_null (local.get $v))(i32.const 1)(call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array ))(struct.get $varargs.Varargs.vtable $m_test__int__arrayOf_java_lang_Object__void (struct.get $varargs.Varargs $vtable(local.get $v))))
;;@ varargs/Varargs.java:58:4
(call_ref $function.m_testCloneable__arrayOf_java_lang_Cloneable__void (ref.as_non_null (local.get $v))(call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array ))(struct.get $varargs.Varargs.vtable $m_testCloneable__arrayOf_java_lang_Cloneable__void (struct.get $varargs.Varargs $vtable(local.get $v))))
(call_ref $function.m_test__int__arrayOf_java_lang_Object__void (ref.as_non_null (local.get $v))(i32.const 1)(ref.null $javaemul.internal.WasmArray.OfObject)(struct.get $varargs.Varargs.vtable $m_test__int__arrayOf_java_lang_Object__void (struct.get $varargs.Varargs $vtable(local.get $v))))
;;@ varargs/Varargs.java:59:4
(call_ref $function.m_testSerializable__arrayOf_java_io_Serializable__void (ref.as_non_null (local.get $v))(call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array ))(struct.get $varargs.Varargs.vtable $m_testSerializable__arrayOf_java_io_Serializable__void (struct.get $varargs.Varargs $vtable(local.get $v))))
(call_ref $function.m_testCloneable__arrayOf_java_lang_Cloneable__void (ref.as_non_null (local.get $v))(call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array ))(struct.get $varargs.Varargs.vtable $m_testCloneable__arrayOf_java_lang_Cloneable__void (struct.get $varargs.Varargs $vtable(local.get $v))))
;;@ varargs/Varargs.java:60:4
(call_ref $function.m_testSerializable__arrayOf_java_io_Serializable__void (ref.as_non_null (local.get $v))(call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array ))(struct.get $varargs.Varargs.vtable $m_testSerializable__arrayOf_java_io_Serializable__void (struct.get $varargs.Varargs $vtable(local.get $v))))
;;@ varargs/Varargs.java:61:4
(call_ref $function.m_testLambda__varargs_Varargs_FunctionalInterface__void (ref.as_non_null (local.get $v))(call [email protected].$LambdaImplementor$1 (local.get $this))(struct.get $varargs.Varargs.vtable $m_testLambda__varargs_Varargs_FunctionalInterface__void (struct.get $varargs.Varargs $vtable(local.get $v))))
)
)
Expand Down Expand Up @@ -496,16 +498,16 @@
(func [email protected].$LambdaImplementor$1
(param $$outer_this (ref null $varargs.Varargs))
(result (ref null $varargs.Varargs.$LambdaImplementor$1))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(local $$instance (ref null $varargs.Varargs.$LambdaImplementor$1))
(block
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(call $$clinit__void_<once>[email protected].$LambdaImplementor$1 )
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(local.set $$instance (struct.new $varargs.Varargs.$LambdaImplementor$1 (ref.as_non_null (global.get $varargs.Varargs.$LambdaImplementor$1.vtable)) (ref.as_non_null (global.get $varargs.Varargs.$LambdaImplementor$1.itable)) (i32.const 0) (ref.null $varargs.Varargs)))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(call $$ctor__varargs_Varargs__void_$p_varargs_Varargs_$LambdaImplementor$1@varargs.Varargs.$LambdaImplementor$1 (ref.as_non_null (local.get $$instance))(local.get $$outer_this))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(return (local.get $$instance))
)
)
Expand All @@ -514,11 +516,11 @@
(func $$ctor__varargs_Varargs__void_$p_varargs_Varargs_$LambdaImplementor$1@varargs.Varargs.$LambdaImplementor$1
(param $this (ref null $varargs.Varargs.$LambdaImplementor$1))
(param $$outer_this (ref null $varargs.Varargs))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(block
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(struct.set $varargs.Varargs.$LambdaImplementor$1 [email protected].$LambdaImplementor$1 (local.get $this) (local.get $$outer_this))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(call [email protected] (ref.as_non_null (local.get $this)))
)
)
Expand All @@ -528,30 +530,30 @@
(type $function.m_apply__arrayOf_java_lang_String__void)
(param $this.untyped (ref $java.lang.Object))
(param $it (ref null $javaemul.internal.WasmArray.OfObject))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(local $this (ref null $varargs.Varargs.$LambdaImplementor$1))
(local.set $this (ref.cast (ref $varargs.Varargs.$LambdaImplementor$1) (local.get $this.untyped)))
(block
;;@ varargs/Varargs.java:60:23
;;@ varargs/Varargs.java:61:23
(struct.set $varargs.Varargs [email protected] (struct.get $varargs.Varargs.$LambdaImplementor$1 [email protected].$LambdaImplementor$1 (local.get $this)) (local.get $it))
)
)
(elem declare func [email protected].$LambdaImplementor$1)

;;; void <anonymous> implements FunctionalInterface.$clinit()
(func $$clinit__void_<once>[email protected].$LambdaImplementor$1
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(block
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(if (global.get [email protected].$LambdaImplementor$1)
(then
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(return )
)
)
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(global.set [email protected].$LambdaImplementor$1 (i32.const 1))
;;@ varargs/Varargs.java:60:17
;;@ varargs/Varargs.java:61:17
(call $$clinit__void_<once>[email protected] )
)
)
Expand Down Expand Up @@ -602,44 +604,44 @@
;;; Child Child.$create()
(func [email protected]
(result (ref null $varargs.Child))
;;@ varargs/Varargs.java:65:9
;;@ varargs/Varargs.java:66:9
(local $$instance (ref null $varargs.Child))
(block
;;@ varargs/Varargs.java:65:9
;;@ varargs/Varargs.java:66:9
(call $$clinit__void_<once>[email protected] )
;;@ varargs/Varargs.java:65:9
;;@ varargs/Varargs.java:66:9
(local.set $$instance (struct.new $varargs.Child (ref.as_non_null (global.get $varargs.Child.vtable)) (ref.as_non_null (global.get $itable.empty)) (i32.const 0) (ref.null $javaemul.internal.WasmArray.OfObject)))
;;@ varargs/Varargs.java:65:9
;;@ varargs/Varargs.java:66:9
(call [email protected] (ref.as_non_null (local.get $$instance)))
;;@ varargs/Varargs.java:65:9
;;@ varargs/Varargs.java:66:9
(return (local.get $$instance))
)
)

;;; void Child.$ctor()
(func [email protected]
(param $this (ref null $varargs.Child))
;;@ varargs/Varargs.java:65:9
;;@ varargs/Varargs.java:66:9
(block
;;@ varargs/Varargs.java:66:4
;;@ varargs/Varargs.java:67:4
(call [email protected] (ref.as_non_null (local.get $this))(call $m_newWithLiteral__arrayOf_int__javaemul_internal_WasmArray_OfInt@javaemul.internal.WasmArray.OfInt (array.new_data $int.array [email protected] (i32.const 0) (i32.const 1))))
)
)

;;; void Child.$clinit()
(func $$clinit__void_<once>[email protected]
;;@ varargs/Varargs.java:64:6
;;@ varargs/Varargs.java:65:6
(block
;;@ varargs/Varargs.java:64:6
;;@ varargs/Varargs.java:65:6
(if (global.get [email protected])
(then
;;@ varargs/Varargs.java:64:6
;;@ varargs/Varargs.java:65:6
(return )
)
)
;;@ varargs/Varargs.java:64:6
;;@ varargs/Varargs.java:65:6
(global.set [email protected] (i32.const 1))
;;@ varargs/Varargs.java:64:6
;;@ varargs/Varargs.java:65:6
(call $$clinit__void_<once>[email protected] )
)
)
Expand Down

0 comments on commit e2293ba

Please sign in to comment.