957b100cd1
SyntheticAccessorLowering was initially implemented under the assumption that any access to an invisible declaration will cause an accessor to be generated _in the same file_. Moreover, it's declared in the group of phases that are performed by file. But this assumption is incorrect for constructors which need to be hidden (those which take parameters of inline class types), since such constructor is public and can be called from anywhere. In this case, SyntheticAccessorLowering actually generated a new accessor for the hidden constructor for each (!) source file where that constructor is called, which led to ClassFormatError because of the class file having multiple methods with the same signature. The internal `functionMap` cache didn't help because it's not shared among phase instances for different files (well, it helped to generate not more than one accessor per usage-file). In this change, we use the global cache, stored in JvmBackendContext, for accessors to hidden constructors. Note that after this change, calls to hidden constructors are always transformed to the corresponding accessor in SyntheticAccessorLowering right away, but that accessor might be orphaned for a while (not declared in any parent's declarations). Only when SyntheticAccessorLowering encounters the original constructor which needs to be hidden, it adds the accessor beside it. The test is sensitive to the file order, so both variants are added.
JavaScript Translation
This module performs the translation of Kotlin source code to JavaScript.
There are various Kotlin APIs to JavaScript environments in the standard library.
Compiling the Kotlin Standard Library for JavaScript
The Kotlin Standard Library for JS is built with gradle, see the corresponding module's ReadMe.
Reusing JVM based test cases in JavaScript
Any Kotlin test cases using the org.junit.Test annotation and the kotlin.test package, such as this test case are automatically converted to JavaScript using QUnit.
This allows the test cases to be run directly in a web page in any web browser.
Using the Kotlin Library in JavaScript
There is a simple sample which shows how to use the Kotlin Standard Library from inside JavaScript in a web page.
Contributing
We love contributions! The JavaScript translation could really use your help! If you fancy contributing:
- check the contributing section on general stuff like getting the code etc
- try fix one of the pending JavaScript translation issues