@@ -172,7 +172,7 @@ func (p *Parser) WorkspaceTagDefaults(ctx context.Context) (map[string]string, e
172172if err != nil {
173173return nil ,xerrors .Errorf ("load variable defaults: %w" ,err )
174174}
175- paramsDefaults ,err := p .CoderParameterDefaults (ctx )
175+ paramsDefaults ,err := p .CoderParameterDefaults (ctx , varsDefaults )
176176if err != nil {
177177return nil ,xerrors .Errorf ("load parameter defaults: %w" ,err )
178178}
@@ -268,7 +268,7 @@ func (p *Parser) VariableDefaults(ctx context.Context) (map[string]string, error
268268
269269// CoderParameterDefaults returns the default values of all coder_parameter data sources
270270// in the parsed module.
271- func (p * Parser )CoderParameterDefaults (ctx context.Context ) (map [string ]string ,error ) {
271+ func (p * Parser )CoderParameterDefaults (ctx context.Context , varsDefaults map [ string ] string ) (map [string ]string ,error ) {
272272defaultsM := make (map [string ]string )
273273var (
274274skipped []string
@@ -316,14 +316,28 @@ func (p *Parser) CoderParameterDefaults(ctx context.Context) (map[string]string,
316316}
317317
318318if _ ,ok := resContent .Attributes ["default" ];! ok {
319+ p .logger .Warn (ctx ,"coder_parameter data source does not have a default value" ,slog .F ("name" ,dataResource .Name ))
319320defaultsM [dataResource .Name ]= ""
320321}else {
321322expr := resContent .Attributes ["default" ].Expr
322323value ,err := previewFileContent (expr .Range ())
323324if err != nil {
324325return nil ,xerrors .Errorf ("can't preview the resource file: %v" ,err )
325326}
326- defaultsM [dataResource .Name ]= strings .Trim (value ,`"` )
327+ // Issue #15795: the "default" value could also be an expression we need
328+ // to evaluate.
329+ // TODO: should we support coder_parameter default values that reference other coder_parameter data sources?
330+ evalCtx := buildEvalContext (varsDefaults ,nil )
331+ val ,diags := expr .Value (evalCtx )
332+ if diags .HasErrors () {
333+ return nil ,xerrors .Errorf ("failed to evaluate coder_parameter %q default value %q: %s" ,dataResource .Name ,value ,diags .Error ())
334+ }
335+ // Do not use "val.AsString()" as it can panic
336+ strVal ,err := ctyValueString (val )
337+ if err != nil {
338+ return nil ,xerrors .Errorf ("failed to marshal coder_parameter %q default value %q as string: %s" ,dataResource .Name ,value ,err )
339+ }
340+ defaultsM [dataResource .Name ]= strings .Trim (strVal ,`"` )
327341}
328342}
329343}