JS backend: fixed crash when use lambda or local function inside enum method.
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
@@ -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"
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user