aboutsummaryrefslogtreecommitdiff
path: root/src/check_type.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-08-05 23:57:34 +0100
committergingerBill <bill@gingerbill.org>2018-08-05 23:57:34 +0100
commit60711dd355540b0b315a4508fc40b0e3b4df7bc9 (patch)
treee6110b311e74b6ac41f7bc6367571bc0f4ba158f /src/check_type.cpp
parentfad3947e26266ada585f6879652fccf7c142e044 (diff)
Refactor default parameter values
Diffstat (limited to 'src/check_type.cpp')
-rw-r--r--src/check_type.cpp37
1 files changed, 27 insertions, 10 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index 9d840b0d1..8ef485a52 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -1065,9 +1065,14 @@ Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_params, bool *is
}
param = alloc_entity_param(scope, name->Ident.token, type, is_using, is_in);
- param->Variable.default_value = value;
- param->Variable.default_is_nil = default_is_nil;
- param->Variable.default_is_location = default_is_location;
+ if (default_is_nil) {
+ param->Variable.param_value.kind = ParameterValue_Nil;
+ } else if (default_is_location) {
+ param->Variable.param_value.kind = ParameterValue_Location;
+ } else if (value.kind != ExactValue_Invalid) {
+ param->Variable.param_value.kind = ParameterValue_Constant;
+ param->Variable.param_value.value = value;
+ }
}
if (p->flags&FieldFlag_no_alias) {
param->flags |= EntityFlag_NoAlias;
@@ -1194,8 +1199,12 @@ Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_results) {
Token token = ast_token(field->type);
token.string = str_lit("");
Entity *param = alloc_entity_param(scope, token, type, false, false);
- param->Variable.default_value = value;
- param->Variable.default_is_nil = default_is_nil;
+ if (default_is_nil) {
+ param->Variable.param_value.kind = ParameterValue_Nil;
+ } else if (value.kind != ExactValue_Invalid) {
+ param->Variable.param_value.kind = ParameterValue_Constant;
+ param->Variable.param_value.value = value;
+ }
array_add(&variables, param);
} else {
for_array(j, field->names) {
@@ -1218,8 +1227,12 @@ Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_results) {
Entity *param = alloc_entity_param(scope, token, type, false, false);
param->flags |= EntityFlag_Result;
- param->Variable.default_value = value;
- param->Variable.default_is_nil = default_is_nil;
+ if (default_is_nil) {
+ param->Variable.param_value.kind = ParameterValue_Nil;
+ } else if (value.kind != ExactValue_Invalid) {
+ param->Variable.param_value.kind = ParameterValue_Constant;
+ param->Variable.param_value.value = value;
+ }
array_add(&variables, param);
add_entity(ctx->checker, scope, name, param);
}
@@ -1465,9 +1478,13 @@ bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc_type_node,
if (param_count > 0) {
for_array(i, params->Tuple.variables) {
Entity *param = params->Tuple.variables[i];
- if (param->kind == Entity_Variable && param->Variable.default_value.kind == ExactValue_Procedure) {
- type->Proc.has_proc_default_values = true;
- break;
+ if (param->kind == Entity_Variable) {
+ ParameterValue pv = param->Variable.param_value;
+ if (pv.kind == ParameterValue_Constant &&
+ pv.value.kind == ExactValue_Procedure) {
+ type->Proc.has_proc_default_values = true;
+ break;
+ }
}
}
}