Minor refactoring: DelegatingDataFlowInfo.create()

This commit is contained in:
Mikhail Glukhikh
2016-01-21 16:34:43 +03:00
parent 366ab508e1
commit e04338f4fa
@@ -28,18 +28,18 @@ import java.util.*
import org.jetbrains.kotlin.resolve.calls.smartcasts.Nullability.NOT_NULL import org.jetbrains.kotlin.resolve.calls.smartcasts.Nullability.NOT_NULL
internal class DelegatingDataFlowInfo private constructor( internal class DelegatingDataFlowInfo private constructor(
private val parent: DataFlowInfo? = null, private val parent: DataFlowInfo?,
private val nullabilityInfo: ImmutableMap<DataFlowValue, Nullability> = ImmutableMap.of(), private val nullabilityInfo: ImmutableMap<DataFlowValue, Nullability>,
// Also immutable // Also immutable
private val typeInfo: SetMultimap<DataFlowValue, KotlinType> = newTypeInfo(), private val typeInfo: SetMultimap<DataFlowValue, KotlinType>,
/** /**
* Value for which type info was cleared or reassigned at this point * Value for which type info was cleared or reassigned at this point
* so parent type info should not be in use * so parent type info should not be in use
*/ */
private val valueWithGivenTypeInfo: DataFlowValue? = null private val valueWithGivenTypeInfo: DataFlowValue?
) : DataFlowInfo { ) : DataFlowInfo {
constructor(): this(null) constructor(): this(null, ImmutableMap.of(), newTypeInfo(), null)
override val completeNullabilityInfo: Map<DataFlowValue, Nullability> override val completeNullabilityInfo: Map<DataFlowValue, Nullability>
get() { get() {
@@ -129,11 +129,7 @@ internal class DelegatingDataFlowInfo private constructor(
override fun clearValueInfo(value: DataFlowValue): DataFlowInfo { override fun clearValueInfo(value: DataFlowValue): DataFlowInfo {
val builder = Maps.newHashMap<DataFlowValue, Nullability>() val builder = Maps.newHashMap<DataFlowValue, Nullability>()
putNullability(builder, value, Nullability.UNKNOWN) putNullability(builder, value, Nullability.UNKNOWN)
return DelegatingDataFlowInfo( return create(this, ImmutableMap.copyOf(builder), EMPTY_TYPE_INFO, value)
this,
ImmutableMap.copyOf(builder),
EMPTY_TYPE_INFO,
value)
} }
override fun assign(a: DataFlowValue, b: DataFlowValue): DataFlowInfo { override fun assign(a: DataFlowValue, b: DataFlowValue): DataFlowInfo {
@@ -152,11 +148,7 @@ internal class DelegatingDataFlowInfo private constructor(
} }
newTypeInfo.putAll(a, typesForB) newTypeInfo.putAll(a, typesForB)
return DelegatingDataFlowInfo( return create(this, ImmutableMap.copyOf(nullability), if (newTypeInfo.isEmpty) EMPTY_TYPE_INFO else newTypeInfo, a)
this,
ImmutableMap.copyOf(nullability),
if (newTypeInfo.isEmpty) EMPTY_TYPE_INFO else newTypeInfo,
a)
} }
override fun equate(a: DataFlowValue, b: DataFlowValue): DataFlowInfo { override fun equate(a: DataFlowValue, b: DataFlowValue): DataFlowInfo {
@@ -185,7 +177,7 @@ internal class DelegatingDataFlowInfo private constructor(
this this
} }
else { else {
DelegatingDataFlowInfo(this, ImmutableMap.copyOf(builder), if (newTypeInfo.isEmpty) EMPTY_TYPE_INFO else newTypeInfo) create(this, ImmutableMap.copyOf(builder), if (newTypeInfo.isEmpty) EMPTY_TYPE_INFO else newTypeInfo)
} }
} }
@@ -219,7 +211,7 @@ internal class DelegatingDataFlowInfo private constructor(
var changed = putNullability(builder, a, nullabilityOfA.refine(nullabilityOfB.invert())) or var changed = putNullability(builder, a, nullabilityOfA.refine(nullabilityOfB.invert())) or
putNullability(builder, b, nullabilityOfB.refine(nullabilityOfA.invert())) putNullability(builder, b, nullabilityOfB.refine(nullabilityOfA.invert()))
return if (changed) DelegatingDataFlowInfo(this, ImmutableMap.copyOf(builder), EMPTY_TYPE_INFO) else this return if (changed) create(this, ImmutableMap.copyOf(builder), EMPTY_TYPE_INFO) else this
} }
override fun establishSubtyping(value: DataFlowValue, type: KotlinType): DataFlowInfo { override fun establishSubtyping(value: DataFlowValue, type: KotlinType): DataFlowInfo {
@@ -228,7 +220,7 @@ internal class DelegatingDataFlowInfo private constructor(
if (!value.type.isFlexible() && value.type.isSubtypeOf(type)) return this if (!value.type.isFlexible() && value.type.isSubtypeOf(type)) return this
val newNullabilityInfo = if (type.isMarkedNullable) EMPTY_NULLABILITY_INFO else ImmutableMap.of(value, NOT_NULL) val newNullabilityInfo = if (type.isMarkedNullable) EMPTY_NULLABILITY_INFO else ImmutableMap.of(value, NOT_NULL)
val newTypeInfo = ImmutableSetMultimap.of(value, type) val newTypeInfo = ImmutableSetMultimap.of(value, type)
return DelegatingDataFlowInfo(this, newNullabilityInfo, newTypeInfo) return create(this, newNullabilityInfo, newTypeInfo)
} }
override fun and(other: DataFlowInfo): DataFlowInfo { override fun and(other: DataFlowInfo): DataFlowInfo {
@@ -253,7 +245,7 @@ internal class DelegatingDataFlowInfo private constructor(
return this return this
} }
return DelegatingDataFlowInfo(this, ImmutableMap.copyOf(nullabilityMapBuilder), otherTypeInfo) return create(this, ImmutableMap.copyOf(nullabilityMapBuilder), otherTypeInfo)
} }
private fun Set<KotlinType>.containsNothing() = any { KotlinBuiltIns.isNothing(it) } private fun Set<KotlinType>.containsNothing() = any { KotlinBuiltIns.isNothing(it) }
@@ -288,7 +280,7 @@ internal class DelegatingDataFlowInfo private constructor(
return DataFlowInfo.EMPTY return DataFlowInfo.EMPTY
} }
return DelegatingDataFlowInfo(null, ImmutableMap.copyOf(nullabilityMapBuilder), newTypeInfo) return create(null, ImmutableMap.copyOf(nullabilityMapBuilder), newTypeInfo)
} }
override fun toString() = if (typeInfo.isEmpty && nullabilityInfo.isEmpty()) "EMPTY" else "Non-trivial DataFlowInfo" override fun toString() = if (typeInfo.isEmpty && nullabilityInfo.isEmpty()) "EMPTY" else "Non-trivial DataFlowInfo"
@@ -301,5 +293,13 @@ internal class DelegatingDataFlowInfo private constructor(
first.entries().containsAll(second.entries()) first.entries().containsAll(second.entries())
fun newTypeInfo(): SetMultimap<DataFlowValue, KotlinType> = LinkedHashMultimap.create<DataFlowValue, KotlinType>() fun newTypeInfo(): SetMultimap<DataFlowValue, KotlinType> = LinkedHashMultimap.create<DataFlowValue, KotlinType>()
private fun create(parent: DataFlowInfo?,
nullabilityInfo: ImmutableMap<DataFlowValue, Nullability>,
typeInfo: SetMultimap<DataFlowValue, KotlinType>,
valueWithGivenTypeInfo: DataFlowValue? = null
): DelegatingDataFlowInfo {
return DelegatingDataFlowInfo(parent, nullabilityInfo, typeInfo, valueWithGivenTypeInfo)
}
} }
} }