JS: fix callable reference with implicit extension receiver (KT-22638 fixed)
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
// SKIP_SOURCEMAP_REMAPPING
|
||||
|
||||
fun box(): String {
|
||||
var state = 0
|
||||
val name = (state++)::toString.name
|
||||
|
||||
@@ -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<String>,
|
||||
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<String>,
|
||||
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<TranslationUnit.SourceFile>().map { it.file })
|
||||
checkSourceMap(outputFile, translationResult.program)
|
||||
checkSourceMap(outputFile, translationResult.program, remap)
|
||||
}
|
||||
|
||||
private fun processJsProgram(program: JsProgram, psiFiles: List<KtFile>) {
|
||||
@@ -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)
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user