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:
+2
-1
@@ -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;
|
||||
}
|
||||
|
||||
+2
-1
@@ -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();
|
||||
}
|
||||
|
||||
+17
-13
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user