diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionFunctionTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionFunctionTest.java index 4108553cf48..dce26880d18 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionFunctionTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ExtensionFunctionTest.java @@ -66,4 +66,8 @@ public final class ExtensionFunctionTest extends SingleFileTranslationTest { public void testExtensionFunctionCalledFromExtensionFunction() throws Exception { fooBoxTest(); } + + public void testExtensionFunctionCalledFromFor() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java index d6e28144f7c..8f70fdc5e87 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java @@ -31,9 +31,7 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.reference.CallBuilder; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getHasNextCallable; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getIteratorFunction; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getNextFunction; +import static org.jetbrains.k2js.translate.utils.BindingUtils.*; import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToBlock; import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody; @@ -104,7 +102,7 @@ public final class IteratorForTranslator extends ForTranslator { // kotlin iterator define hasNext as property, but java util as function, our js side expects as property private static boolean isJavaUtilIterator(CallableDescriptor descriptor) { - final DeclarationDescriptor declaration = descriptor.getContainingDeclaration(); + DeclarationDescriptor declaration = descriptor.getContainingDeclaration(); return declaration != null && declaration.getName().getName().equals("Iterator"); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallBuilder.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallBuilder.java index 4e26d07b6b4..4cd670eaf15 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallBuilder.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallBuilder.java @@ -107,8 +107,10 @@ public final class CallBuilder { private CallTranslator finish() { if (resolvedCall == null) { assert descriptor != null; - resolvedCall = ResolvedCallImpl.create(ResolutionCandidate.create(descriptor, false), - TemporaryBindingTrace.create(new BindingTraceContext())); //todo + resolvedCall = ResolvedCallImpl.create(ResolutionCandidate.create(descriptor, descriptor.getExpectedThisObject(), + descriptor.getReceiverParameter(), + ExplicitReceiverKind.THIS_OBJECT, false), + TemporaryBindingTrace.create(new BindingTraceContext())); } if (descriptor == null) { descriptor = resolvedCall.getCandidateDescriptor().getOriginal(); diff --git a/js/js.translator/testFiles/extensionFunction/cases/extensionFunctionCalledFromFor.kt b/js/js.translator/testFiles/extensionFunction/cases/extensionFunctionCalledFromFor.kt new file mode 100644 index 00000000000..98f24fe5da3 --- /dev/null +++ b/js/js.translator/testFiles/extensionFunction/cases/extensionFunctionCalledFromFor.kt @@ -0,0 +1,33 @@ +package foo + +class SimpleEnumerator { + private var counter = 0 + + fun getNext(): String { + counter++; + return counter.toString() + } + + fun hasMoreElements(): Boolean = counter < 1 +} + +class SimpleEnumeratorWrapper(private val enumerator: SimpleEnumerator) { + val hasNext: Boolean + get() = enumerator.hasMoreElements() + + fun next() = enumerator.getNext() +} + +fun SimpleEnumerator.iterator(): SimpleEnumeratorWrapper { + return SimpleEnumeratorWrapper(this) +} + +fun box(): Boolean { + var o = "" + val enumerator = SimpleEnumerator() + for (s in enumerator) { + o += s; + } + + return o == "1" +} \ No newline at end of file