001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.lang.cfg;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.annotations.Nullable;
021 import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue;
022 import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
023 import org.jetbrains.jet.lang.cfg.pseudocode.TypePredicate;
024 import org.jetbrains.jet.lang.cfg.pseudocode.instructions.eval.*;
025 import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
026 import org.jetbrains.jet.lang.psi.*;
027 import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
028 import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
029 import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
030
031 import java.util.List;
032 import java.util.Map;
033
034 public interface JetControlFlowBuilder {
035 // Subroutines
036 void enterSubroutine(@NotNull JetElement subroutine);
037
038 @NotNull
039 Pseudocode exitSubroutine(@NotNull JetElement subroutine);
040
041 @NotNull
042 JetElement getCurrentSubroutine();
043 @Nullable
044 JetElement getReturnSubroutine();
045
046 // Lexical scopes
047 void enterLexicalScope(@NotNull JetElement element);
048 void exitLexicalScope(@NotNull JetElement element);
049
050 // Entry/exit points
051 @NotNull
052 Label getEntryPoint(@NotNull JetElement labelElement);
053 @NotNull
054 Label getExitPoint(@NotNull JetElement labelElement);
055 @NotNull
056 Label getConditionEntryPoint(@NotNull JetElement labelElement);
057
058 // Declarations
059 void declareParameter(@NotNull JetParameter parameter);
060 void declareVariable(@NotNull JetVariableDeclaration property);
061 void declareFunction(@NotNull JetElement subroutine, @NotNull Pseudocode pseudocode);
062
063 // Labels
064 @NotNull
065 Label createUnboundLabel();
066 @NotNull
067 Label createUnboundLabel(@NotNull String name);
068
069 void bindLabel(@NotNull Label label);
070
071 // Jumps
072 void jump(@NotNull Label label, @NotNull JetElement element);
073 void jumpOnFalse(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue conditionValue);
074 void jumpOnTrue(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue conditionValue);
075 void nondeterministicJump(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue inputValue); // Maybe, jump to label
076 void nondeterministicJump(@NotNull List<Label> label, @NotNull JetElement element);
077 void jumpToError(@NotNull JetElement element);
078
079 void returnValue(@NotNull JetExpression returnExpression, @NotNull PseudoValue returnValue, @NotNull JetElement subroutine);
080 void returnNoValue(@NotNull JetReturnExpression returnExpression, @NotNull JetElement subroutine);
081
082 void throwException(@NotNull JetThrowExpression throwExpression, @NotNull PseudoValue thrownValue);
083
084 // Loops
085 @NotNull
086 LoopInfo enterLoop(@NotNull JetLoopExpression expression);
087 void enterLoopBody(@NotNull JetLoopExpression expression);
088 void exitLoopBody(@NotNull JetLoopExpression expression);
089 @Nullable
090 JetLoopExpression getCurrentLoop();
091
092 // Try-Finally
093 void enterTryFinally(@NotNull GenerationTrigger trigger);
094 void exitTryFinally();
095
096 void repeatPseudocode(@NotNull Label startLabel, @NotNull Label finishLabel);
097
098 // Reading values
099 void mark(@NotNull JetElement element);
100
101 @Nullable
102 PseudoValue getBoundValue(@Nullable JetElement element);
103 void bindValue(@NotNull PseudoValue value, @NotNull JetElement element);
104 @NotNull
105 PseudoValue newValue(@Nullable JetElement element);
106
107 void loadUnit(@NotNull JetExpression expression);
108
109 @NotNull
110 InstructionWithValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant);
111 @NotNull
112 InstructionWithValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression);
113 @NotNull
114 InstructionWithValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression);
115 @NotNull
116 InstructionWithValue loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues);
117
118 @NotNull
119 MagicInstruction magic(
120 @NotNull JetElement instructionElement,
121 @Nullable JetElement valueElement,
122 @NotNull List<PseudoValue> inputValues,
123 @NotNull Map<PseudoValue, TypePredicate> expectedTypes,
124 @NotNull MagicKind kind
125 );
126
127 @NotNull
128 MergeInstruction merge(
129 @NotNull JetExpression expression,
130 @NotNull List<PseudoValue> inputValues
131 );
132
133 @NotNull
134 ReadValueInstruction readVariable(
135 @NotNull JetExpression expression,
136 @NotNull ResolvedCall<?> resolvedCall,
137 @NotNull Map<PseudoValue, ReceiverValue> receiverValues
138 );
139
140 @NotNull
141 CallInstruction call(
142 @NotNull JetElement valueElement,
143 @NotNull ResolvedCall<?> resolvedCall,
144 @NotNull Map<PseudoValue, ReceiverValue> receiverValues,
145 @NotNull Map<PseudoValue, ValueParameterDescriptor> arguments
146 );
147
148 enum PredefinedOperation {
149 AND,
150 OR,
151 NOT_NULL_ASSERTION
152 }
153 @NotNull
154 OperationInstruction predefinedOperation(
155 @NotNull JetExpression expression,
156 @NotNull PredefinedOperation operation,
157 @NotNull List<PseudoValue> inputValues
158 );
159
160 void compilationError(@NotNull JetElement element, @NotNull String message);
161
162 void write(
163 @NotNull JetElement assignment,
164 @NotNull JetElement lValue,
165 @NotNull PseudoValue rValue,
166 @NotNull AccessTarget target,
167 @NotNull Map<PseudoValue, ReceiverValue> receiverValues);
168 }