diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index 9f74daec6c0..c7dbfe16068 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -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>() { + new InstructionDataAnalyzeStrategy>() { @Override public void execute(@NotNull Instruction instruction, @Nullable Map in, @@ -517,7 +517,7 @@ public class JetFlowInformationProvider { Map>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData(); final Map reportedDiagnosticMap = Maps.newHashMap(); InstructionDataAnalyzeStrategy> variableStatusAnalyzeStrategy = - new InstructionDataAnalyzeStrategyJ>() { + new InstructionDataAnalyzeStrategy>() { @Override public void execute(@NotNull Instruction instruction, @Nullable Map in, @@ -885,7 +885,7 @@ public class JetFlowInformationProvider { } //TODO after KT-4621 rewrite to Kotlin - public abstract static class InstructionDataAnalyzeStrategyJ implements InstructionDataAnalyzeStrategy { + public abstract static class InstructionDataAnalyzeStrategy implements Function3 { @Override public Unit invoke(Instruction instruction, D enterData, D exitData) { execute(instruction, enterData, exitData); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.kt b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.kt index 35b5e538cae..9de52f89901 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.kt @@ -60,16 +60,16 @@ fun Pseudocode.traverse( fun Pseudocode.traverse( traversalOrder: TraversalOrder, edgesMap: Map>, - instructionDataAnalyzeStrategy: InstructionDataAnalyzeStrategy + 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 Pseudocode.collectDataFromSubgraph( } } -trait InstructionDataMergeStrategy : (Instruction, Collection) -> Edges -trait InstructionDataAnalyzeStrategy : (Instruction, D, D) -> Unit - data class Edges(val `in`: T, val out: T) fun createEdges(`in`: T, out: T) = Edges(`in`, out) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.kt b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.kt index 1e5e8b379e4..232c71e6da5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariableDataCollector.kt @@ -41,11 +41,13 @@ public class PseudocodeVariableDataCollector( public fun collectData( traversalOrder: TraversalOrder, mergeDataWithLocalDeclarations: Boolean, - instructionDataMergeStrategy: InstructionDataMergeStrategy> + instructionDataMergeStrategy: InstructionDataMergeStrategy ): MutableMap>> { val result = pseudocode.collectData( traversalOrder, mergeDataWithLocalDeclarations, - instructionDataMergeStrategy as InstructionDataMergeStrategy>, + //see KT-4605 + instructionDataMergeStrategy as + (Instruction, Collection>) -> Edges>, { (from, to, data) -> filterOutVariablesOutOfScope(from, to, data)}, Collections.emptyMap()) //see KT-4605 @@ -88,6 +90,10 @@ public class PseudocodeVariableDataCollector( } } +//todo may be a type alias +trait InstructionDataMergeStrategy : + (Instruction, Collection>) -> Edges> + public trait LexicalScopeVariableInfo { val declaredIn : Map val scopeVariables : Map> diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java index aed54128222..728c65aab00 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java @@ -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>() { + new InstructionDataMergeStrategy() { @NotNull @Override public Edges> invoke( @@ -248,7 +247,7 @@ public class PseudocodeVariablesData { public Map>> getVariableUseStatusData() { return pseudocodeVariableDataCollector.collectData( BACKWARD, /*mergeDataWithLocalDeclarations=*/ true, - new InstructionDataMergeStrategy>() { + new InstructionDataMergeStrategy() { @NotNull @Override public Edges> invoke(