Pseudocode: Divide instruction classes into packages

This commit is contained in:
Alexey Sedunov
2014-06-03 14:26:23 +04:00
parent eabe2fcc8a
commit c7e4f1d02e
45 changed files with 257 additions and 90 deletions
@@ -29,7 +29,17 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableInitState; import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableInitState;
import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState; import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState;
import org.jetbrains.jet.lang.cfg.pseudocode.*; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeUtil;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.JetElementInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.MarkInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineExitInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.VariableDeclarationInstruction;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges; import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage; import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.TraversalOrder; import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.TraversalOrder;
@@ -19,6 +19,10 @@ package org.jetbrains.jet.lang.cfg.pseudocodeTraverser
import org.jetbrains.jet.lang.cfg.pseudocode.* import org.jetbrains.jet.lang.cfg.pseudocode.*
import java.util.* import java.util.*
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.TraversalOrder.FORWARD import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.TraversalOrder.FORWARD
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineSinkInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineEnterInstruction
fun Pseudocode.traverse( fun Pseudocode.traverse(
traversalOrder: TraversalOrder, traversalOrder: TraversalOrder,
@@ -16,20 +16,16 @@
package org.jetbrains.jet.lang.cfg package org.jetbrains.jet.lang.cfg
import org.jetbrains.jet.lang.cfg.pseudocode.Instruction import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.LocalFunctionDeclarationInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode
import org.jetbrains.jet.lang.descriptors.VariableDescriptor import org.jetbrains.jet.lang.descriptors.VariableDescriptor
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.* import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.*
import org.jetbrains.jet.lang.cfg.pseudocode.LexicalScope import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.VariableDeclarationInstruction import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.VariableDeclarationInstruction
import org.jetbrains.jet.utils.addToStdlib.* import org.jetbrains.jet.utils.addToStdlib.*
import kotlin.properties.Delegates
import java.util.* import java.util.*
import org.jetbrains.jet.lang.psi.JetDeclaration
public class PseudocodeVariableDataCollector( public class PseudocodeVariableDataCollector(
private val bindingContext: BindingContext, private val bindingContext: BindingContext,
@@ -22,9 +22,16 @@ import kotlin.Function1;
import kotlin.Unit; import kotlin.Unit;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeUtil;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.ReadValueInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.WriteValueInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.VariableDeclarationInstruction;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges; import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage; import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage;
import org.jetbrains.jet.lang.cfg.pseudocode.*;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
@@ -18,7 +18,14 @@ package org.jetbrains.jet.lang.cfg;
import kotlin.Function1; import kotlin.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.cfg.pseudocode.*; import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.MagicInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.AbstractJumpInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.ThrowExceptionInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.MarkInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineExitInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineSinkInstruction;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
public class TailRecursionDetector extends InstructionVisitorWithResult<Boolean> implements Function1<Instruction, Boolean> { public class TailRecursionDetector extends InstructionVisitorWithResult<Boolean> implements Function1<Instruction, Boolean> {
@@ -20,6 +20,11 @@ import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.*; import org.jetbrains.jet.lang.cfg.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.*;
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
@@ -16,10 +16,8 @@
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode
import java.util.Collections
import org.jetbrains.jet.lang.psi.JetExpression
import kotlin.properties.Delegates
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
public trait PseudoValue { public trait PseudoValue {
public val debugName: String public val debugName: String
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
class PseudoValueImpl( class PseudoValueImpl(
public override val debugName: String, public override val debugName: String,
@@ -18,8 +18,12 @@ package org.jetbrains.jet.lang.cfg.pseudocode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineEnterInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineExitInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineSinkInstruction;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -21,6 +21,14 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.Label; import org.jetbrains.jet.lang.cfg.Label;
import org.jetbrains.jet.lang.cfg.LoopInfo; import org.jetbrains.jet.lang.cfg.LoopInfo;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.AbstractJumpInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.ConditionalJumpInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.NondeterministicJumpInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineEnterInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineExitInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.SubroutineSinkInstruction;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage; import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.PseudocodeTraverserPackage;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
@@ -19,6 +19,10 @@ package org.jetbrains.jet.lang.cfg.pseudocode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.JetControlFlowProcessor; import org.jetbrains.jet.lang.cfg.JetControlFlowProcessor;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.ReadValueInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.WriteValueInstruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.VariableDeclarationInstruction;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
@@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import kotlin.jvm.KotlinSignature import org.jetbrains.jet.lang.cfg.pseudocode
import org.jetbrains.annotations.Nullable import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode
import org.jetbrains.annotations.ReadOnly import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
public trait Instruction { public trait Instruction {
public var owner: Pseudocode public var owner: Pseudocode
@@ -29,7 +29,7 @@ public trait Instruction {
public val lexicalScope: LexicalScope public val lexicalScope: LexicalScope
public val inputValues: List<PseudoValue> public val inputValues: List<PseudoValue>
public val outputValue: PseudoValue? public val outputValue: pseudocode.PseudoValue?
public fun getCopies(): Collection<Instruction> public fun getCopies(): Collection<Instruction>
@@ -14,12 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import java.util.Collections import java.util.Collections
import java.util.LinkedHashSet import java.util.LinkedHashSet
import java.util.HashSet import java.util.HashSet
import com.google.common.collect.Sets import com.google.common.collect.Sets
import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
public abstract class InstructionImpl(public override val lexicalScope: LexicalScope): Instruction { public abstract class InstructionImpl(public override val lexicalScope: LexicalScope): Instruction {
private var _owner: Pseudocode? = null private var _owner: Pseudocode? = null
@@ -14,7 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*
public open class InstructionVisitor() { public open class InstructionVisitor() {
public open fun visitInstructionWithReceiver(instruction: InstructionWithReceiver) { public open fun visitInstructionWithReceiver(instruction: InstructionWithReceiver) {
@@ -14,7 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.*
public abstract class InstructionVisitorWithResult<R>() { public abstract class InstructionVisitorWithResult<R>() {
public abstract fun visitInstruction(instruction: Instruction): R public abstract fun visitInstruction(instruction: Instruction): R
@@ -14,10 +14,9 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import java.util.Collections
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
public abstract class InstructionWithNext( public abstract class InstructionWithNext(
@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclaration
@@ -14,9 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
public abstract class InstructionWithReceiver( public abstract class InstructionWithReceiver(
@@ -14,9 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class LoadUnitValueInstruction( public class LoadUnitValueInstruction(
expression: JetExpression, expression: JetExpression,
@@ -14,10 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval
import org.jetbrains.annotations.Nullable
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValueFactory
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.InstructionWithReceiver
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class ReadValueInstruction private ( public class ReadValueInstruction private (
element: JetElement, element: JetElement,
@@ -14,13 +14,18 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval
import org.jetbrains.annotations.Nullable
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.psi.JetNamedDeclaration import org.jetbrains.jet.lang.psi.JetNamedDeclaration
import java.util.Arrays
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.InstructionWithReceiver
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import java.util.Arrays
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class WriteValueInstruction( public class WriteValueInstruction(
assignment: JetElement, assignment: JetElement,
@@ -14,11 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall
import kotlin.properties.Delegates import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValueFactory
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public abstract class OperationInstruction protected( public abstract class OperationInstruction protected(
element: JetElement, element: JetElement,
@@ -14,11 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import org.jetbrains.jet.lang.cfg.Label
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.Label
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.JetElementInstructionImpl
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
public abstract class AbstractJumpInstruction( public abstract class AbstractJumpInstruction(
element: JetElement, element: JetElement,
@@ -40,5 +44,6 @@ public abstract class AbstractJumpInstruction(
return createCopy(targetLabel, lexicalScope) return createCopy(targetLabel, lexicalScope)
} }
override val nextInstructions: Collection<Instruction> get() = Collections.singleton(resolvedTarget) override val nextInstructions: Collection<Instruction>
get() = Collections.singleton(resolvedTarget)
} }
@@ -14,12 +14,17 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import com.intellij.util.containers.ContainerUtil import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import org.jetbrains.jet.lang.cfg.Label
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.Label
import java.util.Arrays import java.util.Arrays
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
public class ConditionalJumpInstruction( public class ConditionalJumpInstruction(
element: JetElement, element: JetElement,
@@ -14,6 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
public trait JumpInstruction : Instruction public trait JumpInstruction : Instruction
@@ -14,15 +14,20 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import com.google.common.collect.Lists import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import com.google.common.collect.Maps
import org.jetbrains.annotations.Nullable
import org.jetbrains.jet.lang.cfg.Label
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import java.util.* import org.jetbrains.jet.lang.cfg.Label
import com.google.common.collect.Maps
import com.google.common.collect.Lists
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.JetElementInstructionImpl
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class NondeterministicJumpInstruction( public class NondeterministicJumpInstruction(
element: JetElement, element: JetElement,
@@ -14,10 +14,13 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import org.jetbrains.jet.lang.cfg.Label
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.Label
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class ReturnNoValueInstruction( public class ReturnNoValueInstruction(
element: JetElement, element: JetElement,
@@ -14,11 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import org.jetbrains.jet.lang.cfg.Label import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.cfg.Label
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class ReturnValueInstruction( public class ReturnValueInstruction(
returnExpression: JetExpression, returnExpression: JetExpression,
@@ -14,11 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import org.jetbrains.jet.lang.cfg.Label import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue
import org.jetbrains.jet.lang.psi.JetThrowExpression import org.jetbrains.jet.lang.psi.JetThrowExpression
import org.jetbrains.jet.lang.cfg.Label
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class ThrowExceptionInstruction( public class ThrowExceptionInstruction(
expression: JetThrowExpression, expression: JetThrowExpression,
@@ -14,10 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps
import org.jetbrains.jet.lang.cfg.Label import org.jetbrains.jet.lang.cfg.pseudocode.instructions.*
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.Label
public class UnconditionalJumpInstruction( public class UnconditionalJumpInstruction(
element: JetElement, element: JetElement,
@@ -14,9 +14,13 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class CompilationErrorInstruction( public class CompilationErrorInstruction(
element: JetElement, element: JetElement,
@@ -14,11 +14,17 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import com.google.common.collect.Lists
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import java.util.ArrayList import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode
import com.google.common.collect.Lists
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class LocalFunctionDeclarationInstruction( public class LocalFunctionDeclarationInstruction(
element: JetElement, element: JetElement,
@@ -14,13 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
// This instruciton is used to let the dead code detector know the syntactic structure of unreachable code
// otherwise only individual parts of expression would be reported as unreachable
// e.g. for (i in foo) {} -- only i and foo would be marked unreachable
public class MarkInstruction( public class MarkInstruction(
element: JetElement, element: JetElement,
lexicalScope: LexicalScope lexicalScope: LexicalScope
@@ -14,9 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class SubroutineEnterInstruction( public class SubroutineEnterInstruction(
public val subroutine: JetElement, public val subroutine: JetElement,
@@ -14,10 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class SubroutineExitInstruction( public class SubroutineExitInstruction(
public val subroutine: JetElement, public val subroutine: JetElement,
@@ -14,10 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
public class SubroutineSinkInstruction( public class SubroutineSinkInstruction(
public val subroutine: JetElement, public val subroutine: JetElement,
@@ -14,9 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class UnsupportedElementInstruction( public class UnsupportedElementInstruction(
element: JetElement, element: JetElement,
@@ -14,11 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.cfg.pseudocode package org.jetbrains.jet.lang.cfg.pseudocode.instructions.special
import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclaration
import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.psi.JetVariableDeclaration import org.jetbrains.jet.lang.psi.JetVariableDeclaration
import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.LexicalScope
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl
public class VariableDeclarationInstruction( public class VariableDeclarationInstruction(
element: JetDeclaration, element: JetDeclaration,
@@ -19,8 +19,8 @@ package org.jetbrains.jet.cfg;
import kotlin.Function3; import kotlin.Function3;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocode.Instruction; import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.InstructionImpl; import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl; import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -21,8 +21,9 @@ import com.intellij.openapi.util.text.StringUtil;
import kotlin.Function3; import kotlin.Function3;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData; import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData;
import org.jetbrains.jet.lang.cfg.pseudocode.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl; import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -30,7 +31,6 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.Edges;
import static org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableInitState; import static org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableInitState;
import static org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState; import static org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState;
@@ -25,7 +25,12 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.lang.cfg.pseudocode.*; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeUtil;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionImpl;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment; import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
@@ -19,7 +19,13 @@ package org.jetbrains.jet.cfg;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.lang.cfg.pseudocode.*; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionVisitor;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.InstructionWithNext;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*;
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.*;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetNamedDeclaration; import org.jetbrains.jet.lang.psi.JetNamedDeclaration;
@@ -56,6 +56,18 @@ import org.jetbrains.jet.lang.diagnostics.Errors
import org.jetbrains.jet.lang.psi.psiUtil.replaced import org.jetbrains.jet.lang.psi.psiUtil.replaced
import org.jetbrains.jet.plugin.refactoring.extractFunction.AnalysisResult.Status import org.jetbrains.jet.plugin.refactoring.extractFunction.AnalysisResult.Status
import org.jetbrains.jet.plugin.refactoring.extractFunction.AnalysisResult.ErrorMessage import org.jetbrains.jet.plugin.refactoring.extractFunction.AnalysisResult.ErrorMessage
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.WriteValueInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.Instruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.CallInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.JetElementInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.OperationInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.ReadValueInstruction
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*
import org.jetbrains.jet.lang.cfg.pseudocode.instructions.jumps.*
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.getNextInstructions
private val DEFAULT_FUNCTION_NAME = "myFun" private val DEFAULT_FUNCTION_NAME = "myFun"
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType() private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()