This commit is contained in:
Dmitriy Novozhilov
2019-11-25 14:44:32 +03:00
parent 4fc554fa9a
commit 3e336913b6
4 changed files with 44 additions and 3 deletions

View File

@@ -8,7 +8,7 @@ buildscript {
extra["defaultSnapshotVersion"] = "1.3-SNAPSHOT"
val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true
kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap("1.3.70-dev-1416", cacheRedirectorEnabled))
kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap("1.3.70-dev-1806", cacheRedirectorEnabled))
repositories {
bootstrapKotlinRepo?.let(::maven)

View File

@@ -638,9 +638,9 @@ class FirDataFlowAnalyzer(private val components: FirAbstractBodyResolveTransfor
* x.length
* }
*/
val realVariable = getOrCreateRealVariable(variable)
requireNotNull(realVariable)
variableStorage[initializer]?.takeIf { it.isSynthetic() }?.let { initializerVariable ->
val realVariable = getOrCreateRealVariable(variable)
requireNotNull(realVariable)
logicSystem.changeVariableForConditionFlow(node.flow, initializerVariable, realVariable)
}
@@ -648,6 +648,21 @@ class FirDataFlowAnalyzer(private val components: FirAbstractBodyResolveTransfor
getOrCreateRealVariable(initializer)?.let { rhsVariable ->
variableStorage.createAliasVariable(variable.symbol, rhsVariable)
}
getRealVariablesForSafeCallChain(initializer).takeIf { it.isNotEmpty() }?.let {
val flow = node.flow
for (variableFromSafeCall in it) {
logicSystem.addConditionalInfo(
flow,
variableFromSafeCall,
ConditionalFirDataFlowInfo(
NotEqNull,
realVariable,
FirDataFlowInfo(setOf(session.builtinTypes.anyType.coneTypeUnsafe()), emptySet())
)
)
}
}
}
fun exitVariableAssignment(assignment: FirVariableAssignment) {

View File

@@ -0,0 +1,21 @@
interface A {
fun foo(): Int
val x: Int
fun bar()
}
fun test_1(a: A?) {
val x = a?.x
if (x != null) {
a.bar()
}
}
fun test_2(a: A?) {
val x = a?.foo()
if (x != null) {
a.bar()
}
}

View File

@@ -118,6 +118,11 @@ public class FirDiagnosticsWithCfgTestGenerated extends AbstractFirDiagnosticsWi
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/smartcasts"), Pattern.compile("^([^.]+)\\.kt$"), true);
}
@TestMetadata("anotherBoundSmartcasts.kt")
public void testAnotherBoundSmartcasts() throws Exception {
runTest("compiler/fir/resolve/testData/resolve/smartcasts/anotherBoundSmartcasts.kt");
}
@TestMetadata("bangbang.kt")
public void testBangbang() throws Exception {
runTest("compiler/fir/resolve/testData/resolve/smartcasts/bangbang.kt");