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 {
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 {function():Object} enumEntries
* @param {Object=} properties
* @param {Object=} staticProperties
* @returns {*}
*/
Kotlin.createEnumClass = function (basesFun, constructor, enumEntries, properties) {
return Kotlin.createClass(
basesFun, constructor, properties, {
object_initializer$: function () {
var enumEntryList = enumEntries()
var i = 0;
var values = [];
for (var entryName in enumEntryList) {
if (enumEntryList.hasOwnProperty(entryName)) {
var entryObject = enumEntryList[entryName];
values[i] = entryObject;
entryObject.ordinal$ = i;
entryObject.name$ = entryName;
i++;
}
Kotlin.createEnumClass = function (basesFun, constructor, enumEntries, properties, staticProperties) {
staticProperties = staticProperties || {};
// TODO use Object.assign
staticProperties.object_initializer$ = function () {
var enumEntryList = enumEntries();
var i = 0;
var values = [];
for (var entryName in enumEntryList) {
if (enumEntryList.hasOwnProperty(entryName)) {
var entryObject = enumEntryList[entryName];
values[i] = entryObject;
entryObject.ordinal$ = 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)
};
/**