diff --git a/jslib/src/core/math.kt b/jslib/src/core/math.kt index 394758fe9b0..c4501248fdc 100644 --- a/jslib/src/core/math.kt +++ b/jslib/src/core/math.kt @@ -4,7 +4,6 @@ import js.annotations.native native val Math = object { - native fun random() : Double = 0.0; fun abs(value : Double) = 0.0 fun acos(value : Double) = 0.0 @@ -18,6 +17,7 @@ val Math = object { fun min(vararg values : Double) = 0.0 fun sqrt(value : Double) = 0.0 fun tan(value : Double) = 0.0 + fun log(value : Double) = 0.0 fun pow(base : Double, exp : Double) = 0.0 fun round(value : Double) = 0.0 diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 96b3efa7324..9a745909328 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -395,4 +395,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { JsExpression value = ClassTranslator.generateClassCreationExpression(expression, context); return AstUtil.newVar(propertyName, value); } + + @Override + @NotNull + public JsNode visitNamedFunction(@NotNull JetNamedFunction function, + @NotNull TranslationContext context) { + return FunctionTranslator.newInstance(function, context).translateAsLocalFunction(); + } } diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 4d3a5ea99bc..aee3953fdcb 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -56,9 +56,17 @@ public final class FunctionTranslator extends AbstractTranslator { this.functionBodyContext = functionBodyContext().innerBlock(functionBody); } + + @NotNull + public JsFunction translateAsLocalFunction() { + JsName functionName = context().getNameForElement(functionDeclaration); + JsFunction function = generateFunctionObject(); + function.setName(functionName); + return function; + } + @NotNull public JsPropertyInitializer translateAsMethod() { - assert functionDeclaration instanceof JetElement; JsName functionName = context().getNameForElement(functionDeclaration); JsFunction function = generateFunctionObject(); return new JsPropertyInitializer(functionName.makeRef(), function); diff --git a/translator/test/org/jetbrains/k2js/test/FunctionTest.java b/translator/test/org/jetbrains/k2js/test/FunctionTest.java index 4981b251c5a..3de162115a8 100644 --- a/translator/test/org/jetbrains/k2js/test/FunctionTest.java +++ b/translator/test/org/jetbrains/k2js/test/FunctionTest.java @@ -86,4 +86,8 @@ public class FunctionTest extends AbstractExpressionTest { System.out.println(e); } } + + public void testFunctionInsideFunction() throws Exception { + testFooBoxIsTrue("functionInsideFunction.kt"); + } } diff --git a/translator/testFiles/expression/function/cases/functionInsideFunction.kt b/translator/testFiles/expression/function/cases/functionInsideFunction.kt new file mode 100644 index 00000000000..fcb2a69895f --- /dev/null +++ b/translator/testFiles/expression/function/cases/functionInsideFunction.kt @@ -0,0 +1,19 @@ +package foo + + +fun box() : Boolean{ + fun f() = 3 + + return (((f() + f()) == 6) && (b() == 24)) +} + + +fun b() : Int { + + fun a() : Int { + fun c() = 4 + return c() * 3 + } + val a = 2 + return a() * a +} \ No newline at end of file