From 3ead46467198411b55eaacc288e5c3d06d58ee4c Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 1 Feb 2018 17:41:11 +0300 Subject: [PATCH] JS: fix callable reference with implicit extension receiver (KT-22638 fixed) --- .../box/callableReference/bound/emptyLHS.kt | 28 ++++++++++++++++++ .../bound/kCallableNameIntrinsic.kt | 2 ++ .../jetbrains/kotlin/js/test/BasicBoxTest.kt | 29 ++++++++++++------- .../reference/CallableReferenceTranslator.kt | 4 +-- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/compiler/testData/codegen/box/callableReference/bound/emptyLHS.kt b/compiler/testData/codegen/box/callableReference/bound/emptyLHS.kt index be2bcc0b918..12aea3c04d3 100644 --- a/compiler/testData/codegen/box/callableReference/bound/emptyLHS.kt +++ b/compiler/testData/codegen/box/callableReference/bound/emptyLHS.kt @@ -53,5 +53,33 @@ fun box(): String { val b = A().B().test() if (b != "A.amf,A.ef,A.amp,A.ep,B.mf,B.mp,B.ef,B.ep,") return "Fail $b" + result = "" + with(A()) { + (::memberFunction)() + (::aExtensionFunction)() + + (::memberProperty)() + (::aExtensionProperty)() + } + if (result != "A.mf,A.ef,A.mp,A.ep,") return "Fail $result" + + result = "" + with(A()) { + with(B()) { + (::aMemberFunction)() + (::aExtensionFunction)() + + (::aMemberProperty)() + (::aExtensionProperty)() + + (::memberFunction)() + (::memberProperty)() + + (::bExtensionFunction)() + (::bExtensionProperty)() + } + } + if (result != "A.amf,A.ef,A.amp,A.ep,B.mf,B.mp,B.ef,B.ep,") return "Fail $result" + return "OK" } diff --git a/compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt b/compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt index 0a9f2d370bf..557e76d4377 100644 --- a/compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt +++ b/compiler/testData/codegen/box/callableReference/bound/kCallableNameIntrinsic.kt @@ -1,3 +1,5 @@ +// SKIP_SOURCEMAP_REMAPPING + fun box(): String { var state = 0 val name = (state++)::toString.name diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index e708574ece5..e8056f281f5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -119,6 +119,7 @@ abstract class BasicBoxTest( val outputFileName = module.outputFileName(outputDir) + ".js" generateJavaScriptFile(file.parent, module, outputFileName, dependencies, friends, modules.size > 1, ENABLE_MULTIPLATFORM.matcher(fileContent).find(), + !SKIP_SOURCEMAP_REMAPPING.matcher(fileContent).find(), outputPrefixFile, outputPostfixFile, mainCallParameters) if (!module.name.endsWith(OLD_MODULE_SUFFIX)) Pair(outputFileName, module) else null @@ -286,6 +287,7 @@ abstract class BasicBoxTest( friends: List, multiModule: Boolean, multiplatform: Boolean, + remap: Boolean, outputPrefixFile: File?, outputPostfixFile: File?, mainCallParameters: MainCallParameters @@ -309,11 +311,11 @@ abstract class BasicBoxTest( val incrementalData = IncrementalData() translateFiles(psiFiles.map(TranslationUnit::SourceFile), outputFile, config, outputPrefixFile, outputPostfixFile, - mainCallParameters, incrementalData) + mainCallParameters, incrementalData, remap) if (module.hasFilesToRecompile) { - checkIncrementalCompilation(sourceDirs, module, kotlinFiles, dependencies, friends, multiModule, multiplatform, outputFile, - outputPrefixFile, outputPostfixFile, mainCallParameters, incrementalData) + checkIncrementalCompilation(sourceDirs, module, kotlinFiles, dependencies, friends, multiModule, multiplatform, remap, + outputFile, outputPrefixFile, outputPostfixFile, mainCallParameters, incrementalData) } } @@ -325,6 +327,7 @@ abstract class BasicBoxTest( friends: List, multiModule: Boolean, multiplatform: Boolean, + remap: Boolean, outputFile: File, outputPrefixFile: File?, outputPostfixFile: File?, @@ -350,7 +353,7 @@ abstract class BasicBoxTest( val recompiledOutputFile = File(outputFile.parentFile, outputFile.nameWithoutExtension + "-recompiled.js") translateFiles(translationUnits, recompiledOutputFile, recompiledConfig, outputPrefixFile, outputPostfixFile, - mainCallParameters, incrementalData) + mainCallParameters, incrementalData, remap) val originalOutput = FileUtil.loadFile(outputFile) val recompiledOutput = removeRecompiledSuffix(FileUtil.loadFile(recompiledOutputFile)) @@ -407,7 +410,8 @@ abstract class BasicBoxTest( outputPrefixFile: File?, outputPostfixFile: File?, mainCallParameters: MainCallParameters, - incrementalData: IncrementalData + incrementalData: IncrementalData, + remap: Boolean ) { val translator = K2JSTranslator(config) val translationResult = translator.translateUnits(ExceptionThrowingReporter, units, mainCallParameters) @@ -450,7 +454,7 @@ abstract class BasicBoxTest( } processJsProgram(translationResult.program, units.filterIsInstance().map { it.file }) - checkSourceMap(outputFile, translationResult.program) + checkSourceMap(outputFile, translationResult.program, remap) } private fun processJsProgram(program: JsProgram, psiFiles: List) { @@ -460,7 +464,7 @@ abstract class BasicBoxTest( program.verifyAst() } - private fun checkSourceMap(outputFile: File, program: JsProgram) { + private fun checkSourceMap(outputFile: File, program: JsProgram, remap: Boolean) { val generatedProgram = JsProgram() generatedProgram.globalBlock.statements += program.globalBlock.statements.map { it.deepCopy() } generatedProgram.accept(object : RecursiveJsVisitor() { @@ -495,12 +499,14 @@ abstract class BasicBoxTest( is SourceMapError -> error("Could not parse source map: ${sourceMapParseResult.message}") } - val remapper = SourceMapLocationRemapper(sourceMap) - remapper.remap(parsedProgram) + if (remap) { + val remapper = SourceMapLocationRemapper(sourceMap) + remapper.remap(parsedProgram) - val codeWithRemappedLines = parsedProgram.toStringWithLineNumbers() + val codeWithRemappedLines = parsedProgram.toStringWithLineNumbers() - TestCase.assertEquals(codeWithLines, codeWithRemappedLines) + TestCase.assertEquals(codeWithLines, codeWithRemappedLines) + } } private fun removeLocationFromBlocks(program: JsProgram) { @@ -709,6 +715,7 @@ abstract class BasicBoxTest( private val NO_INLINE_PATTERN = Pattern.compile("^// *NO_INLINE *$", Pattern.MULTILINE) private val SKIP_NODE_JS = Pattern.compile("^// *SKIP_NODE_JS *$", Pattern.MULTILINE) private val SKIP_MINIFICATION = Pattern.compile("^// *SKIP_MINIFICATION *$", Pattern.MULTILINE) + private val SKIP_SOURCEMAP_REMAPPING = Pattern.compile("^// *SKIP_SOURCEMAP_REMAPPING *$", Pattern.MULTILINE) private val EXPECTED_REACHABLE_NODES_DIRECTIVE = "EXPECTED_REACHABLE_NODES" private val EXPECTED_REACHABLE_NODES = Pattern.compile("^// *$EXPECTED_REACHABLE_NODES_DIRECTIVE: *([0-9]+) *$", Pattern.MULTILINE) private val RECOMPILE_PATTERN = Pattern.compile("^// *RECOMPILE *$", Pattern.MULTILINE) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt index d774b9ac10c..4240a599dbb 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt @@ -57,8 +57,8 @@ object CallableReferenceTranslator { val receiver = (dispatchReceiver ?: extensionReceiver)?.let { when (it) { is TransientReceiver -> null - is ImplicitClassReceiver -> context.getDispatchReceiver(JsDescriptorUtils.getReceiverParameterForReceiver(it)) - is ExtensionReceiver -> JsThisRef() + is ImplicitClassReceiver, is ExtensionReceiver -> + context.getDispatchReceiver(JsDescriptorUtils.getReceiverParameterForReceiver(it)) is ExpressionReceiver -> Translation.translateAsExpression(it.expression, context) else -> throw UnsupportedOperationException("Unsupported receiver value: " + it) }