Remove duplicate of typealiases for javaslang collections
This commit is contained in:
+37
-47
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user