JS backend: fixed crash when use lambda or local function inside enum method.

This commit is contained in:
Zalim Bashorov
2014-09-24 00:31:53 +04:00
parent 878ebb9575
commit ef60a7f776
3 changed files with 54 additions and 24 deletions
@@ -150,4 +150,8 @@ public class FunctionTest extends AbstractExpressionTest {
public void testInfixCall() throws Exception { public void testInfixCall() throws Exception {
checkFooBoxIsOk(); checkFooBoxIsOk();
} }
public void testLambdaOrLocalFunInsideEnumMethod() throws Exception {
checkFooBoxIsOk();
}
} }
@@ -0,0 +1,21 @@
package foo
enum class Foo {
BAR
fun test(): () -> String {
fun local() = 29
val lambda = { "OK" + local() }
assertEquals(29, local())
assertEquals("OK29", lambda())
return lambda
}
}
fun box(): String {
assertEquals("OK29", Foo.BAR.test()())
return "OK"
}
+16 -11
View File
@@ -227,13 +227,15 @@ var Kotlin = {};
* @param {?=} constructor * @param {?=} constructor
* @param {function():Object} enumEntries * @param {function():Object} enumEntries
* @param {Object=} properties * @param {Object=} properties
* @param {Object=} staticProperties
* @returns {*} * @returns {*}
*/ */
Kotlin.createEnumClass = function (basesFun, constructor, enumEntries, properties) { Kotlin.createEnumClass = function (basesFun, constructor, enumEntries, properties, staticProperties) {
return Kotlin.createClass( staticProperties = staticProperties || {};
basesFun, constructor, properties, {
object_initializer$: function () { // TODO use Object.assign
var enumEntryList = enumEntries() staticProperties.object_initializer$ = function () {
var enumEntryList = enumEntries();
var i = 0; var i = 0;
var values = []; var values = [];
for (var entryName in enumEntryList) { for (var entryName in enumEntryList) {
@@ -247,14 +249,17 @@ var Kotlin = {};
} }
enumEntryList.values$ = values; enumEntryList.values$ = values;
return enumEntryList; return enumEntryList;
}, };
values: function() {
staticProperties.values = function () {
return this.object.values$; return this.object.values$;
}, };
valueOf_61zpoe$: function(name) {
staticProperties.valueOf_61zpoe$ = function (name) {
return this.object[name]; return this.object[name];
} };
})
return Kotlin.createClass(basesFun, constructor, properties, staticProperties)
}; };
/** /**