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"
}
+29 -24
View File
@@ -227,34 +227,39 @@ 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 i = 0; var enumEntryList = enumEntries();
var values = []; var i = 0;
for (var entryName in enumEntryList) { var values = [];
if (enumEntryList.hasOwnProperty(entryName)) { for (var entryName in enumEntryList) {
var entryObject = enumEntryList[entryName]; if (enumEntryList.hasOwnProperty(entryName)) {
values[i] = entryObject; var entryObject = enumEntryList[entryName];
entryObject.ordinal$ = i; values[i] = entryObject;
entryObject.name$ = entryName; entryObject.ordinal$ = i;
i++; entryObject.name$ = entryName;
} i++;
} }
enumEntryList.values$ = values;
return enumEntryList;
},
values: function() {
return this.object.values$;
},
valueOf_61zpoe$: function(name) {
return this.object[name];
} }
}) enumEntryList.values$ = values;
return enumEntryList;
};
staticProperties.values = function () {
return this.object.values$;
};
staticProperties.valueOf_61zpoe$ = function (name) {
return this.object[name];
};
return Kotlin.createClass(basesFun, constructor, properties, staticProperties)
}; };
/** /**