diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java index 4049708bdd4..c2fdf67b1c2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java @@ -59,10 +59,15 @@ public class ConditionalJumpInstruction extends AbstractJumpInstruction { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitConditionalJump(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitConditionalJump(this); + } + @Override public String toString() { String instr = onTrue ? "jt" : "jf"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java index 691129c3b8c..bc20d5261fa 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java @@ -33,6 +33,7 @@ public interface Instruction { Collection getNextInstructions(); void accept(@NotNull InstructionVisitor visitor); + R accept(@NotNull InstructionVisitorWithResult visitor); @NotNull Collection getCopies(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitorWithResult.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitorWithResult.java new file mode 100644 index 00000000000..8e7bfbfa440 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitorWithResult.java @@ -0,0 +1,102 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.cfg.pseudocode; + +public abstract class InstructionVisitorWithResult { + public abstract R visitInstruction(Instruction instruction); + + public R visitReadValue(ReadValueInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitLocalFunctionDeclarationInstruction(LocalFunctionDeclarationInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitVariableDeclarationInstruction(VariableDeclarationInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitUnconditionalJump(UnconditionalJumpInstruction instruction) { + return visitJump(instruction); + } + + public R visitConditionalJump(ConditionalJumpInstruction instruction) { + return visitJump(instruction); + } + + public R visitReturnValue(ReturnValueInstruction instruction) { + return visitJump(instruction); + } + + public R visitReturnNoValue(ReturnNoValueInstruction instruction) { + return visitJump(instruction); + } + + public R visitThrowExceptionInstruction(ThrowExceptionInstruction instruction) { + return visitJump(instruction); + } + + public R visitNondeterministicJump(NondeterministicJumpInstruction instruction) { + return visitInstruction(instruction); + } + + public R visitUnsupportedElementInstruction(UnsupportedElementInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitSubroutineExit(SubroutineExitInstruction instruction) { + return visitInstruction(instruction); + } + + public R visitSubroutineSink(SubroutineSinkInstruction instruction) { + return visitInstruction(instruction); + } + + public R visitJump(AbstractJumpInstruction instruction) { + return visitInstruction(instruction); + } + + public R visitInstructionWithNext(InstructionWithNext instruction) { + return visitInstruction(instruction); + } + + public R visitSubroutineEnter(SubroutineEnterInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitWriteValue(WriteValueInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitLoadUnitValue(LoadUnitValueInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitCallInstruction(CallInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitCompilationErrorInstruction(CompilationErrorInstruction instruction) { + return visitInstructionWithNext(instruction); + } + + public R visitMarkInstruction(MarkInstruction instruction) { + return visitInstructionWithNext(instruction); + } + +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LoadUnitValueInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LoadUnitValueInstruction.java index 278d8e3ef39..9159eb4f0ad 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LoadUnitValueInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LoadUnitValueInstruction.java @@ -30,6 +30,11 @@ public class LoadUnitValueInstruction extends InstructionWithNext { visitor.visitLoadUnitValue(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitLoadUnitValue(this); + } + @Override public String toString() { return "read (Unit)"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalFunctionDeclarationInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalFunctionDeclarationInstruction.java index d3ef2c32587..d0c7f3e1d79 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalFunctionDeclarationInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalFunctionDeclarationInstruction.java @@ -53,10 +53,15 @@ public class LocalFunctionDeclarationInstruction extends InstructionWithNext { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitLocalFunctionDeclarationInstruction(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitLocalFunctionDeclarationInstruction(this); + } + @Override public String toString() { return "d" + "(" + render(element) + ")"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java index 12c6f93a82f..4fe08c0c64f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java @@ -58,10 +58,15 @@ public class NondeterministicJumpInstruction extends InstructionImpl{ } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitNondeterministicJump(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitNondeterministicJump(this); + } + @NotNull @Override public Collection getNextInstructions() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java index 4def5d96ae4..3e1d2e4a88d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java @@ -26,10 +26,15 @@ public class ReadValueInstruction extends InstructionWithNext { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitReadValue(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitReadValue(this); + } + @Override public String toString() { return "r(" + render(element) + ")"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java index 9f6d4146652..adffa24b757 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java @@ -40,6 +40,11 @@ public class ReturnNoValueInstruction extends AbstractJumpInstruction implements visitor.visitReturnNoValue(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitReturnNoValue(this); + } + @Override public String toString() { return "ret " + getTargetLabel(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java index 254d15a5c9e..bcc572e69d4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java @@ -35,6 +35,11 @@ public class ReturnValueInstruction extends AbstractJumpInstruction implements R visitor.visitReturnValue(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitReturnValue(this); + } + @Override public String toString() { return "ret(*) " + getTargetLabel(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineEnterInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineEnterInstruction.java index 03dbf34f1b0..e491be4f61b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineEnterInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineEnterInstruction.java @@ -32,10 +32,15 @@ public class SubroutineEnterInstruction extends InstructionWithNext { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitSubroutineEnter(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitSubroutineEnter(this); + } + @Override public String toString() { return ""; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java index 076939093d2..49b539b933f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java @@ -48,10 +48,15 @@ public class SubroutineExitInstruction extends InstructionImpl { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitSubroutineExit(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitSubroutineExit(this); + } + @Override public String toString() { return debugLabel; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineSinkInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineSinkInstruction.java index d56bd8f0f42..2699517bf44 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineSinkInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineSinkInstruction.java @@ -42,10 +42,15 @@ public class SubroutineSinkInstruction extends InstructionImpl { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitSubroutineSink(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitSubroutineSink(this); + } + @Override public String toString() { return debugLabel; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ThrowExceptionInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ThrowExceptionInstruction.java index 322cbe6fcae..d7f3e4f44bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ThrowExceptionInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ThrowExceptionInstruction.java @@ -41,10 +41,15 @@ public class ThrowExceptionInstruction extends AbstractJumpInstruction implement } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitThrowExceptionInstruction(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitThrowExceptionInstruction(this); + } + @Override protected AbstractJumpInstruction createCopy(@NotNull Label newLabel) { return new ThrowExceptionInstruction(expression, newLabel); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnconditionalJumpInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnconditionalJumpInstruction.java index 51bca0220dd..761d1d6f0a0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnconditionalJumpInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnconditionalJumpInstruction.java @@ -27,10 +27,15 @@ public class UnconditionalJumpInstruction extends AbstractJumpInstruction { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitUnconditionalJump(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitUnconditionalJump(this); + } + @Override public String toString() { return "jmp(" + getTargetLabel().getName() + ")"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnsupportedElementInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnsupportedElementInstruction.java index 77e7482118a..cf91a090266 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnsupportedElementInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/UnsupportedElementInstruction.java @@ -26,10 +26,15 @@ public class UnsupportedElementInstruction extends InstructionWithNext { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitUnsupportedElementInstruction(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitUnsupportedElementInstruction(this); + } + @Override public String toString() { return "unsupported(" + element + " : " + render(element) + ")"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java index f65d71ef4f3..ea53639d6ba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java @@ -35,10 +35,15 @@ public class VariableDeclarationInstruction extends InstructionWithNext { } @Override - public void accept(InstructionVisitor visitor) { + public void accept(@NotNull InstructionVisitor visitor) { visitor.visitVariableDeclarationInstruction(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitVariableDeclarationInstruction(this); + } + @Override public String toString() { return "v(" + render(element) + ")"; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java index ce26a5c8734..5d73d399030 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/WriteValueInstruction.java @@ -39,6 +39,11 @@ public class WriteValueInstruction extends InstructionWithNext { visitor.visitWriteValue(this); } + @Override + public R accept(@NotNull InstructionVisitorWithResult visitor) { + return visitor.visitWriteValue(this); + } + @Override public String toString() { if (lValue instanceof JetNamedDeclaration) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions.kt b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions.kt index eb61a23eb2f..ca0b242e13a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions.kt @@ -29,6 +29,10 @@ class CallInstruction( visitor.visitCallInstruction(this) } + override fun accept(visitor: InstructionVisitorWithResult): R? { + return visitor.visitCallInstruction(this) + } + override fun createCopy() = CallInstruction(element, resolvedCall) override fun toString() = "call(${render(element)}, ${resolvedCall.getResultingDescriptor()!!.getName()})" @@ -43,6 +47,10 @@ class CompilationErrorInstruction( visitor.visitCompilationErrorInstruction(this) } + override fun accept(visitor: InstructionVisitorWithResult): R? { + return visitor.visitCompilationErrorInstruction(this) + } + override fun createCopy() = CompilationErrorInstruction(element, message) override fun toString() = "error(${render(element)}, $message)" @@ -59,6 +67,10 @@ class MarkInstruction( visitor.visitMarkInstruction(this) } + override fun accept(visitor: InstructionVisitorWithResult): R? { + return visitor.visitMarkInstruction(this) + } + override fun createCopy() = MarkInstruction(element) override fun toString() = "mark(${render(element)})"