Status: Draft
Add a single-token expression ... that represents an unbound /
intentionally-empty argument value in microflow call statements.
$Total = call java action SampleModule.Recalculate(
CompanyId = ...,
RecalculateAll = true,
ItemList = ...
);
... produces a parameter binding with an empty Argument string in the
serialized BSON (Microflows$BasicCodeActionParameterValue.Argument = "").
Re-executing a script that contains ... reproduces the same empty
binding byte-for-byte, so describe → exec → describe stays symmetric for
existing Studio Pro projects that have unbound code-action parameters.
Studio Pro's Java-action call dialog allows a developer to leave individual
parameters empty — for example, when a Java action declares a parameter that
the calling microflow does not yet have a meaningful value for, or when an
external mapping is expected to fill the slot at runtime. The on-disk
representation is a Microflows$JavaActionParameterMapping whose Value is a
BasicCodeActionParameterValue with Argument: "".
Before ... existed, the describer had two options for these empty bindings:
- Emit
''(empty string literal). On re-exec, the visitor would round-trip to a non-empty single-quote literal whoseArgumentwas'', not"", and Studio Pro would render the parameter as the literal string''. - Drop the parameter entirely. Studio Pro would then add a back a placeholder mapping with a generated value, breaking the round-trip.
Both lose information. ... lets the describer round-trip the empty binding
without inventing a fake value.
atomicExpression
: literal
| ELLIPSIS
| ...
;Where ELLIPSIS is the lexer token '...'. The token is reserved for this
single use; it is not valid in arithmetic / boolean / comparison
expressions.
...is recognised by the builder viaisPlaceholderExpressioninmdl/executor/cmd_microflows_builder_calls.go.- Inside a Java-action
callArgument,...produces aBasicCodeActionParameterValuewithArgument: "". - Outside of
callArgumentlists,...parses but the builder rejects it (it never resolves to a runtime value). Future statements may extend the set of contexts that accept...— see Open Questions.
-- Java action call with two unbound and one bound argument
$Total = call java action SampleModule.Recalculate(
CompanyId = ...,
RecalculateAll = true,
ItemList = ...
);
The Mendix BSON for the unbound arguments is:
JavaActionParameterMapping {
Parameter: 'SampleModule.Recalculate.CompanyId',
Value: BasicCodeActionParameterValue { Argument: '' }
}
- Builder coverage:
TestBuildJavaAction_PlaceholderArgumentPreservesEmptyBasicValueinmdl/executor/cmd_microflows_builder_java_action_test.go. - Visitor coverage:
atomicExpression'sELLIPSISarm producesast.SourceExpr{Source: "..."}(seemdl/visitor/visitor_microflow_expression.go). - Example script:
mdl-examples/doctype-tests/ellipsis_placeholder.test.mdl.
- Should
...be allowed as an argument tocall microflowandcall nanoflowcalls as well? Today only Java actions consume theBasicCodeActionParameterValueform, so there is no symmetric BSON representation, but a future proposal could extend this. - Should we explicitly document
...as round-trip-only and warn the linter when an authored microflow uses...outside of a known describe-emitted context? This would prevent users from authoring scripts that produce Studio Pro warnings ("unbound parameter") on import. - Should the surface syntax be
...or a clearer keyword likeunspecified/default/unbound?...was chosen because it is visually distinct, short, and matches existing "this is intentionally blank" conventions in other tools (Python'sEllipsis, TypeScript'sneverplaceholder, etc.).