From bd73bc571df2715f5fe3fc7e3c9eb61218596cb0 Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Thu, 21 Sep 2023 13:01:03 +0200 Subject: [PATCH] feat: port validation of parameter lists (#573) Closes partially #543. ### Summary of Changes Show an error if a parameter list: * has more parameters after a variadic one, * has optional parameters and a variadic one, or * has required parameters after optional ones. --- src/language/grammar/safe-ds.langium | 15 +- .../other/declarations/parameterLists.ts | 59 ++++++++ src/language/validation/safe-ds-validator.ts | 10 ++ .../main.sdstest | 126 ++++++++++++++++ .../main.sdstest | 142 ++++++++++++++++++ .../variadic must be last/main.sdstest | 118 +++++++++++++++ 6 files changed, 456 insertions(+), 14 deletions(-) create mode 100644 src/language/validation/other/declarations/parameterLists.ts create mode 100644 tests/resources/validation/other/declarations/parameter lists/must not have required after optional/main.sdstest create mode 100644 tests/resources/validation/other/declarations/parameter lists/must not mix optional and variadic/main.sdstest create mode 100644 tests/resources/validation/other/declarations/parameter lists/variadic must be last/main.sdstest diff --git a/src/language/grammar/safe-ds.langium b/src/language/grammar/safe-ds.langium index 3917f0bd7..46fa0dc52 100644 --- a/src/language/grammar/safe-ds.langium +++ b/src/language/grammar/safe-ds.langium @@ -391,19 +391,6 @@ SdsParameterList returns SdsParameterList: ')' ; -interface SdsLambdaParameterList extends SdsExpression, SdsParameterList {} - -SdsLambdaParameterList returns SdsParameterList: - {SdsLambdaParameterList} - '(' - ( - parameters+=SdsParameter - (',' parameters+=SdsParameter)* - ','? - )? - ')' -; - interface SdsParameter extends SdsLocalVariable { variadic: boolean ^type?: SdsType @@ -522,7 +509,7 @@ interface SdsExpressionLambda extends SdsLambda { } SdsLambda returns SdsExpression: - SdsLambdaParameterList + SdsParameterList ( {SdsBlockLambda.parameterList=current} body=SdsBlockLambdaBlock | {SdsExpressionLambda.parameterList=current} '->' result=SdsExpression diff --git a/src/language/validation/other/declarations/parameterLists.ts b/src/language/validation/other/declarations/parameterLists.ts new file mode 100644 index 000000000..2635fbe8c --- /dev/null +++ b/src/language/validation/other/declarations/parameterLists.ts @@ -0,0 +1,59 @@ +import { SdsParameterList } from '../../../generated/ast.js'; +import { ValidationAcceptor } from 'langium'; + +export const CODE_PARAMETER_LIST_OPTIONAL_AND_VARIADIC = 'parameter-list/optional-and-variadic'; +export const CODE_PARAMETER_LIST_REQUIRED_AFTER_OPTIONAL = 'parameter-list/required-after-optional'; +export const CODE_PARAMETER_LIST_VARIADIC_NOT_LAST = 'parameter-list/variadic-not-last'; + +export const parameterListMustNotHaveOptionalAndVariadicParameters = ( + node: SdsParameterList, + accept: ValidationAcceptor, +) => { + const hasOptional = node.parameters.find((p) => p.defaultValue); + if (hasOptional) { + const variadicParameters = node.parameters.filter((p) => p.variadic); + + for (const variadic of variadicParameters) { + accept('error', 'A callable with optional parameters must not have a variadic parameter.', { + node: variadic, + property: 'name', + code: CODE_PARAMETER_LIST_OPTIONAL_AND_VARIADIC, + }); + } + } +}; + +export const parameterListMustNotHaveRequiredParametersAfterOptionalParameters = ( + node: SdsParameterList, + accept: ValidationAcceptor, +) => { + let foundOptional = false; + for (const parameter of node.parameters) { + if (parameter.defaultValue) { + foundOptional = true; + } else if (foundOptional && !parameter.variadic) { + accept('error', 'After the first optional parameter all parameters must be optional.', { + node: parameter, + property: 'name', + code: CODE_PARAMETER_LIST_REQUIRED_AFTER_OPTIONAL, + }); + } + } +}; + +export const parameterListVariadicParameterMustBeLast = (node: SdsParameterList, accept: ValidationAcceptor) => { + let foundVariadic = false; + for (const parameter of node.parameters) { + if (foundVariadic) { + accept('error', 'After a variadic parameter no more parameters must be specified.', { + node: parameter, + property: 'name', + code: CODE_PARAMETER_LIST_VARIADIC_NOT_LAST, + }); + } + + if (parameter.variadic) { + foundVariadic = true; + } + } +}; diff --git a/src/language/validation/safe-ds-validator.ts b/src/language/validation/safe-ds-validator.ts index 633cad68e..9241c8656 100644 --- a/src/language/validation/safe-ds-validator.ts +++ b/src/language/validation/safe-ds-validator.ts @@ -19,6 +19,11 @@ import { yieldMustNotBeUsedInPipeline } from './other/statements/assignments.js' import { attributeMustHaveTypeHint, parameterMustHaveTypeHint, resultMustHaveTypeHint } from './types.js'; import { moduleDeclarationsMustMatchFileKind, moduleWithDeclarationsMustStatePackage } from './other/modules.js'; import { typeParameterConstraintLeftOperandMustBeOwnTypeParameter } from './other/declarations/typeParameterConstraints.js'; +import { + parameterListMustNotHaveOptionalAndVariadicParameters, + parameterListMustNotHaveRequiredParametersAfterOptionalParameters, + parameterListVariadicParameterMustBeLast, +} from './other/declarations/parameterLists.js'; /** * Register custom validation checks. @@ -38,6 +43,11 @@ export const registerValidationChecks = function (services: SafeDsServices) { SdsFunction: [functionResultListShouldNotBeEmpty], SdsModule: [moduleDeclarationsMustMatchFileKind, moduleWithDeclarationsMustStatePackage], SdsParameter: [parameterMustHaveTypeHint], + SdsParameterList: [ + parameterListMustNotHaveOptionalAndVariadicParameters, + parameterListMustNotHaveRequiredParametersAfterOptionalParameters, + parameterListVariadicParameterMustBeLast, + ], SdsResult: [resultMustHaveTypeHint], SdsSegment: [segmentResultListShouldNotBeEmpty], SdsTemplateString: [templateStringMustHaveExpressionBetweenTwoStringParts], diff --git a/tests/resources/validation/other/declarations/parameter lists/must not have required after optional/main.sdstest b/tests/resources/validation/other/declarations/parameter lists/must not have required after optional/main.sdstest new file mode 100644 index 000000000..86560eea1 --- /dev/null +++ b/tests/resources/validation/other/declarations/parameter lists/must not have required after optional/main.sdstest @@ -0,0 +1,126 @@ +package tests.validation.other.declarations.parameterLists.mustNotHaveRequiredAfterOptional + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +annotation MyAnnotation1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +annotation MyAnnotation2(»a«: Int, »b«: Int = 1) + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +annotation MyAnnotation3(»a«: Int) + + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +class MyClass1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +class MyClass2(»a«: Int, »b«: Int = 1) + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +class MyClass3(»a«: Int) + + +enum MyEnum { + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + MyEnumVariant1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + MyEnumVariant2(»a«: Int, »b«: Int = 1) + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + MyEnumVariant3(»a«: Int) +} + + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +fun myFunction1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +fun myFunction2(»a«: Int, »b«: Int = 1) + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +fun myFunction3(»a«: Int) + + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +segment mySegment1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) {} + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +// $TEST$ no error "After the first optional parameter all parameters must be optional." +segment mySegment2(»a«: Int, »b«: Int = 1) {} + +// $TEST$ no error "After the first optional parameter all parameters must be optional." +segment mySegment3(»a«: Int) {} + + +pipeline myPipeline { + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + (»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) {}; + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + (»a«: Int, »b«: Int = 1) {}; + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + (»a«: Int) {}; + + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + (»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) -> 1; + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + (»a«: Int, »b«: Int = 1) -> 1; + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + (»a«: Int) -> 1; +} + + +fun myFunction4( + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + p1: (»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) -> (), + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + // $TEST$ no error "After the first optional parameter all parameters must be optional." + p2: (»a«: Int, »b«: Int = 1) -> (), + + // $TEST$ no error "After the first optional parameter all parameters must be optional." + p3: (»a«: Int) -> (), +) diff --git a/tests/resources/validation/other/declarations/parameter lists/must not mix optional and variadic/main.sdstest b/tests/resources/validation/other/declarations/parameter lists/must not mix optional and variadic/main.sdstest new file mode 100644 index 000000000..f321b8ab8 --- /dev/null +++ b/tests/resources/validation/other/declarations/parameter lists/must not mix optional and variadic/main.sdstest @@ -0,0 +1,142 @@ +package tests.validation.other.declarations.parameterLists.mustNotMixOptionalAndVariadic + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +annotation MyAnnotation1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +annotation MyAnnotation2(»a«: Int, vararg »b«: Int) + +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +annotation MyAnnotation3(vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) + + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +class MyClass1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +class MyClass2(»a«: Int, vararg »b«: Int) + +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +class MyClass3(vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) + + +enum MyEnum { + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + MyEnumVariant1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + MyEnumVariant2(»a«: Int, vararg »b«: Int) + + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + MyEnumVariant3(vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) +} + + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +fun myFunction1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +fun myFunction2(»a«: Int, vararg »b«: Int) + +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +fun myFunction3(vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) + + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +segment mySegment1(»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) {} + +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +segment mySegment2(»a«: Int, vararg »b«: Int) {} + +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ no error "A callable with optional parameters must not have a variadic parameter." +// $TEST$ error "A callable with optional parameters must not have a variadic parameter." +segment mySegment3(vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) {} + + +pipeline myPipeline { + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + (»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) {}; + + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + (»a«: Int, vararg »b«: Int) {}; + + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + (vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) {}; + + + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + (»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) -> 1; + + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + (»a«: Int, vararg »b«: Int) -> 1; + + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + (vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) -> 1; +} + + +fun myFunction4( + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + p1: (»a«: Int, »b«: Int = 1, »c«: Int, »d«: Int = 2, vararg »e«: Int) -> (), + + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + p2: (»a«: Int, vararg »b«: Int) -> (), + + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ no error "A callable with optional parameters must not have a variadic parameter." + // $TEST$ error "A callable with optional parameters must not have a variadic parameter." + p3: (vararg »a«: Int, »b«: Int = 1, vararg »c«: Int) -> (), +) diff --git a/tests/resources/validation/other/declarations/parameter lists/variadic must be last/main.sdstest b/tests/resources/validation/other/declarations/parameter lists/variadic must be last/main.sdstest new file mode 100644 index 000000000..a286a5616 --- /dev/null +++ b/tests/resources/validation/other/declarations/parameter lists/variadic must be last/main.sdstest @@ -0,0 +1,118 @@ +package tests.validation.other.declarations.parameterLists.variadicMustBeLast + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +annotation MyAnnotation1(»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +annotation MyAnnotation2(»a«: Int, »b«: Int = 1, vararg »c«: Int) + + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +class MyClass1(»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +class MyClass2(»a«: Int, »b«: Int = 1, vararg »c«: Int) + + +enum MyEnum { + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + MyEnumVariant1(»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) + + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + MyEnumVariant2(»a«: Int, »b«: Int = 1, vararg »c«: Int) +} + + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +fun myFunction1(»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +fun myFunction2(»a«: Int, »b«: Int = 1, vararg »c«: Int) + + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +// $TEST$ error "After a variadic parameter no more parameters must be specified." +segment mySegment1(»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) {} + +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +// $TEST$ no error "After a variadic parameter no more parameters must be specified." +segment mySegment2(»a«: Int, »b«: Int = 1, vararg »c«: Int) {} + + +pipeline myPipeline { + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + (»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) {}; + + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + (»a«: Int, »b«: Int = 1, vararg »c«: Int) {}; + + + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + (»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) -> 1; + + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + (»a«: Int, »b«: Int = 1, vararg »c«: Int) -> 1; +} + + +fun myFunction3( + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + // $TEST$ error "After a variadic parameter no more parameters must be specified." + p1: (»a«: Int, »b«: Int = 1, vararg »c«: Int, »d«: Int, »e«: Int = 1, vararg »f«: Int) -> (), + + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + // $TEST$ no error "After a variadic parameter no more parameters must be specified." + p2: (»a«: Int, »b«: Int = 1, vararg »c«: Int) -> (), +)