From 24252b64d044db9ddc5576f4608ed8f29ff59f79 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 Sep 2015 11:17:31 +0300 Subject: [PATCH] Test and fix for NPE in CFA #KT-9078 Fixed #EA-71535 Fixed --- .../kotlin/cfg/JetFlowInformationProvider.java | 1 + .../diagnostics/testsWithStdLib/kt9078.kt | 12 ++++++++++++ .../diagnostics/testsWithStdLib/kt9078.txt | 17 +++++++++++++++++ .../JetDiagnosticsTestWithStdLibGenerated.java | 6 ++++++ 4 files changed, 36 insertions(+) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/kt9078.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/kt9078.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java index 988f8d52c8d..5e2f5631e37 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java @@ -587,6 +587,7 @@ public class JetFlowInformationProvider { @NotNull Map>> initializersMap ) { Edges> initializers = initializersMap.get(pseudocode.getExitInstruction()); + if (initializers == null) return; Set declaredVariables = getPseudocodeVariablesData().getDeclaredVariables(pseudocode, false); for (VariableDescriptor variable : declaredVariables) { if (variable instanceof PropertyDescriptor) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/kt9078.kt b/compiler/testData/diagnostics/testsWithStdLib/kt9078.kt new file mode 100644 index 00000000000..772756199f8 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/kt9078.kt @@ -0,0 +1,12 @@ +// KT-9078 (NPE in control flow analysis); EA-71535 +abstract class KFunctionKt9005WorkAround(private val _functionInstance: Function): kotlin.reflect.KCallable { + private val _reflectedFunction: kotlin.reflect.KFunction = _functionInstance.reflect() ?: throw IllegalStateException("") + + private val _parameters: List = run { + _functionInstance.javaClass.methods.first().parameters.map { + object : kotlin.reflect.KParameter { + override val index: Int = 0 + } + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/kt9078.txt b/compiler/testData/diagnostics/testsWithStdLib/kt9078.txt new file mode 100644 index 00000000000..b32c862c382 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/kt9078.txt @@ -0,0 +1,17 @@ +package + +public abstract class KFunctionKt9005WorkAround : kotlin.reflect.KCallable { + public constructor KFunctionKt9005WorkAround(/*0*/ _functionInstance: kotlin.Function) + private final val _functionInstance: kotlin.Function + private final val _parameters: kotlin.List + private final val _reflectedFunction: kotlin.reflect.KFunction + public abstract override /*1*/ /*fake_override*/ val annotations: kotlin.List + public abstract override /*1*/ /*fake_override*/ val name: kotlin.String + public abstract override /*1*/ /*fake_override*/ val parameters: kotlin.List + public abstract override /*1*/ /*fake_override*/ val returnType: kotlin.reflect.KType + public abstract override /*1*/ /*fake_override*/ fun call(/*0*/ vararg args: kotlin.Any? /*kotlin.Array*/): R + public abstract override /*1*/ /*fake_override*/ fun callBy(/*0*/ args: kotlin.Map): R + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 448f21dbac1..d76e3b2b3e9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -53,6 +53,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic doTest(fileName); } + @TestMetadata("kt9078.kt") + public void testKt9078() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/kt9078.kt"); + doTest(fileName); + } + @TestMetadata("outstar.kt") public void testOutstar() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/outstar.kt");