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 abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
035    
036        @NotNull
037        protected abstract JetControlFlowBuilder getDelegateBuilder();
038    
039        @Override
040        public void loadUnit(@NotNull JetExpression expression) {
041            getDelegateBuilder().loadUnit(expression);
042        }
043    
044        @NotNull
045        @Override
046        public InstructionWithValue loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
047            return getDelegateBuilder().loadConstant(expression, constant);
048        }
049    
050        @NotNull
051        @Override
052        public InstructionWithValue createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
053            return getDelegateBuilder().createAnonymousObject(expression);
054        }
055    
056        @NotNull
057        @Override
058        public InstructionWithValue createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) {
059            return getDelegateBuilder().createFunctionLiteral(expression);
060        }
061    
062        @NotNull
063        @Override
064        public InstructionWithValue loadStringTemplate(@NotNull JetStringTemplateExpression expression, @NotNull List<PseudoValue> inputValues) {
065            return getDelegateBuilder().loadStringTemplate(expression, inputValues);
066        }
067    
068        @NotNull
069        @Override
070        public MagicInstruction magic(
071                @NotNull JetElement instructionElement,
072                @Nullable JetElement valueElement,
073                @NotNull List<PseudoValue> inputValues,
074                @NotNull Map<PseudoValue, TypePredicate> expectedTypes,
075                boolean synthetic
076        ) {
077            return getDelegateBuilder().magic(instructionElement, valueElement, inputValues, expectedTypes, synthetic);
078        }
079    
080        @NotNull
081        @Override
082        public MergeInstruction merge(@NotNull JetExpression expression, @NotNull List<PseudoValue> inputValues) {
083            return getDelegateBuilder().merge(expression, inputValues);
084        }
085    
086        @NotNull
087        @Override
088        public ReadValueInstruction readVariable(
089                @NotNull JetElement instructionElement,
090                @NotNull JetExpression valueElement,
091                @NotNull ResolvedCall<?> resolvedCall,
092                @NotNull Map<PseudoValue, ReceiverValue> receiverValues) {
093            return getDelegateBuilder().readVariable(instructionElement, valueElement, resolvedCall, receiverValues);
094        }
095    
096        @NotNull
097        @Override
098        public CallInstruction call(
099                @NotNull JetElement instructionElement,
100                @Nullable JetExpression valueElement,
101                @NotNull ResolvedCall<?> resolvedCall,
102                @NotNull Map<PseudoValue, ReceiverValue> receiverValues,
103                @NotNull Map<PseudoValue, ValueParameterDescriptor> arguments
104        ) {
105            return getDelegateBuilder().call(instructionElement, valueElement, resolvedCall, receiverValues, arguments);
106        }
107    
108        @NotNull
109        @Override
110        public OperationInstruction predefinedOperation(
111                @NotNull JetExpression expression,
112                @NotNull PredefinedOperation operation,
113                @NotNull List<PseudoValue> inputValues
114        ) {
115            return getDelegateBuilder().predefinedOperation(expression, operation, inputValues);
116        }
117    
118        @Override
119        public void compilationError(@NotNull JetElement element, @NotNull String message) {
120            getDelegateBuilder().compilationError(element, message);
121        }
122    
123        @Override
124        @NotNull
125        public Label createUnboundLabel() {
126            return getDelegateBuilder().createUnboundLabel();
127        }
128    
129        @NotNull
130        @Override
131        public Label createUnboundLabel(@NotNull String name) {
132            return getDelegateBuilder().createUnboundLabel(name);
133        }
134    
135        @Override
136        public void bindLabel(@NotNull Label label) {
137            getDelegateBuilder().bindLabel(label);
138        }
139    
140        @Override
141        public void jump(@NotNull Label label, @NotNull JetElement element) {
142            getDelegateBuilder().jump(label, element);
143        }
144    
145        @Override
146        public void jumpOnFalse(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue conditionValue) {
147            getDelegateBuilder().jumpOnFalse(label, element, conditionValue);
148        }
149    
150        @Override
151        public void jumpOnTrue(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue conditionValue) {
152            getDelegateBuilder().jumpOnTrue(label, element, conditionValue);
153        }
154    
155        @Override
156        public void nondeterministicJump(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue inputValue) {
157            getDelegateBuilder().nondeterministicJump(label, element, inputValue);
158        }
159    
160        @Override
161        public void nondeterministicJump(@NotNull List<Label> labels, @NotNull JetElement element) {
162            getDelegateBuilder().nondeterministicJump(labels, element);
163        }
164    
165        @Override
166        public void jumpToError(@NotNull JetElement element) {
167            getDelegateBuilder().jumpToError(element);
168        }
169    
170        @Override
171        public void throwException(@NotNull JetThrowExpression throwExpression, @NotNull PseudoValue thrownValue) {
172            getDelegateBuilder().throwException(throwExpression, thrownValue);
173        }
174    
175        @Override
176        @NotNull
177        public Label getEntryPoint(@NotNull JetElement labelElement) {
178            return getDelegateBuilder().getEntryPoint(labelElement);
179        }
180    
181        @NotNull
182        @Override
183        public Label getExitPoint(@NotNull JetElement labelElement) {
184            return getDelegateBuilder().getExitPoint(labelElement);
185        }
186    
187        @Override
188        public LoopInfo enterLoop(@NotNull JetExpression expression, @Nullable Label loopExitPoint, Label conditionEntryPoint) {
189            return getDelegateBuilder().enterLoop(expression, loopExitPoint, conditionEntryPoint);
190        }
191    
192        @Override
193        public void exitLoop(@NotNull JetExpression expression) {
194            getDelegateBuilder().exitLoop(expression);
195        }
196    
197        @Override
198        @Nullable
199        public JetElement getCurrentLoop() {
200            return getDelegateBuilder().getCurrentLoop();
201        }
202    
203        @Override
204        public void enterTryFinally(@NotNull GenerationTrigger trigger) {
205            getDelegateBuilder().enterTryFinally(trigger);
206        }
207    
208        @Override
209        public void exitTryFinally() {
210            getDelegateBuilder().exitTryFinally();
211        }
212    
213        @Override
214        public void enterSubroutine(@NotNull JetElement subroutine) {
215            getDelegateBuilder().enterSubroutine(subroutine);
216        }
217    
218        @NotNull
219        @Override
220        public Pseudocode exitSubroutine(@NotNull JetElement subroutine) {
221            return getDelegateBuilder().exitSubroutine(subroutine);
222        }
223    
224        @NotNull
225        @Override
226        public JetElement getCurrentSubroutine() {
227            return getDelegateBuilder().getCurrentSubroutine();
228        }
229    
230        @Override
231        @Nullable
232        public JetElement getReturnSubroutine() {
233            return getDelegateBuilder().getReturnSubroutine();
234        }
235    
236        @Override
237        public void returnValue(@NotNull JetReturnExpression returnExpression, @NotNull PseudoValue returnValue, @NotNull JetElement subroutine) {
238            getDelegateBuilder().returnValue(returnExpression, returnValue, subroutine);
239        }
240    
241        @Override
242        public void returnNoValue(@NotNull JetReturnExpression returnExpression, @NotNull JetElement subroutine) {
243            getDelegateBuilder().returnNoValue(returnExpression, subroutine);
244        }
245    
246        @Override
247        public void unsupported(JetElement element) {
248            getDelegateBuilder().unsupported(element);
249        }
250    
251        @Override
252        public void write(
253                @NotNull JetElement assignment,
254                @NotNull JetElement lValue,
255                @NotNull PseudoValue rValue,
256                @NotNull AccessTarget target,
257                @NotNull Map<PseudoValue, ReceiverValue> receiverValues) {
258            getDelegateBuilder().write(assignment, lValue, rValue, target, receiverValues);
259        }
260    
261        @Override
262        public void declareParameter(@NotNull JetParameter parameter) {
263            getDelegateBuilder().declareParameter(parameter);
264        }
265    
266        @Override
267        public void declareVariable(@NotNull JetVariableDeclaration property) {
268            getDelegateBuilder().declareVariable(property);
269        }
270    
271        @Override
272        public void declareFunction(@NotNull JetElement subroutine, @NotNull Pseudocode pseudocode) {
273            getDelegateBuilder().declareFunction(subroutine, pseudocode);
274        }
275    
276        @Override
277        public void repeatPseudocode(@NotNull Label startLabel, @NotNull Label finishLabel) {
278            getDelegateBuilder().repeatPseudocode(startLabel, finishLabel);
279        }
280    
281        @Override
282        public void mark(@NotNull JetElement element) {
283            getDelegateBuilder().mark(element);
284        }
285    
286        @Nullable
287        @Override
288        public PseudoValue getBoundValue(@Nullable JetElement element) {
289            return getDelegateBuilder().getBoundValue(element);
290        }
291    
292        @Override
293        public void bindValue(@NotNull PseudoValue value, @NotNull JetElement element) {
294            getDelegateBuilder().bindValue(value, element);
295        }
296    
297        @Override
298        public void enterLexicalScope(@NotNull JetElement element) {
299            getDelegateBuilder().enterLexicalScope(element);
300        }
301    
302        @Override
303        public void exitLexicalScope(@NotNull JetElement element) {
304            getDelegateBuilder().exitLexicalScope(element);
305        }
306    }