diff --git a/docs/language/common/comments.md b/docs/language/common/comments.md index 6b57f3bcd..9a150b958 100644 --- a/docs/language/common/comments.md +++ b/docs/language/common/comments.md @@ -70,7 +70,7 @@ with no special meaning. Documentation comments support [Markdown](https://www.markdownguide.org/) to format the text. Here is an example: -```sds +```sds hl_lines="2" /** * This is a documentation comment with **bold** and *italic* text. */ @@ -86,40 +86,35 @@ Documentation comments can contain tags to provide structured information. `{@link}` is an **inline** tag that can be used to link to another declaration. It takes the name of the declaration as an argument: -```sds +```sds hl_lines="2" /** * Computes the sum of two {@link Int}s. */ fun sum(a: Int, b: Int): sum: Int ``` -To point to _static_ members of a [class][class] or an [enum variant][enum-variant] of an [enum][enum], write the name of -the containing declaration followed by a dot and the name of the member or enum variant: +To point to a member of a [class][class] or an [enum variant][enum-variant] of an [enum][enum], write the name of the +containing declaration followed by a dot and the name of the member or enum variant: -```sds +```sds hl_lines="2" /** - * To create a Table, use {@link Table.fromCsv}. + * To create a Configuration, use {@link Configuration.fromFile}. */ -class Table -``` +class Configuration { -To point to an _instance_ member of a [class][class], write the name of the containing declaration followed by a hash and -the name of the member: - -```sds -/** - * An alias for {@link List#size}. - */ -fun size(list: List): size: Int + /** + * Creates a Configuration from a file. + */ + fun fromFile(file: String) -> result: Configuration +} ``` - #### `@param` Use `@param` to document a [parameter][parameter] of a callable declaration. This tag takes the name of the parameter and its description as arguments. Since a callable can have multiple parameters, this tag can be used multiple times. -```sds +```sds hl_lines="4 5" /** * ... * @@ -134,7 +129,7 @@ fun sum(a: Int, b: Int): sum: Int Use `@result` to document a [result][result] of a callable declaration. This tag takes the name of the result and its description as arguments. Since a callable can have multiple results, this tag can be used multiple times. -```sds +```sds hl_lines="4" /** * ... * @@ -149,7 +144,7 @@ Use `@typeParam` to document a [type parameter][type-parameter] of a generic dec type parameter and its description as arguments. Since a generic declaration can have multiple type parameters, this tag can be used multiple times. -```sds +```sds hl_lines="4" /** * ... * @@ -163,7 +158,7 @@ class List The `@since` tag can be used to specify when a declaration was added. It takes the version as argument and should be used only once. -```sds +```sds hl_lines="4" /** * ... * diff --git a/packages/safe-ds-lang/src/language/documentation/safe-ds-documentation-provider.ts b/packages/safe-ds-lang/src/language/documentation/safe-ds-documentation-provider.ts index 690690a09..5ab5b6ccb 100644 --- a/packages/safe-ds-lang/src/language/documentation/safe-ds-documentation-provider.ts +++ b/packages/safe-ds-lang/src/language/documentation/safe-ds-documentation-provider.ts @@ -25,7 +25,7 @@ import { } from '../generated/ast.js'; import { isEmpty } from '../../helpers/collections.js'; import { SafeDsServices } from '../safe-ds-module.js'; -import { getClassMembers, getEnumVariants, isStatic } from '../helpers/nodeProperties.js'; +import { getClassMembers, getEnumVariants } from '../helpers/nodeProperties.js'; const PARAM_TAG = 'param'; const RESULT_TAG = 'result'; @@ -186,9 +186,8 @@ export class SafeDsDocumentationProvider extends JSDocDocumentationProvider { } private findTarget(node: AstNode, namePath: string): SdsDeclaration | undefined { - let [globalName, ...rest] = this.tokenizeNamepath(namePath); - // `rest` contains pairs of separators and names - if (!globalName || rest.length % 2 !== 0) { + let [globalName, ...rest] = namePath.split('.'); + if (!globalName) { /* c8 ignore next 2 */ return undefined; } @@ -196,39 +195,13 @@ export class SafeDsDocumentationProvider extends JSDocDocumentationProvider { let current = this.findGlobalDeclaration(node, globalName); while (current && !isEmpty(rest)) { - const [separator, name] = rest.slice(0, 2); - rest = rest.slice(2); - - if (separator === '.') { - current = this.findStaticMember(current, name); - } else if (separator === '#') { - current = this.findInstanceMember(current, name); - } else { - /* c8 ignore next 2 */ - return undefined; - } + const name = rest.shift(); + current = this.findMember(current, name); } return current; } - private tokenizeNamepath(namePath: string): string[] { - const result = []; - let current = ''; - - for (const c of namePath) { - if (c === '.' || c === '#') { - result.push(current, c); - current = ''; - } else { - current += c; - } - } - - result.push(current); - return result; - } - private findGlobalDeclaration(node: AstNode, name: string): SdsDeclaration | undefined { const description = this.findNameInPrecomputedScopes(node, name) ?? this.findNameInGlobalScope(node, name); const target = description?.node; @@ -240,33 +213,20 @@ export class SafeDsDocumentationProvider extends JSDocDocumentationProvider { } } - private findStaticMember(node: SdsDeclaration, name: string | undefined): SdsDeclaration | undefined { + private findMember(node: SdsDeclaration, name: string | undefined): SdsDeclaration | undefined { if (!name) { /* c8 ignore next 2 */ return undefined; } if (isSdsClass(node)) { - return getClassMembers(node).find((it) => isStatic(it) && it.name === name); + return getClassMembers(node).find((it) => it.name === name); } else if (isSdsEnum(node)) { return getEnumVariants(node).find((it) => it.name === name); } else { return undefined; } } - - private findInstanceMember(node: SdsDeclaration, name: string | undefined): SdsDeclaration | undefined { - if (!name) { - /* c8 ignore next 2 */ - return undefined; - } - - if (isSdsClass(node)) { - return getClassMembers(node).find((it) => !isStatic(it) && it.name === name); - } else { - return undefined; - } - } } const isBlockTag = (element: JSDocElement): element is JSDocTag => { diff --git a/packages/safe-ds-lang/src/language/validation/names.ts b/packages/safe-ds-lang/src/language/validation/names.ts index 6dbe7471b..22423d762 100644 --- a/packages/safe-ds-lang/src/language/validation/names.ts +++ b/packages/safe-ds-lang/src/language/validation/names.ts @@ -38,7 +38,6 @@ import { getParameters, getResults, getTypeParameters, - isStatic, streamBlockLambdaResults, streamPlaceholders, } from '../helpers/nodeProperties.js'; @@ -224,11 +223,7 @@ export const classMustContainUniqueNames = (node: SdsClass, accept: ValidationAc accept, ); - const instanceMembers = getClassMembers(node).filter((it) => !isStatic(it)); - namesMustBeUnique(instanceMembers, (name) => `An instance member with name '${name}' exists already.`, accept); - - const staticMembers = getClassMembers(node).filter(isStatic); - namesMustBeUnique(staticMembers, (name) => `A static member with name '${name}' exists already.`, accept); + namesMustBeUnique(getClassMembers(node), (name) => `A class member with name '${name}' exists already.`, accept); }; export const enumMustContainUniqueNames = (node: SdsEnum, accept: ValidationAcceptor): void => { diff --git a/packages/safe-ds-lang/tests/language/documentation/safe-ds-documentation-provider.test.ts b/packages/safe-ds-lang/tests/language/documentation/safe-ds-documentation-provider.test.ts index afba75312..51458b3e3 100644 --- a/packages/safe-ds-lang/tests/language/documentation/safe-ds-documentation-provider.test.ts +++ b/packages/safe-ds-lang/tests/language/documentation/safe-ds-documentation-provider.test.ts @@ -360,7 +360,7 @@ describe('SafeDsDocumentationProvider', () => { testName: 'link (instance attribute)', code: ` /** - * {@link MyClass#myAttribute} + * {@link MyClass.myAttribute} */ fun myFunction1() @@ -369,7 +369,7 @@ describe('SafeDsDocumentationProvider', () => { } `, predicate: isSdsFunction, - expectedDocumentation: `[MyClass#myAttribute](`, + expectedDocumentation: `[MyClass.myAttribute](`, }, { testName: 'link (static attribute)', @@ -390,7 +390,7 @@ describe('SafeDsDocumentationProvider', () => { testName: 'link (instance method)', code: ` /** - * {@link MyClass#myMethod} + * {@link MyClass.myMethod} */ fun myFunction1() @@ -399,7 +399,7 @@ describe('SafeDsDocumentationProvider', () => { } `, predicate: isSdsFunction, - expectedDocumentation: `[MyClass#myMethod](`, + expectedDocumentation: `[MyClass.myMethod](`, }, { testName: 'link (nested class)', @@ -450,7 +450,7 @@ describe('SafeDsDocumentationProvider', () => { testName: 'link (long chain)', code: ` /** - * {@link MyClass.NestedClass#myMethod} + * {@link MyClass.NestedClass.myMethod} */ fun myFunction1() @@ -461,7 +461,7 @@ describe('SafeDsDocumentationProvider', () => { } `, predicate: isSdsFunction, - expectedDocumentation: `[MyClass.NestedClass#myMethod](`, + expectedDocumentation: `[MyClass.NestedClass.myMethod](`, }, { testName: 'link (unresolved global)', @@ -474,17 +474,6 @@ describe('SafeDsDocumentationProvider', () => { predicate: isSdsFunction, expectedDocumentation: `myFunction2`, }, - { - testName: 'link (wrong container for instance)', - code: ` - /** - * {@link myFunction1#test} - */ - fun myFunction1() - `, - predicate: isSdsFunction, - expectedDocumentation: `myFunction1#test`, - }, { testName: 'link (wrong container for static)', code: ` diff --git a/packages/safe-ds-lang/tests/resources/validation/names/duplicates/in class/main.sdstest b/packages/safe-ds-lang/tests/resources/validation/names/duplicates/in class/main.sdstest index 650707e04..2cb042882 100644 --- a/packages/safe-ds-lang/tests/resources/validation/names/duplicates/in class/main.sdstest +++ b/packages/safe-ds-lang/tests/resources/validation/names/duplicates/in class/main.sdstest @@ -9,8 +9,6 @@ class MyClass1< »UniqueTypeParameter«, // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." »TypeParameterAndParameter«, - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »TypeParameterAndMember«, >( // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." »duplicateParameter«: Int, @@ -20,222 +18,228 @@ class MyClass1< »uniqueParameter«: Int, // $TEST$ error "A type parameter or parameter with name 'TypeParameterAndParameter' exists already." »TypeParameterAndParameter«: Int, - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »parameterAndMember«: Int, ) { - // $TEST$ no error r"An instance member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." attr »duplicateInstanceAttribute«: Int - // $TEST$ error "An instance member with name 'duplicateInstanceAttribute' exists already." + // $TEST$ error "A class member with name 'duplicateInstanceAttribute' exists already." attr »duplicateInstanceAttribute«: Int - // $TEST$ no error r"An instance member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." attr »uniqueInstanceAttribute«: Int - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." static attr »duplicateStaticAttribute«: Int - // $TEST$ error "A static member with name 'duplicateStaticAttribute' exists already." + // $TEST$ error "A class member with name 'duplicateStaticAttribute' exists already." static attr »duplicateStaticAttribute«: Int - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." static attr »uniqueStaticAttribute«: Int - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." class »DuplicateClass« - // $TEST$ error "A static member with name 'DuplicateClass' exists already." + // $TEST$ error "A class member with name 'DuplicateClass' exists already." class »DuplicateClass« - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." class »UniqueClass« - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." enum »DuplicateEnum« - // $TEST$ error "A static member with name 'DuplicateEnum' exists already." + // $TEST$ error "A class member with name 'DuplicateEnum' exists already." enum »DuplicateEnum« - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." enum »UniqueEnum« - // $TEST$ no error r"An instance member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." fun »duplicateInstanceMethod«() - // $TEST$ error "An instance member with name 'duplicateInstanceMethod' exists already." + // $TEST$ error "A class member with name 'duplicateInstanceMethod' exists already." fun »duplicateInstanceMethod«() - // $TEST$ no error r"An instance member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." fun »uniqueInstanceMethod«() - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." static fun »duplicateStaticMethod«() - // $TEST$ error "A static member with name 'duplicateStaticMethod' exists already." + // $TEST$ error "A class member with name 'duplicateStaticMethod' exists already." static fun »duplicateStaticMethod«() - // $TEST$ no error r"A static member with name '\w*' exists already\." + // $TEST$ no error r"A class member with name '\w*' exists already\." static fun »uniqueStaticMethod«() - // $TEST$ no error r"An instance member with name '\w*' exists already\." - attr »duplicateInstanceMember«: Int - // $TEST$ error "An instance member with name 'duplicateInstanceMember' exists already." - fun »duplicateInstanceMember«() - - // $TEST$ no error r"A static member with name '\w*' exists already\." - static attr »duplicateStaticMember«: Int - // $TEST$ error "A static member with name 'duplicateStaticMember' exists already." - class »duplicateStaticMember« - // $TEST$ error "A static member with name 'duplicateStaticMember' exists already." - enum »duplicateStaticMember« - // $TEST$ error "A static member with name 'duplicateStaticMember' exists already." - static fun »duplicateStaticMember«() + // $TEST$ no error r"A class member with name '\w*' exists already\." + attr »duplicateMember«: Int + + // $TEST$ error "A class member with name 'duplicateMember' exists already." + attr »duplicateMember«: Int + // $TEST$ error "A class member with name 'duplicateMember' exists already." + fun »duplicateMember«() + + // $TEST$ error "A class member with name 'duplicateMember' exists already." + static attr »duplicateMember«: Int + // $TEST$ error "A class member with name 'duplicateMember' exists already." + class »duplicateMember« + // $TEST$ error "A class member with name 'duplicateMember' exists already." + enum »duplicateMember« + // $TEST$ error "A class member with name 'duplicateMember' exists already." + static fun »duplicateMember«() } class MyClass2< // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." »TypeParameterAndMember«, -> { +>( + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »parameterAndMember«: Int, +) { // $TEST$ no error r"A.*member with name '\w*' exists already\." attr »TypeParameterAndMember«: Int // $TEST$ no error r"A.*member with name '\w*' exists already\." - attr »instanceAndStaticMember«: Int - // $TEST$ no error "r"A.*member with name '\w*' exists already\." - static attr »instanceAndStaticMember«: Int + attr »parameterAndMember«: Int +} + +class MyClass4< + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »TypeParameterAndMember«, +>( + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »parameterAndMember«: Int, +) { + // $TEST$ no error r"A.*member with name '\w*' exists already\." + class »TypeParameterAndMember« - // $TEST$ no error "r"A.*member with name '\w*' exists already\." - static attr »staticAndInstanceMember«: Int // $TEST$ no error r"A.*member with name '\w*' exists already\." - attr »staticAndInstanceMember«: Int + class »parameterAndMember« } -class MyClass3< + +class MyClass5< // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." »TypeParameterAndMember«, -> { +>( + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »parameterAndMember«: Int, +) { // $TEST$ no error r"A.*member with name '\w*' exists already\." - static attr »TypeParameterAndMember«: Int + enum »TypeParameterAndMember« // $TEST$ no error r"A.*member with name '\w*' exists already\." - attr »instanceAndStaticMember«: Int - // $TEST$ no error "r"A.*member with name '\w*' exists already\." - class »instanceAndStaticMember« + enum »parameterAndMember« +} + +class MyClass6< + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »TypeParameterAndMember«, +>( + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »parameterAndMember«: Int, +) { + // $TEST$ no error r"A.*member with name '\w*' exists already\." + @Pure fun »TypeParameterAndMember«() - // $TEST$ no error "r"A.*member with name '\w*' exists already\." - class »staticAndInstanceMember« // $TEST$ no error r"A.*member with name '\w*' exists already\." - attr »staticAndInstanceMember«: Int + @Pure fun »parameterAndMember«() } -class MyClass4< +class MyClass7< // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." »TypeParameterAndMember«, -> { +>( + // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." + »parameterAndMember«: Int, +) { // $TEST$ no error r"A.*member with name '\w*' exists already\." - class »TypeParameterAndMember« + @Pure static fun »TypeParameterAndMember«() + + // $TEST$ no error r"A.*member with name '\w*' exists already\." + @Pure static fun »parameterAndMember«() +} + +class MyClass8 { + // $TEST$ no error r"A.*member with name '\w*' exists already\." + attr »instanceAndStaticMember«: Int + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." + static attr »instanceAndStaticMember«: Int + // $TEST$ no error "r"A.*member with name '\w*' exists already\." + static attr »staticAndInstanceMember«: Int + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." + attr »staticAndInstanceMember«: Int +} + +class MyClass9 { // $TEST$ no error r"A.*member with name '\w*' exists already\." attr »instanceAndStaticMember«: Int + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." + class »instanceAndStaticMember« + // $TEST$ no error "r"A.*member with name '\w*' exists already\." + class »staticAndInstanceMember« + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." + attr »staticAndInstanceMember«: Int +} +class MyClass10 { + // $TEST$ no error r"A.*member with name '\w*' exists already\." + attr »instanceAndStaticMember«: Int + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." enum »instanceAndStaticMember« // $TEST$ no error "r"A.*member with name '\w*' exists already\." enum »staticAndInstanceMember« - // $TEST$ no error r"A.*member with name '\w*' exists already\." + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." attr »staticAndInstanceMember«: Int } -class MyClass5< - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »TypeParameterAndMember«, -> { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - enum »TypeParameterAndMember« - +class MyClass11 { // $TEST$ no error r"A.*member with name '\w*' exists already\." attr »instanceAndStaticMember«: Int - // $TEST$ no error "r"A.*member with name '\w*' exists already\." - static fun »instanceAndStaticMember«() + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." + @Pure static fun »instanceAndStaticMember«() // $TEST$ no error "r"A.*member with name '\w*' exists already\." - static fun »staticAndInstanceMember«() - // $TEST$ no error r"A.*member with name '\w*' exists already\." + @Pure static fun »staticAndInstanceMember«() + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." attr »staticAndInstanceMember«: Int } -class MyClass6< - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »TypeParameterAndMember«, -> { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »TypeParameterAndMember«() - +class MyClass12 { // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »instanceAndStaticMember«() - // $TEST$ no error "r"A.*member with name '\w*' exists already\." + @Pure fun»instanceAndStaticMember«() + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." static attr »instanceAndStaticMember«: Int // $TEST$ no error "r"A.*member with name '\w*' exists already\." static attr »staticAndInstanceMember«: Int - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »staticAndInstanceMember«() + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." + @Pure fun»staticAndInstanceMember«() } -class MyClass7< - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »TypeParameterAndMember«, -> { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »TypeParameterAndMember«() - +class MyClass13 { // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »instanceAndStaticMember«() - // $TEST$ no error "r"A.*member with name '\w*' exists already\." + @Pure fun»instanceAndStaticMember«() + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." class »instanceAndStaticMember« // $TEST$ no error "r"A.*member with name '\w*' exists already\." class »staticAndInstanceMember« - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »staticAndInstanceMember«() + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." + @Pure fun»staticAndInstanceMember«() } - -class MyClass8( - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »parameterAndMember«: Int, -) { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - attr »parameterAndMember«: Int - +class MyClass14 { // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »instanceAndStaticMember«() - // $TEST$ no error "r"A.*member with name '\w*' exists already\." + @Pure fun»instanceAndStaticMember«() + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." enum »instanceAndStaticMember« // $TEST$ no error "r"A.*member with name '\w*' exists already\." enum »staticAndInstanceMember« - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »staticAndInstanceMember«() + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." + @Pure fun»staticAndInstanceMember«() } -class MyClass9( - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »parameterAndMember«: Int, -) { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - class »parameterAndMember« - +class MyClass15 { // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »instanceAndStaticMember«() - // $TEST$ no error "r"A.*member with name '\w*' exists already\." - static fun »instanceAndStaticMember«() + @Pure fun»instanceAndStaticMember«() + // $TEST$ error "A class member with name 'instanceAndStaticMember' exists already." + @Pure static fun »instanceAndStaticMember«() // $TEST$ no error "r"A.*member with name '\w*' exists already\." - static fun »staticAndInstanceMember«() - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »staticAndInstanceMember«() -} - -class MyClass10( - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »parameterAndMember«: Int, -) { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - enum »parameterAndMember« -} - -class MyClass11( - // $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\." - »parameterAndMember«: Int, -) { - // $TEST$ no error r"A.*member with name '\w*' exists already\." - fun »parameterAndMember«() + @Pure static fun »staticAndInstanceMember«() + // $TEST$ error "A class member with name 'staticAndInstanceMember' exists already." + @Pure fun»staticAndInstanceMember«() }