From af45e1c5dc969dd964a36c319f2600bb10279240 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Fri, 12 Jul 2019 18:38:47 +0300 Subject: [PATCH] [JS BE] Do not produce source mapping for fake KtElement Fix [KT-26701], [KT-12935] --- .../jetbrains/kotlin/resolve/calls/util/callUtil.kt | 4 ++++ .../kotlin/serialization/js/ast/JsAstSerializer.kt | 3 ++- .../jetbrains/kotlin/js/test/utils/LineCollector.kt | 11 +++++++---- .../kotlin/js/facade/SourceMapBuilderConsumer.java | 2 ++ js/js.translator/testData/lineNumbers/coroutine.kt | 2 +- .../testData/lineNumbers/coroutineNullAssertion.kt | 2 +- .../testData/lineNumbers/delegatedProperty.kt | 2 +- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt index 6927e4cf678..249696038e2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.calls.callUtil +import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.KotlinLookupLocation @@ -246,6 +247,9 @@ val KtElement.isFakeElement: Boolean return file is KtFile && file.doNotAnalyze != null } +val PsiElement.isFakePsiElement: Boolean + get() = this is KtElement && isFakeElement + fun Call.isSafeCall(): Boolean { if (this is CallTransformer.CallForImplicitInvoke) { //implicit safe 'invoke' diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt index 55614607072..1d8f1678db7 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ast/JsAstSerializer.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.js.backend.ast.JsImportedModule import org.jetbrains.kotlin.js.backend.ast.metadata.* import org.jetbrains.kotlin.js.backend.ast.metadata.LocalAlias import org.jetbrains.kotlin.js.backend.ast.metadata.SpecialFunction +import org.jetbrains.kotlin.resolve.calls.callUtil.isFakePsiElement import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.* import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.BinaryOperation.Type.* import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.UnaryOperation.Type.* @@ -666,7 +667,7 @@ class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set source.asSimpleLocation() - is PsiElement -> extractLocation(source) + is PsiElement -> if (!source.isFakePsiElement) extractLocation(source) else null else -> null } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt index 59a38a1a1ea..4e62ad55140 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.js.test.utils import com.intellij.psi.PsiElement import org.jetbrains.kotlin.js.backend.ast.* +import org.jetbrains.kotlin.resolve.calls.callUtil.isFakePsiElement class LineCollector : RecursiveJsVisitor() { val lines = mutableListOf() @@ -34,10 +35,12 @@ class LineCollector : RecursiveJsVisitor() { val source = node.source val line = when (source) { is PsiElement -> { - val file = source.containingFile - val offset = source.node.startOffset - val document = file.viewProvider.document!! - document.getLineNumber(offset) + if (!source.isFakePsiElement) { + val file = source.containingFile + val offset = source.node.startOffset + val document = file.viewProvider.document!! + document.getLineNumber(offset) + } else null } is JsLocationWithSource -> { source.startLine diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/facade/SourceMapBuilderConsumer.java b/js/js.translator/src/org/jetbrains/kotlin/js/facade/SourceMapBuilderConsumer.java index 305dbb33fbe..b6a63e6a5eb 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/facade/SourceMapBuilderConsumer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/facade/SourceMapBuilderConsumer.java @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.backend.ast.JsLocationWithSource; import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver; import org.jetbrains.kotlin.js.sourceMap.SourceMapMappingConsumer; import org.jetbrains.kotlin.js.translate.utils.PsiUtils; +import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; import java.io.*; import java.nio.charset.Charset; @@ -87,6 +88,7 @@ public class SourceMapBuilderConsumer implements SourceLocationConsumer { } if (sourceInfo instanceof PsiElement) { PsiElement element = (PsiElement) sourceInfo; + if (CallUtilKt.isFakePsiElement(element)) return; try { JsLocation location = PsiUtils.extractLocationFromPsi(element, pathResolver); PsiFile psiFile = element.getContainingFile(); diff --git a/js/js.translator/testData/lineNumbers/coroutine.kt b/js/js.translator/testData/lineNumbers/coroutine.kt index 58b995fa602..4e936587164 100644 --- a/js/js.translator/testData/lineNumbers/coroutine.kt +++ b/js/js.translator/testData/lineNumbers/coroutine.kt @@ -14,4 +14,4 @@ suspend fun bar(): Unit { println(a + b) } -// LINES: 38 4 4 4 5 5 44 44 5 89 44 5 5 6 4 4 4 15 9 9 9 * 15 10 10 11 11 11 2 11 11 * 11 12 12 13 13 13 2 13 13 13 13 14 14 * 15 9 9 9 9 \ No newline at end of file +// LINES: 38 4 4 4 5 5 44 44 5 89 44 5 5 6 4 4 4 15 9 9 9 * 15 10 10 11 11 11 11 11 * 11 12 12 13 13 13 13 13 13 13 14 14 * 15 9 9 9 9 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt b/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt index 0d2449b4774..20691a7181b 100644 --- a/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt +++ b/js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt @@ -8,4 +8,4 @@ suspend fun foo() { suspend fun delay() { } -// LINES: 6 1 1 * 6 2 2 2 2 2 * 3 3 4 4 4 2 4 4 5 5 * 6 1 1 1 1 9 \ No newline at end of file +// LINES: 6 1 1 * 6 2 2 2 2 2 * 3 3 4 4 4 4 4 5 5 * 6 1 1 1 1 9 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/delegatedProperty.kt b/js/js.translator/testData/lineNumbers/delegatedProperty.kt index 34ac21a74e8..4a362bad167 100644 --- a/js/js.translator/testData/lineNumbers/delegatedProperty.kt +++ b/js/js.translator/testData/lineNumbers/delegatedProperty.kt @@ -15,4 +15,4 @@ class B { } } -// LINES: 3 4 5 * 4 4 4 2 * 8 11 10 10 15 14 14 \ No newline at end of file +// LINES: 3 4 5 * 4 4 4 * 8 11 10 10 15 14 14 \ No newline at end of file