diff --git a/src/language/validation/nameConvention.ts b/src/language/validation/nameConvention.ts deleted file mode 100644 index 57dc02cc9..000000000 --- a/src/language/validation/nameConvention.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { SdsDeclaration } from '../generated/ast.js'; -import { ValidationAcceptor } from 'langium'; - -const blockLambdaPrefix = '__block_lambda_'; - -export const nameMustNotStartWithBlockLambdaPrefix = (node: SdsDeclaration, accept: ValidationAcceptor) => { - const name = node.name ?? ''; - if (name.startsWith(blockLambdaPrefix)) { - accept( - 'error', - "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas.", - { - node, - property: 'name', - code: 'nameConvention/blockLambdaPrefix', - }, - ); - } -}; - -export const nameShouldHaveCorrectCasing = (node: SdsDeclaration, accept: ValidationAcceptor) => { - switch (node.$type) { - case 'SdsAnnotation': - if (!isUpperCamelCase(node.name)) { - acceptCasingWarning(node, 'annotations', 'UpperCamelCase', accept); - } - return; - case 'SdsAttribute': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'attributes', 'lowerCamelCase', accept); - } - return; - case 'SdsBlockLambdaResult': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'block lambda results', 'lowerCamelCase', accept); - } - return; - case 'SdsClass': - if (!isUpperCamelCase(node.name)) { - acceptCasingWarning(node, 'classes', 'UpperCamelCase', accept); - } - return; - case 'SdsEnum': - if (!isUpperCamelCase(node.name)) { - acceptCasingWarning(node, 'enums', 'UpperCamelCase', accept); - } - return; - case 'SdsEnumVariant': - if (!isUpperCamelCase(node.name)) { - acceptCasingWarning(node, 'enum variants', 'UpperCamelCase', accept); - } - return; - case 'SdsFunction': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'functions', 'lowerCamelCase', accept); - } - return; - case 'SdsModule': - const name = node.name ?? ''; - const segments = name.split('.'); - if (name !== '' && !segments.every(isLowerCamelCase)) { - accept('warning', 'All segments of the qualified name of a package should be lowerCamelCase.', { - node, - property: 'name', - code: 'nameConvention/casing', - }); - } - return; - case 'SdsParameter': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'parameters', 'lowerCamelCase', accept); - } - return; - case 'SdsPipeline': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'pipelines', 'lowerCamelCase', accept); - } - return; - case 'SdsPlaceholder': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'placeholders', 'lowerCamelCase', accept); - } - return; - case 'SdsResult': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'results', 'lowerCamelCase', accept); - } - return; - case 'SdsSchema': - if (!isUpperCamelCase(node.name)) { - acceptCasingWarning(node, 'schemas', 'UpperCamelCase', accept); - } - return; - case 'SdsSegment': - if (!isLowerCamelCase(node.name)) { - acceptCasingWarning(node, 'segments', 'lowerCamelCase', accept); - } - return; - case 'SdsTypeParameter': - if (!isUpperCamelCase(node.name)) { - acceptCasingWarning(node, 'type parameters', 'UpperCamelCase', accept); - } - return; - } -}; - -const isLowerCamelCase = (name: string): boolean => { - return /^[a-z][a-zA-Z0-9]*$/gu.test(name); -}; - -const isUpperCamelCase = (name: string): boolean => { - return /^[A-Z][a-zA-Z0-9]*$/gu.test(name); -}; - -const acceptCasingWarning = ( - node: SdsDeclaration, - nodeName: string, - expectedCasing: string, - accept: ValidationAcceptor, -) => { - accept('warning', `Names of ${nodeName} should be ${expectedCasing}.`, { - node, - property: 'name', - code: 'nameConvention/casing', - }); -}; diff --git a/src/language/validation/names.ts b/src/language/validation/names.ts new file mode 100644 index 000000000..bc58baf49 --- /dev/null +++ b/src/language/validation/names.ts @@ -0,0 +1,100 @@ +import { SdsDeclaration } from '../generated/ast.js'; +import { ValidationAcceptor } from 'langium'; + +export const CODE_NAMES_BLOCK_LAMBDA_PREFIX = 'names/block-lambda-prefix'; +export const CODE_NAMES_CASING = 'names/casing'; + +export const nameMustNotStartWithBlockLambdaPrefix = (node: SdsDeclaration, accept: ValidationAcceptor) => { + const name = node.name ?? ''; + const blockLambdaPrefix = '__block_lambda_'; + if (name.startsWith(blockLambdaPrefix)) { + accept( + 'error', + "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas.", + { + node, + property: 'name', + code: CODE_NAMES_BLOCK_LAMBDA_PREFIX, + }, + ); + } +}; + +export const nameShouldHaveCorrectCasing = (node: SdsDeclaration, accept: ValidationAcceptor): void => { + switch (node.$type) { + case 'SdsAnnotation': + return nameShouldBeUpperCamelCase(node, 'annotations', accept); + case 'SdsAttribute': + return nameShouldBeLowerCamelCase(node, 'attributes', accept); + case 'SdsBlockLambdaResult': + return nameShouldBeLowerCamelCase(node, 'block lambda results', accept); + case 'SdsClass': + return nameShouldBeUpperCamelCase(node, 'classes', accept); + case 'SdsEnum': + return nameShouldBeUpperCamelCase(node, 'enums', accept); + case 'SdsEnumVariant': + return nameShouldBeUpperCamelCase(node, 'enum variants', accept); + case 'SdsFunction': + return nameShouldBeLowerCamelCase(node, 'functions', accept); + case 'SdsModule': + const name = node.name ?? ''; + const segments = name.split('.'); + if (name !== '' && !segments.every(isLowerCamelCase)) { + accept('warning', 'All segments of the qualified name of a package should be lowerCamelCase.', { + node, + property: 'name', + code: CODE_NAMES_CASING, + }); + } + return; + case 'SdsParameter': + return nameShouldBeLowerCamelCase(node, 'parameters', accept); + case 'SdsPipeline': + return nameShouldBeLowerCamelCase(node, 'pipelines', accept); + case 'SdsPlaceholder': + return nameShouldBeLowerCamelCase(node, 'placeholders', accept); + case 'SdsResult': + return nameShouldBeLowerCamelCase(node, 'results', accept); + case 'SdsSchema': + return nameShouldBeUpperCamelCase(node, 'schemas', accept); + case 'SdsSegment': + return nameShouldBeLowerCamelCase(node, 'segments', accept); + case 'SdsTypeParameter': + return nameShouldBeUpperCamelCase(node, 'type parameters', accept); + } +}; + +const nameShouldBeLowerCamelCase = (node: SdsDeclaration, nodeName: string, accept: ValidationAcceptor): void => { + const name = node.name ?? ''; + if (!isLowerCamelCase(name)) { + acceptCasingWarning(node, nodeName, 'lowerCamelCase', accept); + } +}; + +const isLowerCamelCase = (name: string): boolean => { + return /^[a-z][a-zA-Z0-9]*$/gu.test(name); +}; + +const nameShouldBeUpperCamelCase = (node: SdsDeclaration, nodeName: string, accept: ValidationAcceptor): void => { + const name = node.name ?? ''; + if (!isUpperCamelCase(name)) { + acceptCasingWarning(node, nodeName, 'UpperCamelCase', accept); + } +}; + +const isUpperCamelCase = (name: string): boolean => { + return /^[A-Z][a-zA-Z0-9]*$/gu.test(name); +}; + +const acceptCasingWarning = ( + node: SdsDeclaration, + nodeName: string, + expectedCasing: string, + accept: ValidationAcceptor, +) => { + accept('warning', `Names of ${nodeName} should be ${expectedCasing}.`, { + node, + property: 'name', + code: CODE_NAMES_CASING, + }); +}; diff --git a/src/language/validation/safe-ds-validator.ts b/src/language/validation/safe-ds-validator.ts index 62b641cae..9dc834ab7 100644 --- a/src/language/validation/safe-ds-validator.ts +++ b/src/language/validation/safe-ds-validator.ts @@ -1,7 +1,20 @@ import { ValidationChecks } from 'langium'; import { SafeDsAstType } from '../generated/ast.js'; import type { SafeDsServices } from '../safe-ds-module.js'; -import { nameMustNotStartWithBlockLambdaPrefix, nameShouldHaveCorrectCasing } from './nameConvention.js'; +import { nameMustNotStartWithBlockLambdaPrefix, nameShouldHaveCorrectCasing } from './names.js'; +import { + annotationParameterListShouldNotBeEmpty, + assignmentShouldHaveMoreThanWildcardsAsAssignees, + classBodyShouldNotBeEmpty, + classTypeParameterListShouldNotBeEmpty, + enumBodyShouldNotBeEmpty, + enumVariantParameterListShouldNotBeEmpty, + enumVariantTypeParameterListShouldNotBeEmpty, + functionResultListShouldNotBeEmpty, + functionTypeParameterListShouldNotBeEmpty, + segmentResultListShouldNotBeEmpty, + unionTypeShouldNotHaveASingularTypeArgument, +} from './unnecessarySyntax.js'; /** * Register custom validation checks. @@ -10,7 +23,15 @@ export const registerValidationChecks = function (services: SafeDsServices) { const registry = services.validation.ValidationRegistry; const validator = services.validation.SafeDsValidator; const checks: ValidationChecks = { + SdsAssignment: [assignmentShouldHaveMoreThanWildcardsAsAssignees], + SdsAnnotation: [annotationParameterListShouldNotBeEmpty], + SdsClass: [classBodyShouldNotBeEmpty, classTypeParameterListShouldNotBeEmpty], SdsDeclaration: [nameMustNotStartWithBlockLambdaPrefix, nameShouldHaveCorrectCasing], + SdsEnum: [enumBodyShouldNotBeEmpty], + SdsEnumVariant: [enumVariantParameterListShouldNotBeEmpty, enumVariantTypeParameterListShouldNotBeEmpty], + SdsFunction: [functionResultListShouldNotBeEmpty, functionTypeParameterListShouldNotBeEmpty], + SdsSegment: [segmentResultListShouldNotBeEmpty], + SdsUnionType: [unionTypeShouldNotHaveASingularTypeArgument], }; registry.register(checks, validator); }; diff --git a/src/language/validation/unnecessarySyntax.ts b/src/language/validation/unnecessarySyntax.ts new file mode 100644 index 000000000..442d0aa92 --- /dev/null +++ b/src/language/validation/unnecessarySyntax.ts @@ -0,0 +1,161 @@ +import { + isSdsWildcard, + SdsAnnotation, + SdsAssignment, + SdsClass, + SdsEnum, + SdsEnumVariant, + SdsFunction, + SdsSegment, + SdsUnionType, +} from '../generated/ast.js'; +import { ValidationAcceptor } from 'langium'; +import { isEmpty } from 'radash'; + +export const CODE_STYLE_UNNECESSARY_ASSIGNMENT = 'style/unnecessary-assignment'; +export const CODE_STYLE_UNNECESSARY_ARGUMENT_LIST = 'style/unnecessary-argument-list'; +export const CODE_STYLE_UNNECESSARY_BODY = 'style/unnecessary-body'; +export const CODE_STYLE_UNNECESSARY_ELVIS_OPERATOR = 'style/unnecessary-elvis-operator'; +export const CODE_STYLE_UNNECESSARY_SAFE_ACCESS = 'style/unnecessary-safe-access'; +export const CODE_STYLE_UNNECESSARY_PARAMETER_LIST = 'style/unnecessary-parameter-list'; +export const CODE_STYLE_UNNECESSARY_RESULT_LIST = 'style/unnecessary-result-list'; +export const CODE_STYLE_UNNECESSARY_TYPE_ARGUMENT_LIST = 'style/unnecessary-type-argument-list'; +export const CODE_STYLE_UNNECESSARY_TYPE_PARAMETER_LIST = 'style/unnecessary-type-parameter-list'; +export const CODE_STYLE_UNNECESSARY_UNION_TYPE = 'style/unnecessary-union-type'; + +// ----------------------------------------------------------------------------- +// Unnecessary assignment +// ----------------------------------------------------------------------------- + +export const assignmentShouldHaveMoreThanWildcardsAsAssignees = ( + node: SdsAssignment, + accept: ValidationAcceptor, +): void => { + const assignees = node.assigneeList?.assignees ?? []; + if (assignees.every(isSdsWildcard)) { + accept('info', 'This assignment can be replaced by an expression statement.', { + node, + code: CODE_STYLE_UNNECESSARY_ASSIGNMENT, + }); + } +}; + +// ----------------------------------------------------------------------------- +// Unnecessary bodies +// ----------------------------------------------------------------------------- + +export const classBodyShouldNotBeEmpty = (node: SdsClass, accept: ValidationAcceptor) => { + if (node.body && isEmpty(node.body.members)) { + accept('info', 'This body can be removed.', { + node, + property: 'body', + code: CODE_STYLE_UNNECESSARY_BODY, + }); + } +}; + +export const enumBodyShouldNotBeEmpty = (node: SdsEnum, accept: ValidationAcceptor) => { + if (node.body && isEmpty(node.body.variants)) { + accept('info', 'This body can be removed.', { + node, + property: 'body', + code: CODE_STYLE_UNNECESSARY_BODY, + }); + } +}; + +// ----------------------------------------------------------------------------- +// Unnecessary parameter lists +// ----------------------------------------------------------------------------- + +export const annotationParameterListShouldNotBeEmpty = (node: SdsAnnotation, accept: ValidationAcceptor) => { + if (node.parameterList && isEmpty(node.parameterList.parameters)) { + accept('info', 'This parameter list can be removed.', { + node, + property: 'parameterList', + code: CODE_STYLE_UNNECESSARY_PARAMETER_LIST, + }); + } +}; + +export const enumVariantParameterListShouldNotBeEmpty = (node: SdsEnumVariant, accept: ValidationAcceptor) => { + if (node.parameterList && isEmpty(node.parameterList.parameters)) { + accept('info', 'This parameter list can be removed.', { + node, + property: 'parameterList', + code: CODE_STYLE_UNNECESSARY_PARAMETER_LIST, + }); + } +}; + +// ----------------------------------------------------------------------------- +// Unnecessary result lists +// ----------------------------------------------------------------------------- + +export const functionResultListShouldNotBeEmpty = (node: SdsFunction, accept: ValidationAcceptor) => { + if (node.resultList && isEmpty(node.resultList.results)) { + accept('info', 'This result list can be removed.', { + node, + property: 'resultList', + code: CODE_STYLE_UNNECESSARY_RESULT_LIST, + }); + } +}; + +export const segmentResultListShouldNotBeEmpty = (node: SdsSegment, accept: ValidationAcceptor) => { + if (node.resultList && isEmpty(node.resultList.results)) { + accept('info', 'This result list can be removed.', { + node, + property: 'resultList', + code: CODE_STYLE_UNNECESSARY_RESULT_LIST, + }); + } +}; + +// ----------------------------------------------------------------------------- +// Unnecessary type parameter lists +// ----------------------------------------------------------------------------- + +export const classTypeParameterListShouldNotBeEmpty = (node: SdsClass, accept: ValidationAcceptor) => { + if (node.typeParameterList && isEmpty(node.typeParameterList.typeParameters)) { + accept('info', 'This type parameter list can be removed.', { + node, + property: 'typeParameterList', + code: CODE_STYLE_UNNECESSARY_TYPE_PARAMETER_LIST, + }); + } +}; + +export const enumVariantTypeParameterListShouldNotBeEmpty = (node: SdsEnumVariant, accept: ValidationAcceptor) => { + if (node.typeParameterList && isEmpty(node.typeParameterList.typeParameters)) { + accept('info', 'This type parameter list can be removed.', { + node, + property: 'typeParameterList', + code: CODE_STYLE_UNNECESSARY_TYPE_PARAMETER_LIST, + }); + } +}; + +export const functionTypeParameterListShouldNotBeEmpty = (node: SdsFunction, accept: ValidationAcceptor) => { + if (node.typeParameterList && isEmpty(node.typeParameterList.typeParameters)) { + accept('info', 'This type parameter list can be removed.', { + node, + property: 'typeParameterList', + code: CODE_STYLE_UNNECESSARY_TYPE_PARAMETER_LIST, + }); + } +}; + +// ----------------------------------------------------------------------------- +// Unnecessary type parameter lists +// ----------------------------------------------------------------------------- + +export const unionTypeShouldNotHaveASingularTypeArgument = (node: SdsUnionType, accept: ValidationAcceptor) => { + const typeArguments = node.typeArgumentList?.typeArguments ?? []; + if (typeArguments.length === 1) { + accept('info', 'This can be replaced by the singular type argument of the union type.', { + node, + code: CODE_STYLE_UNNECESSARY_UNION_TYPE, + }); + } +}; diff --git a/tests/language/validation/testValidation.test.ts b/tests/language/validation/testValidation.test.ts index 98f21357e..9ffe3fda1 100644 --- a/tests/language/validation/testValidation.test.ts +++ b/tests/language/validation/testValidation.test.ts @@ -31,10 +31,14 @@ describe('validation', async () => { if (expectedIssue.presence === 'present') { if (actualIssues.length === 0) { throw new AssertionError({ - message: `Expected to find a matching issue ${issueLocationToString( + message: `Expected to find a matching ${expectedIssue.severity} ${issueLocationToString( expectedIssue, )} but found none.`, - actual: [], + actual: getMatchingActualIssues({ + presence: expectedIssue.presence, + severity: expectedIssue.severity, + uri: expectedIssue.uri, + }), expected: [expectedIssue], }); } @@ -44,7 +48,7 @@ describe('validation', async () => { else { if (actualIssues.length > 0) { throw new AssertionError({ - message: `Expected to find no matching issue ${issueLocationToString( + message: `Expected to find no matching ${expectedIssue.severity} ${issueLocationToString( expectedIssue, )} but found some.`, actual: actualIssues, diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/annotations.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/annotations.sdstest similarity index 85% rename from tests/resources/validation/name convention/__block_lambda_ prefix/annotations.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/annotations.sdstest index f7e1c3911..d6e72e88b 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/annotations.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/annotations.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." annotation »__block_lambda_0« diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/attributes.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/attributes.sdstest similarity index 86% rename from tests/resources/validation/name convention/__block_lambda_ prefix/attributes.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/attributes.sdstest index bf102c877..c00524d6f 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/attributes.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/attributes.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix class MyClass { // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/block lambda results.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/block lambda results.sdstest similarity index 87% rename from tests/resources/validation/name convention/__block_lambda_ prefix/block lambda results.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/block lambda results.sdstest index 63e281ded..35cc49624 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/block lambda results.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/block lambda results.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix pipeline myPipeline2 { () { diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/classes.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/classes.sdstest similarity index 84% rename from tests/resources/validation/name convention/__block_lambda_ prefix/classes.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/classes.sdstest index faf15828d..b1a513e91 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/classes.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/classes.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." class »__block_lambda_0« diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/enum variants.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/enum variants.sdstest similarity index 85% rename from tests/resources/validation/name convention/__block_lambda_ prefix/enum variants.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/enum variants.sdstest index 463705f84..096504548 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/enum variants.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/enum variants.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix enum MyEnum { // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/enums.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/enums.sdstest similarity index 84% rename from tests/resources/validation/name convention/__block_lambda_ prefix/enums.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/enums.sdstest index 3b28ee32b..fe820ae01 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/enums.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/enums.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." enum »__block_lambda_0« diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/functions.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/functions.sdstest similarity index 84% rename from tests/resources/validation/name convention/__block_lambda_ prefix/functions.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/functions.sdstest index cc1a0d55f..9c99c5a4b 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/functions.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/functions.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." fun »__block_lambda_0«() diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/no package name.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/no package name.sdstest similarity index 100% rename from tests/resources/validation/name convention/__block_lambda_ prefix/no package name.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/no package name.sdstest diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/package name with block lambda prefix.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/package name with block lambda prefix.sdstest similarity index 100% rename from tests/resources/validation/name convention/__block_lambda_ prefix/package name with block lambda prefix.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/package name with block lambda prefix.sdstest diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/package name without block lambda prefix.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/package name without block lambda prefix.sdstest similarity index 100% rename from tests/resources/validation/name convention/__block_lambda_ prefix/package name without block lambda prefix.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/package name without block lambda prefix.sdstest diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/parameters.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/parameters.sdstest similarity index 86% rename from tests/resources/validation/name convention/__block_lambda_ prefix/parameters.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/parameters.sdstest index cce1fb7ef..9fbf21acd 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/parameters.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/parameters.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix fun myFunction1( // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/pipelines.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/pipelines.sdstest similarity index 85% rename from tests/resources/validation/name convention/__block_lambda_ prefix/pipelines.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/pipelines.sdstest index bfffa3d31..fc10c0a35 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/pipelines.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/pipelines.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." pipeline »__block_lambda_0« {} diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/placeholders.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/placeholders.sdstest similarity index 86% rename from tests/resources/validation/name convention/__block_lambda_ prefix/placeholders.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/placeholders.sdstest index 819ecf56b..92fd70ff9 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/placeholders.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/placeholders.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix pipeline myPipeline1 { // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/results.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/results.sdstest similarity index 86% rename from tests/resources/validation/name convention/__block_lambda_ prefix/results.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/results.sdstest index e0d7e9dff..82d3f06c3 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/results.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/results.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix fun myFunction2() -> ( // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/schemas.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/schemas.sdstest similarity index 85% rename from tests/resources/validation/name convention/__block_lambda_ prefix/schemas.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/schemas.sdstest index 7d7b68d6f..b39f5072d 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/schemas.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/schemas.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." schema »__block_lambda_0« {} diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/segments.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/segments.sdstest similarity index 85% rename from tests/resources/validation/name convention/__block_lambda_ prefix/segments.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/segments.sdstest index 3897af97e..51e23ce62 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/segments.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/segments.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." segment »__block_lambda_0«() {} diff --git a/tests/resources/validation/name convention/__block_lambda_ prefix/type parameters.sdstest b/tests/resources/validation/names/__block_lambda_ prefix/type parameters.sdstest similarity index 85% rename from tests/resources/validation/name convention/__block_lambda_ prefix/type parameters.sdstest rename to tests/resources/validation/names/__block_lambda_ prefix/type parameters.sdstest index 218854599..5503e2cf3 100644 --- a/tests/resources/validation/name convention/__block_lambda_ prefix/type parameters.sdstest +++ b/tests/resources/validation/names/__block_lambda_ prefix/type parameters.sdstest @@ -1,4 +1,4 @@ -package tests.validation.nameConvention.blockLambdaPrefix +package tests.validation.names.blockLambdaPrefix fun myFunction3< // $TEST$ error "Names of declarations must not start with '__block_lambda_'. This is reserved for code generation of block lambdas." diff --git a/tests/resources/validation/name convention/casing of declaration names/annotations.sdstest b/tests/resources/validation/names/casing/annotations.sdstest similarity index 89% rename from tests/resources/validation/name convention/casing of declaration names/annotations.sdstest rename to tests/resources/validation/names/casing/annotations.sdstest index bc083bd1b..dcea9ac1f 100644 --- a/tests/resources/validation/name convention/casing of declaration names/annotations.sdstest +++ b/tests/resources/validation/names/casing/annotations.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ no warning "Names of annotations should be UpperCamelCase." annotation »AnnotationUppercase1« diff --git a/tests/resources/validation/name convention/casing of declaration names/attributes.sdstest b/tests/resources/validation/names/casing/attributes.sdstest similarity index 90% rename from tests/resources/validation/name convention/casing of declaration names/attributes.sdstest rename to tests/resources/validation/names/casing/attributes.sdstest index 3450363a8..20a166b4a 100644 --- a/tests/resources/validation/name convention/casing of declaration names/attributes.sdstest +++ b/tests/resources/validation/names/casing/attributes.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing class MyClass { // $TEST$ warning "Names of attributes should be lowerCamelCase." diff --git a/tests/resources/validation/name convention/casing of declaration names/block lambda results.sdstest b/tests/resources/validation/names/casing/block lambda results.sdstest similarity index 92% rename from tests/resources/validation/name convention/casing of declaration names/block lambda results.sdstest rename to tests/resources/validation/names/casing/block lambda results.sdstest index 165997092..94eb791c5 100644 --- a/tests/resources/validation/name convention/casing of declaration names/block lambda results.sdstest +++ b/tests/resources/validation/names/casing/block lambda results.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing pipeline myPipeline1 { () { diff --git a/tests/resources/validation/name convention/casing of declaration names/classes.sdstest b/tests/resources/validation/names/casing/classes.sdstest similarity index 88% rename from tests/resources/validation/name convention/casing of declaration names/classes.sdstest rename to tests/resources/validation/names/casing/classes.sdstest index 4a096b7f7..76974656c 100644 --- a/tests/resources/validation/name convention/casing of declaration names/classes.sdstest +++ b/tests/resources/validation/names/casing/classes.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ no warning "Names of classes should be UpperCamelCase." class »ClassUppercase1« diff --git a/tests/resources/validation/name convention/casing of declaration names/enum variants.sdstest b/tests/resources/validation/names/casing/enum variants.sdstest similarity index 89% rename from tests/resources/validation/name convention/casing of declaration names/enum variants.sdstest rename to tests/resources/validation/names/casing/enum variants.sdstest index 50571e29b..3742ecda0 100644 --- a/tests/resources/validation/name convention/casing of declaration names/enum variants.sdstest +++ b/tests/resources/validation/names/casing/enum variants.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing enum MyEnum { // $TEST$ no warning "Names of enum variants should be UpperCamelCase." diff --git a/tests/resources/validation/name convention/casing of declaration names/enums.sdstest b/tests/resources/validation/names/casing/enums.sdstest similarity index 87% rename from tests/resources/validation/name convention/casing of declaration names/enums.sdstest rename to tests/resources/validation/names/casing/enums.sdstest index 3f05ac478..095b2e130 100644 --- a/tests/resources/validation/name convention/casing of declaration names/enums.sdstest +++ b/tests/resources/validation/names/casing/enums.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ no warning "Names of enums should be UpperCamelCase." enum »EnumUppercase1« diff --git a/tests/resources/validation/name convention/casing of declaration names/functions.sdstest b/tests/resources/validation/names/casing/functions.sdstest similarity index 88% rename from tests/resources/validation/name convention/casing of declaration names/functions.sdstest rename to tests/resources/validation/names/casing/functions.sdstest index 499367ba4..b4a7d2da9 100644 --- a/tests/resources/validation/name convention/casing of declaration names/functions.sdstest +++ b/tests/resources/validation/names/casing/functions.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ warning "Names of functions should be lowerCamelCase." fun »FunctionUppercase«() diff --git a/tests/resources/validation/name convention/casing of declaration names/no package name.sdstest b/tests/resources/validation/names/casing/no package name.sdstest similarity index 100% rename from tests/resources/validation/name convention/casing of declaration names/no package name.sdstest rename to tests/resources/validation/names/casing/no package name.sdstest diff --git a/tests/resources/validation/name convention/casing of declaration names/package name leading underscore.sdstest b/tests/resources/validation/names/casing/package name leading underscore.sdstest similarity index 100% rename from tests/resources/validation/name convention/casing of declaration names/package name leading underscore.sdstest rename to tests/resources/validation/names/casing/package name leading underscore.sdstest diff --git a/tests/resources/validation/name convention/casing of declaration names/package name lowercase.sdstest b/tests/resources/validation/names/casing/package name lowercase.sdstest similarity index 100% rename from tests/resources/validation/name convention/casing of declaration names/package name lowercase.sdstest rename to tests/resources/validation/names/casing/package name lowercase.sdstest diff --git a/tests/resources/validation/name convention/casing of declaration names/package name snake case.sdstest b/tests/resources/validation/names/casing/package name snake case.sdstest similarity index 100% rename from tests/resources/validation/name convention/casing of declaration names/package name snake case.sdstest rename to tests/resources/validation/names/casing/package name snake case.sdstest diff --git a/tests/resources/validation/name convention/casing of declaration names/package name uppercase.sdstest b/tests/resources/validation/names/casing/package name uppercase.sdstest similarity index 100% rename from tests/resources/validation/name convention/casing of declaration names/package name uppercase.sdstest rename to tests/resources/validation/names/casing/package name uppercase.sdstest diff --git a/tests/resources/validation/name convention/casing of declaration names/parameters.sdstest b/tests/resources/validation/names/casing/parameters.sdstest similarity index 89% rename from tests/resources/validation/name convention/casing of declaration names/parameters.sdstest rename to tests/resources/validation/names/casing/parameters.sdstest index 0b225659a..837a3b9e5 100644 --- a/tests/resources/validation/name convention/casing of declaration names/parameters.sdstest +++ b/tests/resources/validation/names/casing/parameters.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing fun myFunction1( // $TEST$ warning "Names of parameters should be lowerCamelCase." diff --git a/tests/resources/validation/name convention/casing of declaration names/pipelines.sdstest b/tests/resources/validation/names/casing/pipelines.sdstest similarity index 89% rename from tests/resources/validation/name convention/casing of declaration names/pipelines.sdstest rename to tests/resources/validation/names/casing/pipelines.sdstest index 2b5509623..e277b4e20 100644 --- a/tests/resources/validation/name convention/casing of declaration names/pipelines.sdstest +++ b/tests/resources/validation/names/casing/pipelines.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ warning "Names of pipelines should be lowerCamelCase." pipeline »PipelineUppercase« {} diff --git a/tests/resources/validation/name convention/casing of declaration names/placeholders.sdstest b/tests/resources/validation/names/casing/placeholders.sdstest similarity index 90% rename from tests/resources/validation/name convention/casing of declaration names/placeholders.sdstest rename to tests/resources/validation/names/casing/placeholders.sdstest index 630b4ae54..5ecc7fb76 100644 --- a/tests/resources/validation/name convention/casing of declaration names/placeholders.sdstest +++ b/tests/resources/validation/names/casing/placeholders.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing pipeline myPipeline2 { // $TEST$ warning "Names of placeholders should be lowerCamelCase." diff --git a/tests/resources/validation/name convention/casing of declaration names/results.sdstest b/tests/resources/validation/names/casing/results.sdstest similarity index 89% rename from tests/resources/validation/name convention/casing of declaration names/results.sdstest rename to tests/resources/validation/names/casing/results.sdstest index 73e9e6bd0..1eb9d87b4 100644 --- a/tests/resources/validation/name convention/casing of declaration names/results.sdstest +++ b/tests/resources/validation/names/casing/results.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing fun myFunction2() -> ( // $TEST$ warning "Names of results should be lowerCamelCase." diff --git a/tests/resources/validation/name convention/casing of declaration names/schemas.sdstest b/tests/resources/validation/names/casing/schemas.sdstest similarity index 88% rename from tests/resources/validation/name convention/casing of declaration names/schemas.sdstest rename to tests/resources/validation/names/casing/schemas.sdstest index 8ec1dc816..8cc8d550b 100644 --- a/tests/resources/validation/name convention/casing of declaration names/schemas.sdstest +++ b/tests/resources/validation/names/casing/schemas.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ no warning "Names of schemas should be UpperCamelCase." schema »SchemaUppercase1« {} diff --git a/tests/resources/validation/name convention/casing of declaration names/segments.sdstest b/tests/resources/validation/names/casing/segments.sdstest similarity index 89% rename from tests/resources/validation/name convention/casing of declaration names/segments.sdstest rename to tests/resources/validation/names/casing/segments.sdstest index 400cf4bc6..ba257bce5 100644 --- a/tests/resources/validation/name convention/casing of declaration names/segments.sdstest +++ b/tests/resources/validation/names/casing/segments.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing // $TEST$ warning "Names of segments should be lowerCamelCase." segment »SegmentUppercase«() {} diff --git a/tests/resources/validation/name convention/casing of declaration names/type parameters.sdstest b/tests/resources/validation/names/casing/type parameters.sdstest similarity index 90% rename from tests/resources/validation/name convention/casing of declaration names/type parameters.sdstest rename to tests/resources/validation/names/casing/type parameters.sdstest index 3ad52ffe9..b9fede2b4 100644 --- a/tests/resources/validation/name convention/casing of declaration names/type parameters.sdstest +++ b/tests/resources/validation/names/casing/type parameters.sdstest @@ -1,4 +1,4 @@ -package tests.validation.declarations.nameCasing +package tests.validation.names.casing fun myFunction3< // $TEST$ no warning "Names of type parameters should be UpperCamelCase." diff --git a/tests/resources/validation/unnecessary syntax/unnecessary assignment/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary assignment/main.sdstest new file mode 100644 index 000000000..6a658ee17 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary assignment/main.sdstest @@ -0,0 +1,31 @@ +package tests.validation.unnecessarySyntax.unnecessaryAssignment + +fun f() -> (a: Int, b: Int) + +class MyClass { + fun f() -> (a: Int, b: Int) +} + +segment mySegment() -> a: Int { + // $TEST$ info "This assignment can be replaced by an expression statement." + »_, _ = f();« + // $TEST$ info "This assignment can be replaced by an expression statement." + »_, _ = MyClass().f();« + + // $TEST$ no info "This assignment can be replaced by an expression statement." + »val a = 1;« + // $TEST$ no info "This assignment can be replaced by an expression statement." + »yield a = 1;« + + () { + // $TEST$ info "This assignment can be replaced by an expression statement." + »_, _ = f();« + // $TEST$ info "This assignment can be replaced by an expression statement." + »_, _ = MyClass().f();« + + // $TEST$ no info "This assignment can be replaced by an expression statement." + »val a = 1;« + // $TEST$ no info "This assignment can be replaced by an expression statement." + »yield a = 1;« + }; +} diff --git a/tests/resources/validation/unnecessary syntax/unnecessary body in class/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary body in class/main.sdstest new file mode 100644 index 000000000..c2d3d12bf --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary body in class/main.sdstest @@ -0,0 +1,14 @@ +package tests.validation.unnecessarySyntax.unnecessaryBodyInClass + +// $TEST$ info "This body can be removed." +class MyClass1 »{}« + +// $TEST$ no info "This body can be removed." +class MyClass2 »{ + fun f() +}« + +// $TEST$ no info "This body can be removed." +class MyClass3 »{ + attr a: Int +}« diff --git a/tests/resources/validation/unnecessary syntax/unnecessary body in enum/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary body in enum/main.sdstest new file mode 100644 index 000000000..0928c4d66 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary body in enum/main.sdstest @@ -0,0 +1,9 @@ +package tests.validation.unnecessarySyntax.unnecessaryBodyInEnum + +// $TEST$ info "This body can be removed." +enum MyEnum1 »{}« + +// $TEST$ no info "This body can be removed." +enum MyEnum2 »{ + Instance +}« diff --git a/tests/resources/validation/unnecessary syntax/unnecessary parameter list in annotation/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary parameter list in annotation/main.sdstest new file mode 100644 index 000000000..17ed4fa67 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary parameter list in annotation/main.sdstest @@ -0,0 +1,7 @@ +package tests.validation.unnecessarySyntax.unnecessaryParameterListInAnnotation + +// $TEST$ info "This parameter list can be removed." +annotation MyAnnotation1»()« + +// $TEST$ no info "This parameter list can be removed." +annotation MyAnnotation2»(a: Int)« diff --git a/tests/resources/validation/unnecessary syntax/unnecessary parameter list in enum variant/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary parameter list in enum variant/main.sdstest new file mode 100644 index 000000000..aabe2174a --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary parameter list in enum variant/main.sdstest @@ -0,0 +1,7 @@ +package tests.validation.unnecessarySyntax.unnecessaryParameterListInEnumVariant + +// $TEST$ info "This parameter list can be removed." +annotation MyAnnotation1»()« + +// $TEST$ no info "This parameter list can be removed." +annotation MyAnnotation2»(a: Int)« diff --git a/tests/resources/validation/unnecessary syntax/unnecessary result list in function/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary result list in function/main.sdstest new file mode 100644 index 000000000..529dd5c79 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary result list in function/main.sdstest @@ -0,0 +1,7 @@ +package tests.validation.unnecessarySyntax.unnecessaryResultListInFunction + +// $TEST$ info "This result list can be removed." +fun myFun1() »-> ()« + +// $TEST$ no info "This result list can be removed." +fun myFun2() »-> (r: Int)« diff --git a/tests/resources/validation/unnecessary syntax/unnecessary result list in segment/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary result list in segment/main.sdstest new file mode 100644 index 000000000..952176453 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary result list in segment/main.sdstest @@ -0,0 +1,7 @@ +package tests.validation.unnecessarySyntax.unnecessaryResultListInSegment + +// $TEST$ info "This result list can be removed." +segment mySegment1() »-> ()« {} + +// $TEST$ no info "This result list can be removed." +segment mySegment2() »-> (r: Int)« {} diff --git a/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in class/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in class/main.sdstest new file mode 100644 index 000000000..9db0108ba --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in class/main.sdstest @@ -0,0 +1,7 @@ +package tests.validation.unnecessarySyntax.unnecessaryTypeParameterListInClass + +// $TEST$ info "This type parameter list can be removed." +class MyClass1»<>« + +// $TEST$ no info "This type parameter list can be removed." +class MyClass2»« diff --git a/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in enum variant/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in enum variant/main.sdstest new file mode 100644 index 000000000..3f8c1fad5 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in enum variant/main.sdstest @@ -0,0 +1,9 @@ +package tests.validation.unnecessarySyntax.unnecessaryTypeParameterListInEnumVariant + +enum MyEnum { + // $TEST$ info "This type parameter list can be removed." + MyVariant1»<>« + + // $TEST$ no info "This type parameter list can be removed." + MyVariant2»« +} diff --git a/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in function/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in function/main.sdstest new file mode 100644 index 000000000..93f75c7ad --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary type parameter list in function/main.sdstest @@ -0,0 +1,7 @@ +package tests.validation.unnecessarySyntax.unnecessaryTypeParameterListInFunction + +// $TEST$ info "This type parameter list can be removed." +fun myFunction1»<>«() + +// $TEST$ no info "This type parameter list can be removed." +fun myFunction2»«() diff --git a/tests/resources/validation/unnecessary syntax/unnecessary union type/main.sdstest b/tests/resources/validation/unnecessary syntax/unnecessary union type/main.sdstest new file mode 100644 index 000000000..c6cc3b533 --- /dev/null +++ b/tests/resources/validation/unnecessary syntax/unnecessary union type/main.sdstest @@ -0,0 +1,16 @@ +package tests.validation.unnecessarySyntax.unnecessaryUnionType + +// $TEST$ no info "This can be replaced by the singular type argument of the union type." +segment mySegment1( + p: »union<>« +) {} + +// $TEST$ info "This can be replaced by the singular type argument of the union type." +segment mySegment2( + p: »union« +) {} + +// $TEST$ no info "This can be replaced by the singular type argument of the union type." +segment mySegment3( + p: »union« +) {}