removed InstructionDataMergeStrategy, InstructionDataAnalyzeStrategy

interfaces from PseudocodeTraverse
(use only in Java as type aliases to simplify function type parameters)
This commit is contained in:
Svetlana Isakova
2014-03-03 14:42:37 +04:00
parent dab9f6997a
commit d2bdb3cb6d
4 changed files with 17 additions and 15 deletions
@@ -23,11 +23,11 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import kotlin.Function1;
import kotlin.Function3;
import kotlin.Unit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.InstructionDataAnalyzeStrategy;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage;
import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableInitState;
import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState;
@@ -267,7 +267,7 @@ public class JetFlowInformationProvider {
PseudocodeTraverserPackage.traverse(
pseudocode, FORWARD, initializers,
new InstructionDataAnalyzeStrategyJ<Map<VariableDescriptor, PseudocodeVariablesData.VariableInitState>>() {
new InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableInitState>>() {
@Override
public void execute(@NotNull Instruction instruction,
@Nullable Map<VariableDescriptor, VariableInitState> in,
@@ -517,7 +517,7 @@ public class JetFlowInformationProvider {
Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData();
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseState>> variableStatusAnalyzeStrategy =
new InstructionDataAnalyzeStrategyJ<Map<VariableDescriptor, PseudocodeVariablesData.VariableUseState>>() {
new InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseState>>() {
@Override
public void execute(@NotNull Instruction instruction,
@Nullable Map<VariableDescriptor, VariableUseState> in,
@@ -885,7 +885,7 @@ public class JetFlowInformationProvider {
}
//TODO after KT-4621 rewrite to Kotlin
public abstract static class InstructionDataAnalyzeStrategyJ<D> implements InstructionDataAnalyzeStrategy<D> {
public abstract static class InstructionDataAnalyzeStrategy<D> implements Function3<Instruction, D, D, Unit> {
@Override
public Unit invoke(Instruction instruction, D enterData, D exitData) {
execute(instruction, enterData, exitData);
@@ -60,16 +60,16 @@ fun Pseudocode.traverse(
fun <D> Pseudocode.traverse(
traversalOrder: TraversalOrder,
edgesMap: Map<Instruction, Edges<D>>,
instructionDataAnalyzeStrategy: InstructionDataAnalyzeStrategy<D>
analyzeInstruction: (Instruction, D, D) -> Unit
) {
val instructions = getInstructions(traversalOrder)
for (instruction in instructions) {
if (instruction is LocalFunctionDeclarationInstruction) {
instruction.getBody().traverse(traversalOrder, edgesMap, instructionDataAnalyzeStrategy)
instruction.getBody().traverse(traversalOrder, edgesMap, analyzeInstruction)
}
val edges = edgesMap.get(instruction)
if (edges != null) {
instructionDataAnalyzeStrategy(instruction, edges.`in`, edges.out)
analyzeInstruction(instruction, edges.`in`, edges.out)
}
}
}
@@ -185,9 +185,6 @@ private fun <D> Pseudocode.collectDataFromSubgraph(
}
}
trait InstructionDataMergeStrategy<D> : (Instruction, Collection<D>) -> Edges<D>
trait InstructionDataAnalyzeStrategy<D> : (Instruction, D, D) -> Unit
data class Edges<T>(val `in`: T, val out: T)
fun <T> createEdges(`in`: T, out: T) = Edges(`in`, out)
@@ -41,11 +41,13 @@ public class PseudocodeVariableDataCollector(
public fun <D> collectData(
traversalOrder: TraversalOrder,
mergeDataWithLocalDeclarations: Boolean,
instructionDataMergeStrategy: InstructionDataMergeStrategy<MutableMap<VariableDescriptor, D>>
instructionDataMergeStrategy: InstructionDataMergeStrategy<D>
): MutableMap<Instruction, Edges<MutableMap<VariableDescriptor, D>>> {
val result = pseudocode.collectData(
traversalOrder, mergeDataWithLocalDeclarations,
instructionDataMergeStrategy as InstructionDataMergeStrategy<Map<VariableDescriptor, D>>,
//see KT-4605
instructionDataMergeStrategy as
(Instruction, Collection<Map<VariableDescriptor, D>>) -> Edges<Map<VariableDescriptor, D>>,
{ (from, to, data) -> filterOutVariablesOutOfScope(from, to, data)},
Collections.emptyMap<VariableDescriptor, D>())
//see KT-4605
@@ -88,6 +90,10 @@ public class PseudocodeVariableDataCollector(
}
}
//todo may be a type alias
trait InstructionDataMergeStrategy<D> :
(Instruction, Collection<MutableMap<VariableDescriptor, D>>) -> Edges<MutableMap<VariableDescriptor, D>>
public trait LexicalScopeVariableInfo {
val declaredIn : Map<VariableDescriptor, LexicalScope>
val scopeVariables : Map<LexicalScope, Collection<VariableDescriptor>>
@@ -23,7 +23,6 @@ import kotlin.Unit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.InstructionDataMergeStrategy;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage;
import org.jetbrains.jet.lang.cfg.pseudocode.*;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
@@ -148,7 +147,7 @@ public class PseudocodeVariablesData {
return pseudocodeVariableDataCollector.collectData(
FORWARD, /*mergeDataWithLocalDeclarations=*/ false,
new InstructionDataMergeStrategy<Map<VariableDescriptor, VariableInitState>>() {
new InstructionDataMergeStrategy<VariableInitState>() {
@NotNull
@Override
public Edges<Map<VariableDescriptor, VariableInitState>> invoke(
@@ -248,7 +247,7 @@ public class PseudocodeVariablesData {
public Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> getVariableUseStatusData() {
return pseudocodeVariableDataCollector.collectData(
BACKWARD, /*mergeDataWithLocalDeclarations=*/ true,
new InstructionDataMergeStrategy<Map<VariableDescriptor, VariableUseState>>() {
new InstructionDataMergeStrategy<VariableUseState>() {
@NotNull
@Override
public Edges<Map<VariableDescriptor, VariableUseState>> invoke(