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.codegen;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
021 import org.jetbrains.kotlin.psi.JetExpression;
022 import org.jetbrains.kotlin.psi.ValueArgument;
023 import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument;
024 import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument;
025 import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
026 import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument;
027 import org.jetbrains.org.objectweb.asm.Type;
028
029 import java.util.List;
030
031 import static org.jetbrains.kotlin.codegen.AsmUtil.pushDefaultValueOnStack;
032
033 public class CallBasedArgumentGenerator extends ArgumentGenerator {
034 private final ExpressionCodegen codegen;
035 private final CallGenerator callGenerator;
036 private final List<ValueParameterDescriptor> valueParameters;
037 private final List<Type> valueParameterTypes;
038
039 public CallBasedArgumentGenerator(
040 @NotNull ExpressionCodegen codegen,
041 @NotNull CallGenerator callGenerator,
042 @NotNull List<ValueParameterDescriptor> valueParameters,
043 @NotNull List<Type> valueParameterTypes
044 ) {
045 this.codegen = codegen;
046 this.callGenerator = callGenerator;
047 this.valueParameters = valueParameters;
048 this.valueParameterTypes = valueParameterTypes;
049
050 assert valueParameters.size() == valueParameterTypes.size() :
051 "Value parameters and their types mismatch in sizes: " + valueParameters.size() + " != " + valueParameterTypes.size();
052 }
053
054 @NotNull
055 @Override
056 public List<Integer> generate(@NotNull List<ResolvedValueArgument> valueArguments) {
057 boolean shouldMarkLineNumbers = codegen.isShouldMarkLineNumbers();
058 codegen.setShouldMarkLineNumbers(false);
059 List<Integer> masks = super.generate(valueArguments);
060 codegen.setShouldMarkLineNumbers(shouldMarkLineNumbers);
061 return masks;
062 }
063
064 @Override
065 protected void generateExpression(int i, @NotNull ExpressionValueArgument argument) {
066 ValueParameterDescriptor parameter = valueParameters.get(i);
067 Type type = valueParameterTypes.get(i);
068 ValueArgument valueArgument = argument.getValueArgument();
069 assert valueArgument != null;
070 JetExpression argumentExpression = valueArgument.getArgumentExpression();
071 assert argumentExpression != null : valueArgument.asElement().getText();
072 callGenerator.genValueAndPut(parameter, argumentExpression, type);
073 }
074
075 @Override
076 protected void generateDefault(int i, @NotNull DefaultValueArgument argument) {
077 ValueParameterDescriptor parameter = valueParameters.get(i);
078 Type type = valueParameterTypes.get(i);
079 pushDefaultValueOnStack(type, codegen.v);
080 callGenerator.afterParameterPut(type, null, parameter);
081 }
082
083 @Override
084 protected void generateVararg(int i, @NotNull VarargValueArgument argument) {
085 ValueParameterDescriptor parameter = valueParameters.get(i);
086 Type type = valueParameterTypes.get(i);
087 codegen.genVarargs(argument, parameter.getType());
088 callGenerator.afterParameterPut(type, null, parameter);
089 }
090 }