Make 'hasDefaultValue' an extension on ValueParameterDescriptor

To avoid storing a Boolean and a boolean. It isn't called frequently enough to
justify this wasted space for each parameter of every function out there
This commit is contained in:
Alexander Udalov
2015-08-06 03:21:46 +03:00
parent 8dddce5ac5
commit 942ab9ef6d
18 changed files with 72 additions and 82 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
import org.jetbrains.kotlin.psi.JetClassOrObject;
import org.jetbrains.kotlin.psi.JetParameter;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage;
import java.util.ArrayList;
import java.util.List;
@@ -67,7 +68,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator {
JsExpression argumentValue;
JsExpression parameterValue = new JsNameRef(paramName);
if (!constructorParam.hasValOrVar()) {
assert !function.getValueParameters().get(i).hasDefaultValue();
assert !DescriptorUtilPackage.hasDefaultValue(function.getValueParameters().get(i));
// Caller cannot rely on default value and pass undefined here.
argumentValue = parameterValue;
}
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
import org.jetbrains.kotlin.psi.JetDeclarationWithBody;
import org.jetbrains.kotlin.psi.JetFunctionLiteralExpression;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage;
import java.util.HashMap;
import java.util.List;
@@ -148,7 +149,7 @@ public final class FunctionTranslator extends AbstractTranslator {
public static void addParameters(List<JsParameter> list, FunctionDescriptor descriptor, TranslationContext context) {
for (ValueParameterDescriptor valueParameter : descriptor.getValueParameters()) {
JsParameter jsParameter = new JsParameter(context.getNameForDescriptor(valueParameter));
MetadataPackage.setHasDefaultValue(jsParameter, valueParameter.hasDefaultValue());
MetadataPackage.setHasDefaultValue(jsParameter, DescriptorUtilPackage.hasDefaultValue(valueParameter));
list.add(jsParameter);
}
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant;
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage;
import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.TypeUtils;
@@ -176,7 +177,8 @@ public final class BindingUtils {
@NotNull ValueParameterDescriptor parameterDescriptor
) {
ValueParameterDescriptor result = parameterDescriptor;
assert result.hasDefaultValue() : message(parameterDescriptor, "Unsupplied parameter must have default value");
assert DescriptorUtilPackage.hasDefaultValue(result) : message(parameterDescriptor, "Unsupplied parameter must have default value");
// TODO: this seems incorrect, as the default value may come from _not the first_ overridden parameter
while (!result.declaresDefaultValue()) {
result = result.getOverriddenDescriptors().iterator().next();
}
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.js.translate.general.Translation;
import org.jetbrains.kotlin.js.translate.utils.mutator.Mutator;
import org.jetbrains.kotlin.psi.JetDeclarationWithBody;
import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage;
import org.jetbrains.kotlin.types.JetType;
import java.util.ArrayList;
@@ -48,20 +49,23 @@ public final class FunctionBodyTranslator extends AbstractTranslator {
@NotNull
public static List<JsStatement> setDefaultValueForArguments(@NotNull FunctionDescriptor descriptor,
@NotNull TranslationContext functionBodyContext) {
List<JsStatement> result = new ArrayList<JsStatement>();
for (ValueParameterDescriptor valueParameter : descriptor.getValueParameters()) {
if (valueParameter.hasDefaultValue()) {
JsNameRef jsNameRef = functionBodyContext.getNameForDescriptor(valueParameter).makeRef();
JetExpression defaultArgument = getDefaultArgument(valueParameter);
JsBlock defaultArgBlock = new JsBlock();
JsExpression defaultValue = Translation.translateAsExpression(defaultArgument, functionBodyContext, defaultArgBlock);
JsStatement assignStatement = assignment(jsNameRef, defaultValue).makeStmt();
JsStatement thenStatement = JsAstUtils.mergeStatementInBlockIfNeeded(assignStatement, defaultArgBlock);
JsBinaryOperation checkArgIsUndefined = equality(jsNameRef, functionBodyContext.namer().getUndefinedExpression());
JsIf jsIf = JsAstUtils.newJsIf(checkArgIsUndefined, thenStatement);
result.add(jsIf);
}
List<ValueParameterDescriptor> valueParameters = descriptor.getValueParameters();
List<JsStatement> result = new ArrayList<JsStatement>(valueParameters.size());
for (ValueParameterDescriptor valueParameter : valueParameters) {
if (!DescriptorUtilPackage.hasDefaultValue(valueParameter)) continue;
JsNameRef jsNameRef = functionBodyContext.getNameForDescriptor(valueParameter).makeRef();
JetExpression defaultArgument = getDefaultArgument(valueParameter);
JsBlock defaultArgBlock = new JsBlock();
JsExpression defaultValue = Translation.translateAsExpression(defaultArgument, functionBodyContext, defaultArgBlock);
JsStatement assignStatement = assignment(jsNameRef, defaultValue).makeStmt();
JsStatement thenStatement = JsAstUtils.mergeStatementInBlockIfNeeded(assignStatement, defaultArgBlock);
JsBinaryOperation checkArgIsUndefined = equality(jsNameRef, functionBodyContext.namer().getUndefinedExpression());
JsIf jsIf = JsAstUtils.newJsIf(checkArgIsUndefined, thenStatement);
result.add(jsIf);
}
return result;
}