Remove duplicate of typealiases for javaslang collections

This commit is contained in:
Dmitriy Novozhilov
2018-12-20 14:45:23 +03:00
parent 68d2cbf91f
commit efe891bb47
2 changed files with 37 additions and 49 deletions
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.cfg.variable package org.jetbrains.kotlin.cfg.variable
import org.jetbrains.kotlin.cfg.*
import org.jetbrains.kotlin.cfg.pseudocode.Pseudocode import org.jetbrains.kotlin.cfg.pseudocode.Pseudocode
import org.jetbrains.kotlin.cfg.pseudocode.PseudocodeUtil import org.jetbrains.kotlin.cfg.pseudocode.PseudocodeUtil
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction
@@ -22,15 +21,9 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingContextUtils.variableDescriptorForDeclaration import org.jetbrains.kotlin.resolve.BindingContextUtils.variableDescriptorForDeclaration
import org.jetbrains.kotlin.util.javaslang.ImmutableHashMap import org.jetbrains.kotlin.util.javaslang.*
import org.jetbrains.kotlin.util.javaslang.ImmutableMap
import org.jetbrains.kotlin.util.javaslang.component1
import org.jetbrains.kotlin.util.javaslang.component2
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
private typealias ImmutableSet<T> = javaslang.collection.Set<T>
private typealias ImmutableHashSet<T> = javaslang.collection.HashSet<T>
class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingContext: BindingContext) { class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingContext: BindingContext) {
private val containsDoWhile = pseudocode.rootPseudocode.containsDoWhile private val containsDoWhile = pseudocode.rootPseudocode.containsDoWhile
private val pseudocodeVariableDataCollector = private val pseudocodeVariableDataCollector =
@@ -52,7 +45,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
getAllDeclaredVariables(pseudocode, includeInsideLocalDeclarations = true) getAllDeclaredVariables(pseudocode, includeInsideLocalDeclarations = true)
} }
val variableInitializers: Map<Instruction, Edges<ReadOnlyInitControlFlowInfo>> by lazy { val variableInitializers: Map<Instruction, Edges<ReadOnlyInitVariableControlFlowInfo>> by lazy {
computeVariableInitializers() computeVariableInitializers()
} }
@@ -140,7 +133,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
// variable initializers // variable initializers
private fun computeVariableInitializers(): Map<Instruction, Edges<ReadOnlyInitControlFlowInfo>> { private fun computeVariableInitializers(): Map<Instruction, Edges<ReadOnlyInitVariableControlFlowInfo>> {
val blockScopeVariableInfo = pseudocodeVariableDataCollector.blockScopeVariableInfo val blockScopeVariableInfo = pseudocodeVariableDataCollector.blockScopeVariableInfo
@@ -150,8 +143,8 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
return pseudocodeVariableDataCollector.collectData( return pseudocodeVariableDataCollector.collectData(
TraversalOrder.FORWARD, TraversalOrder.FORWARD,
InitControlFlowInfo() InitVariableControlFlowInfo()
) { instruction: Instruction, incomingEdgesData: Collection<InitControlFlowInfo> -> ) { instruction: Instruction, incomingEdgesData: Collection<InitVariableControlFlowInfo> ->
val enterInstructionData = val enterInstructionData =
mergeIncomingEdgesDataForInitializers( mergeIncomingEdgesDataForInitializers(
@@ -169,12 +162,12 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
} }
} }
private fun computeInitInfoForTrivialVals(): Map<Instruction, Edges<ReadOnlyInitControlFlowInfoImpl>> { private fun computeInitInfoForTrivialVals(): Map<Instruction, Edges<ReadOnlyInitVariableControlFlowInfoImpl>> {
val result = hashMapOf<Instruction, Edges<ReadOnlyInitControlFlowInfoImpl>>() val result = hashMapOf<Instruction, Edges<ReadOnlyInitVariableControlFlowInfoImpl>>()
var declaredSet = ImmutableHashSet.empty<VariableDescriptor>() var declaredSet = ImmutableHashSet.empty<VariableDescriptor>()
var initSet = ImmutableHashSet.empty<VariableDescriptor>() var initSet = ImmutableHashSet.empty<VariableDescriptor>()
pseudocode.traverse(TraversalOrder.FORWARD) { instruction -> pseudocode.traverse(TraversalOrder.FORWARD) { instruction ->
val enterState = ReadOnlyInitControlFlowInfoImpl(declaredSet, initSet, null) val enterState = ReadOnlyInitVariableControlFlowInfoImpl(declaredSet, initSet, null)
when (instruction) { when (instruction) {
is VariableDeclarationInstruction -> is VariableDeclarationInstruction ->
extractValWithTrivialInitializer(instruction)?.let { variableDescriptor -> extractValWithTrivialInitializer(instruction)?.let { variableDescriptor ->
@@ -188,7 +181,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
} }
} }
val afterState = ReadOnlyInitControlFlowInfoImpl(declaredSet, initSet, null) val afterState = ReadOnlyInitVariableControlFlowInfoImpl(declaredSet, initSet, null)
result[instruction] = Edges(enterState, afterState) result[instruction] = Edges(enterState, afterState)
} }
@@ -201,26 +194,23 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
// the variable (common variable/parameter/object) has been declared // the variable (common variable/parameter/object) has been declared
element is KtDeclaration element is KtDeclaration
private inner class ReadOnlyInitControlFlowInfoImpl( private inner class ReadOnlyInitVariableControlFlowInfoImpl(
val declaredSet: ImmutableSet<VariableDescriptor>, val declaredSet: ImmutableSet<VariableDescriptor>,
val initSet: ImmutableSet<VariableDescriptor>, val initSet: ImmutableSet<VariableDescriptor>,
private val delegate: ReadOnlyInitControlFlowInfo? private val delegate: ReadOnlyInitVariableControlFlowInfo?
) : ReadOnlyInitControlFlowInfo { ) : ReadOnlyInitVariableControlFlowInfo {
override fun getOrNull(variableDescriptor: VariableDescriptor): VariableControlFlowState? { override fun getOrNull(key: VariableDescriptor): VariableControlFlowState? {
if (variableDescriptor in declaredSet) { if (key in declaredSet) {
return VariableControlFlowState.create( return VariableControlFlowState.create(isInitialized = key in initSet, isDeclared = true)
isInitialized = variableDescriptor in initSet,
isDeclared = true
)
} }
return delegate?.getOrNull(variableDescriptor) return delegate?.getOrNull(key)
} }
override fun checkDefiniteInitializationInWhen(merge: ReadOnlyInitControlFlowInfo): Boolean = override fun checkDefiniteInitializationInWhen(merge: ReadOnlyInitVariableControlFlowInfo): Boolean =
delegate?.checkDefiniteInitializationInWhen(merge) ?: false delegate?.checkDefiniteInitializationInWhen(merge) ?: false
fun replaceDelegate(newDelegate: ReadOnlyInitControlFlowInfo): ReadOnlyInitControlFlowInfo = fun replaceDelegate(newDelegate: ReadOnlyInitVariableControlFlowInfo): ReadOnlyInitVariableControlFlowInfo =
ReadOnlyInitControlFlowInfoImpl(declaredSet, initSet, newDelegate) ReadOnlyInitVariableControlFlowInfoImpl(declaredSet, initSet, newDelegate)
override fun asMap(): ImmutableMap<VariableDescriptor, VariableControlFlowState> { override fun asMap(): ImmutableMap<VariableDescriptor, VariableControlFlowState> {
val initial = delegate?.asMap() ?: ImmutableHashMap.empty() val initial = delegate?.asMap() ?: ImmutableHashMap.empty()
@@ -234,7 +224,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
if (this === other) return true if (this === other) return true
if (javaClass != other?.javaClass) return false if (javaClass != other?.javaClass) return false
other as ReadOnlyInitControlFlowInfoImpl other as ReadOnlyInitVariableControlFlowInfoImpl
if (declaredSet != other.declaredSet) return false if (declaredSet != other.declaredSet) return false
if (initSet != other.initSet) return false if (initSet != other.initSet) return false
@@ -253,9 +243,9 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
private fun addVariableInitStateFromCurrentInstructionIfAny( private fun addVariableInitStateFromCurrentInstructionIfAny(
instruction: Instruction, instruction: Instruction,
enterInstructionData: InitControlFlowInfo, enterInstructionData: InitVariableControlFlowInfo,
blockScopeVariableInfo: BlockScopeVariableInfo blockScopeVariableInfo: BlockScopeVariableInfo
): InitControlFlowInfo { ): InitVariableControlFlowInfo {
if (instruction is MagicInstruction) { if (instruction is MagicInstruction) {
if (instruction.kind === MagicKind.EXHAUSTIVE_WHEN_ELSE) { if (instruction.kind === MagicKind.EXHAUSTIVE_WHEN_ELSE) {
return enterInstructionData.iterator().fold(enterInstructionData) { result, (key, value) -> return enterInstructionData.iterator().fold(enterInstructionData) { result, (key, value) ->
@@ -307,11 +297,11 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
// variable use // variable use
val variableUseStatusData: Map<Instruction, Edges<ReadOnlyUseControlFlowInfo>> val variableUseStatusData: Map<Instruction, Edges<ReadOnlyUseVariableControlFlowInfo>>
get() { get() {
val edgesForTrivialVals = computeUseInfoForTrivialVals() val edgesForTrivialVals = computeUseInfoForTrivialVals()
if (rootVariables.nonTrivialVariables.isEmpty()) { if (rootVariables.nonTrivialVariables.isEmpty()) {
return hashMapOf<Instruction, Edges<ReadOnlyUseControlFlowInfo>>().apply { return hashMapOf<Instruction, Edges<ReadOnlyUseVariableControlFlowInfo>>().apply {
pseudocode.traverse(TraversalOrder.FORWARD) { instruction -> pseudocode.traverse(TraversalOrder.FORWARD) { instruction ->
put(instruction, edgesForTrivialVals) put(instruction, edgesForTrivialVals)
} }
@@ -320,13 +310,13 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
return pseudocodeVariableDataCollector.collectData( return pseudocodeVariableDataCollector.collectData(
TraversalOrder.BACKWARD, TraversalOrder.BACKWARD,
UseControlFlowInfo() UseVariableControlFlowInfo()
) { instruction: Instruction, incomingEdgesData: Collection<UseControlFlowInfo> -> ) { instruction: Instruction, incomingEdgesData: Collection<UseVariableControlFlowInfo> ->
val enterResult: UseControlFlowInfo = if (incomingEdgesData.size == 1) { val enterResult: UseVariableControlFlowInfo = if (incomingEdgesData.size == 1) {
incomingEdgesData.single() incomingEdgesData.single()
} else { } else {
incomingEdgesData.fold(UseControlFlowInfo()) { result, edgeData -> incomingEdgesData.fold(UseVariableControlFlowInfo()) { result, edgeData ->
edgeData.iterator().fold(result) { subResult, (variableDescriptor, variableUseState) -> edgeData.iterator().fold(result) { subResult, (variableDescriptor, variableUseState) ->
subResult.put(variableDescriptor, variableUseState.merge(subResult.getOrNull(variableDescriptor))) subResult.put(variableDescriptor, variableUseState.merge(subResult.getOrNull(variableDescriptor)))
} }
@@ -387,14 +377,14 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
private inner class ReadOnlyUseControlFlowInfoImpl( private inner class ReadOnlyUseControlFlowInfoImpl(
val used: Set<VariableDescriptor>, val used: Set<VariableDescriptor>,
val delegate: ReadOnlyUseControlFlowInfo? val delegate: ReadOnlyUseVariableControlFlowInfo?
) : ReadOnlyUseControlFlowInfo { ) : ReadOnlyUseVariableControlFlowInfo {
override fun getOrNull(variableDescriptor: VariableDescriptor): VariableUseState? { override fun getOrNull(key: VariableDescriptor): VariableUseState? {
if (variableDescriptor in used) return VariableUseState.READ if (key in used) return VariableUseState.READ
return delegate?.getOrNull(variableDescriptor) return delegate?.getOrNull(key)
} }
fun replaceDelegate(newDelegate: ReadOnlyUseControlFlowInfo): ReadOnlyUseControlFlowInfo = fun replaceDelegate(newDelegate: ReadOnlyUseVariableControlFlowInfo): ReadOnlyUseVariableControlFlowInfo =
ReadOnlyUseControlFlowInfoImpl(used, newDelegate) ReadOnlyUseControlFlowInfoImpl(used, newDelegate)
override fun asMap(): ImmutableMap<VariableDescriptor, VariableUseState> { override fun asMap(): ImmutableMap<VariableDescriptor, VariableUseState> {
@@ -441,13 +431,13 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
return VariableControlFlowState.create(isInitialized = declaredOutsideThisDeclaration) return VariableControlFlowState.create(isInitialized = declaredOutsideThisDeclaration)
} }
private val EMPTY_INIT_CONTROL_FLOW_INFO = InitControlFlowInfo() private val EMPTY_INIT_CONTROL_FLOW_INFO = InitVariableControlFlowInfo()
private fun mergeIncomingEdgesDataForInitializers( private fun mergeIncomingEdgesDataForInitializers(
instruction: Instruction, instruction: Instruction,
incomingEdgesData: Collection<InitControlFlowInfo>, incomingEdgesData: Collection<InitVariableControlFlowInfo>,
blockScopeVariableInfo: BlockScopeVariableInfo blockScopeVariableInfo: BlockScopeVariableInfo
): InitControlFlowInfo { ): InitVariableControlFlowInfo {
if (incomingEdgesData.size == 1) return incomingEdgesData.single() if (incomingEdgesData.size == 1) return incomingEdgesData.single()
if (incomingEdgesData.isEmpty()) return EMPTY_INIT_CONTROL_FLOW_INFO if (incomingEdgesData.isEmpty()) return EMPTY_INIT_CONTROL_FLOW_INFO
val variablesInScope = linkedSetOf<VariableDescriptor>() val variablesInScope = linkedSetOf<VariableDescriptor>()
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.cfg.variable package org.jetbrains.kotlin.cfg.variable
import org.jetbrains.kotlin.cfg.ControlFlowInfo import org.jetbrains.kotlin.cfg.ControlFlowInfo
import org.jetbrains.kotlin.cfg.ImmutableHashMap
import org.jetbrains.kotlin.cfg.ImmutableMap
import org.jetbrains.kotlin.cfg.ReadOnlyControlFlowInfo import org.jetbrains.kotlin.cfg.ReadOnlyControlFlowInfo
import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.util.javaslang.component1 import org.jetbrains.kotlin.util.javaslang.component1