From ad1978940bffd48297faf1e55b5d65a3269b7705 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 7 Dec 2017 04:03:36 +0300 Subject: [PATCH] Recompile inline function usages in JS when offset is changed Otherwise source maps would differ after rebuild --- .../incremental/js/IncrementalResultsConsumer.kt | 13 +++++++------ .../js/translate/expression/FunctionTranslator.kt | 11 ++++++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt b/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt index ed87dd374ca..73f4bf4a478 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalResultsConsumer.kt @@ -28,7 +28,7 @@ interface IncrementalResultsConsumer { * but [Any] is used to avoid classloader conflicts in tests where the compiler is isolated * (such as [JsProtoComparisonTestGenerated]) */ - fun processInlineFunction(sourceFile: File, fqName: String, inlineFunction: Any) + fun processInlineFunction(sourceFile: File, fqName: String, inlineFunction: Any, line: Int, column: Int) } class IncrementalResultsConsumerImpl : IncrementalResultsConsumer { @@ -39,7 +39,8 @@ class IncrementalResultsConsumerImpl : IncrementalResultsConsumer { val packageParts: Map get() = _packageParts - private val _inlineFuncs = hashMapOf>() + private class FunctionWithSourceInfo(val expression: Any, val line: Int, val column: Int) + private val _inlineFuncs = hashMapOf>() val inlineFunctions: Map> get() { val result = HashMap>(_inlineFuncs.size) @@ -47,8 +48,8 @@ class IncrementalResultsConsumerImpl : IncrementalResultsConsumer { for ((file, inlineFnsFromFile) in _inlineFuncs) { val functionsHashes = HashMap(inlineFnsFromFile.size) - for ((fqName, expression) in inlineFnsFromFile) { - functionsHashes[fqName] = expression.toString().toByteArray().md5() + for ((fqName, fn) in inlineFnsFromFile) { + functionsHashes[fqName] = "(${fn.line}:${fn.column})${fn.expression}".toByteArray().md5() } result[file] = functionsHashes @@ -65,9 +66,9 @@ class IncrementalResultsConsumerImpl : IncrementalResultsConsumer { _packageParts.put(sourceFile, TranslationResultValue(packagePartMetadata, binaryAst)) } - override fun processInlineFunction(sourceFile: File, fqName: String, inlineFunction: Any) { + override fun processInlineFunction(sourceFile: File, fqName: String, inlineFunction: Any, line: Int, column: Int) { val mapForSource = _inlineFuncs.getOrPut(sourceFile) { hashMapOf() } - mapForSource[fqName] = inlineFunction + mapForSource[fqName] = FunctionWithSourceInfo(inlineFunction, line, column) } private fun ByteArray.md5(): Long { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt index 89a2afe37bb..9f67c613292 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt @@ -120,7 +120,16 @@ fun TranslationContext.wrapWithInlineMetadata( else -> descriptor.fqNameSafe.asString() } - processInlineFunction(file, fqName, functionWithMetadata) + val offset = sourceInfo?.node?.startOffset + val document = psiFile.viewProvider.document + var sourceLine = -1 + var sourceColumn = -1 + if (offset != null && document != null) { + sourceLine = document.getLineNumber(offset) + sourceColumn = offset - document.getLineStartOffset(sourceLine) + } + + processInlineFunction(file, fqName, functionWithMetadata, sourceLine, sourceColumn) } functionWithMetadata