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