@goast/kotlin 0.4.18-springwebclient1 → 0.4.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +45 -45
  3. package/assets/client/okhttp3/ApiClient.kt +252 -252
  4. package/assets/client/spring-reactive-web-clients/ApiRequestFile.kt +33 -33
  5. package/esm/src/generators/models/model-generator.js +2 -2
  6. package/esm/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
  7. package/esm/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
  8. package/esm/src/generators/services/spring-reactive-web-clients/models.d.ts +1 -1
  9. package/esm/src/generators/services/spring-reactive-web-clients/models.d.ts.map +1 -1
  10. package/esm/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts.map +1 -1
  11. package/package.json +2 -2
  12. package/script/src/generators/models/model-generator.js +2 -2
  13. package/script/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
  14. package/script/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
  15. package/script/src/generators/services/spring-reactive-web-clients/models.d.ts +1 -1
  16. package/script/src/generators/services/spring-reactive-web-clients/models.d.ts.map +1 -1
  17. package/script/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts.map +1 -1
  18. package/src/mod.ts +8 -0
  19. package/src/src/assets.ts +9 -0
  20. package/src/src/ast/_index.ts +66 -0
  21. package/src/src/ast/common.ts +1 -0
  22. package/src/src/ast/index.ts +1 -0
  23. package/src/src/ast/node.ts +10 -0
  24. package/src/src/ast/nodes/annotation.ts +79 -0
  25. package/src/src/ast/nodes/argument.ts +62 -0
  26. package/src/src/ast/nodes/call.ts +75 -0
  27. package/src/src/ast/nodes/class.ts +178 -0
  28. package/src/src/ast/nodes/collection-literal.ts +49 -0
  29. package/src/src/ast/nodes/constructor.ts +126 -0
  30. package/src/src/ast/nodes/doc-tag.ts +138 -0
  31. package/src/src/ast/nodes/doc.ts +111 -0
  32. package/src/src/ast/nodes/enum-value.ts +100 -0
  33. package/src/src/ast/nodes/enum.ts +163 -0
  34. package/src/src/ast/nodes/function.ts +178 -0
  35. package/src/src/ast/nodes/generic-parameter.ts +54 -0
  36. package/src/src/ast/nodes/init-block.ts +38 -0
  37. package/src/src/ast/nodes/interface.ts +133 -0
  38. package/src/src/ast/nodes/lambda-type.ts +73 -0
  39. package/src/src/ast/nodes/lambda.ts +74 -0
  40. package/src/src/ast/nodes/object.ts +102 -0
  41. package/src/src/ast/nodes/parameter.ts +118 -0
  42. package/src/src/ast/nodes/property.ts +225 -0
  43. package/src/src/ast/nodes/reference.ts +178 -0
  44. package/src/src/ast/nodes/string.ts +114 -0
  45. package/src/src/ast/nodes/types.ts +23 -0
  46. package/src/src/ast/references/index.ts +10 -0
  47. package/src/src/ast/references/jackson.ts +24 -0
  48. package/src/src/ast/references/jakarta.ts +14 -0
  49. package/src/src/ast/references/java.ts +20 -0
  50. package/src/src/ast/references/kotlin.ts +41 -0
  51. package/src/src/ast/references/kotlinx.ts +14 -0
  52. package/src/src/ast/references/okhttp3.ts +5 -0
  53. package/src/src/ast/references/reactor.ts +5 -0
  54. package/src/src/ast/references/spring-reactive.ts +33 -0
  55. package/src/src/ast/references/spring.ts +86 -0
  56. package/src/src/ast/references/swagger.ts +23 -0
  57. package/src/src/ast/utils/get-kotlin-builder-options.ts +19 -0
  58. package/src/src/ast/utils/to-kt-node.ts +31 -0
  59. package/src/src/ast/utils/write-kt-annotations.ts +15 -0
  60. package/src/src/ast/utils/write-kt-arguments.ts +45 -0
  61. package/src/src/ast/utils/write-kt-enum-values.ts +27 -0
  62. package/src/src/ast/utils/write-kt-generic-parameters.ts +12 -0
  63. package/src/src/ast/utils/write-kt-members.ts +25 -0
  64. package/src/src/ast/utils/write-kt-node.ts +37 -0
  65. package/src/src/ast/utils/write-kt-parameters.ts +25 -0
  66. package/src/src/common-results.ts +4 -0
  67. package/src/src/config.ts +41 -0
  68. package/src/src/file-builder.ts +108 -0
  69. package/src/src/generators/file-generator.ts +29 -0
  70. package/src/src/generators/index.ts +5 -0
  71. package/src/src/generators/models/args.ts +132 -0
  72. package/src/src/generators/models/index.ts +4 -0
  73. package/src/src/generators/models/model-generator.ts +691 -0
  74. package/src/src/generators/models/models-generator.ts +65 -0
  75. package/src/src/generators/models/models.ts +95 -0
  76. package/src/src/generators/services/okhttp3-clients/args.ts +88 -0
  77. package/src/src/generators/services/okhttp3-clients/index.ts +4 -0
  78. package/src/src/generators/services/okhttp3-clients/models.ts +62 -0
  79. package/src/src/generators/services/okhttp3-clients/okhttp3-client-generator.ts +594 -0
  80. package/src/src/generators/services/okhttp3-clients/okhttp3-clients-generator.ts +130 -0
  81. package/src/src/generators/services/okhttp3-clients/refs.ts +55 -0
  82. package/src/src/generators/services/spring-controllers/args.ts +93 -0
  83. package/src/src/generators/services/spring-controllers/index.ts +4 -0
  84. package/src/src/generators/services/spring-controllers/models.ts +71 -0
  85. package/src/src/generators/services/spring-controllers/refs.ts +17 -0
  86. package/src/src/generators/services/spring-controllers/spring-controller-generator.ts +814 -0
  87. package/src/src/generators/services/spring-controllers/spring-controllers-generator.ts +118 -0
  88. package/src/src/generators/services/spring-reactive-web-clients/args.ts +101 -0
  89. package/src/src/generators/services/spring-reactive-web-clients/index.ts +4 -0
  90. package/src/src/generators/services/spring-reactive-web-clients/models.ts +62 -0
  91. package/src/src/generators/services/spring-reactive-web-clients/refs.ts +11 -0
  92. package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.ts +572 -0
  93. package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-clients-generator.ts +128 -0
  94. package/src/src/import-collection.ts +98 -0
  95. package/src/src/types.ts +3 -0
  96. package/src/src/utils.ts +39 -0
@@ -0,0 +1,133 @@
1
+ import {
2
+ type AppendValue,
3
+ type AstNodeOptions,
4
+ type BasicAppendValue,
5
+ createOverwriteProxy,
6
+ notNullish,
7
+ type Nullable,
8
+ type Prettify,
9
+ type SourceBuilder,
10
+ } from '@goast/core';
11
+
12
+ import type { KtAccessModifier } from '../common.js';
13
+ import { KtNode } from '../node.js';
14
+ import { writeKtMembers } from '../utils/write-kt-members.js';
15
+ import { writeKtNodes } from '../utils/write-kt-node.js';
16
+ import { type KtAnnotation, ktAnnotation } from './annotation.js';
17
+ import type { KtClass } from './class.js';
18
+ import { type KtDoc, ktDoc } from './doc.js';
19
+ import type { KtEnum } from './enum.js';
20
+ import type { KtFunction } from './function.js';
21
+ import { type KtGenericParameter, ktGenericParameter } from './generic-parameter.js';
22
+ import type { KtObject } from './object.js';
23
+ import type { KtProperty } from './property.js';
24
+ import type { KtType } from './types.js';
25
+
26
+ type Injects = 'doc' | 'annotations' | 'modifiers' | 'name' | 'generics' | 'extends' | 'body' | 'members';
27
+
28
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
29
+ typeof KtNode<TBuilder, TInjects | Injects>,
30
+ {
31
+ doc?: Nullable<KtDoc<TBuilder>>;
32
+ annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
33
+ accessModifier?: Nullable<KtAccessModifier>;
34
+ name: string;
35
+ generics?: Nullable<Nullable<KtGenericParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
36
+ extends?: Nullable<Nullable<KtType<TBuilder>>[]>;
37
+ members?: Nullable<Nullable<KtInterfaceMember<TBuilder>>[]>;
38
+ companionObject?: Nullable<KtObject<TBuilder>>;
39
+ }
40
+ >;
41
+
42
+ export type KtInterfaceMember<TBuilder extends SourceBuilder> =
43
+ | KtEnum<TBuilder>
44
+ | KtInterface<TBuilder>
45
+ | KtProperty<TBuilder>
46
+ | KtFunction<TBuilder>
47
+ | KtClass<TBuilder>
48
+ | AppendValue<TBuilder>;
49
+
50
+ export class KtInterface<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
51
+ TBuilder,
52
+ TInjects | Injects
53
+ > {
54
+ public doc: KtDoc<TBuilder> | null;
55
+ public annotations: KtAnnotation<TBuilder>[];
56
+ public accessModifier: KtAccessModifier | null;
57
+ public name: string;
58
+ public generics: (KtGenericParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
59
+ public extends: KtType<TBuilder>[];
60
+ public members: KtInterfaceMember<TBuilder>[];
61
+ public companionObject: KtObject<TBuilder> | null;
62
+
63
+ constructor(options: Options<TBuilder, TInjects>) {
64
+ super(options);
65
+ this.doc = options.doc ?? null;
66
+ this.annotations = options.annotations?.filter(notNullish) ?? [];
67
+ this.accessModifier = options.accessModifier ?? null;
68
+ this.name = options.name;
69
+ this.generics = options.generics?.filter(notNullish) ?? [];
70
+ this.extends = options.extends?.filter(notNullish) ?? [];
71
+ this.members = options.members?.filter(notNullish) ?? [];
72
+ this.companionObject = options.companionObject ?? null;
73
+ }
74
+
75
+ protected override onWrite(builder: TBuilder): void {
76
+ builder.append(this.inject.beforeDoc);
77
+ ktDoc.get(this.doc, { generics: this.generics })?.write(builder);
78
+ builder.append(this.inject.afterDoc);
79
+
80
+ builder.append(this.inject.beforeAnnotations);
81
+ ktAnnotation.write(builder, this.annotations, { multiline: true });
82
+ builder.append(this.inject.afterAnnotations);
83
+
84
+ builder.append(this.inject.beforeModifiers);
85
+ if (this.accessModifier) builder.append(this.accessModifier, ' ');
86
+ builder.append(this.inject.afterModifiers);
87
+
88
+ builder.append('interface ');
89
+ builder.append(this.inject.beforeName, this.name, this.inject.afterName);
90
+
91
+ builder.append(this.inject.beforeGenerics);
92
+ ktGenericParameter.write(builder, this.generics);
93
+ builder.append(this.inject.afterGenerics);
94
+
95
+ if (this.extends.length > 0) {
96
+ builder.append(' : ');
97
+ builder.append(this.inject.beforeExtends);
98
+ writeKtNodes(builder, this.extends, { separator: ', ' });
99
+ builder.append(this.inject.afterExtends);
100
+ }
101
+
102
+ const allMembers = [
103
+ this.companionObject ? createOverwriteProxy(this.companionObject, { companion: true }) : null,
104
+ ...this.members,
105
+ ].filter(notNullish);
106
+
107
+ if (allMembers.length > 0) {
108
+ builder.append(' ');
109
+ builder.append(this.inject.beforeBody);
110
+ builder.parenthesize(
111
+ '{}',
112
+ (b) => {
113
+ b.append(this.inject.beforeMembers);
114
+ writeKtMembers(b, allMembers);
115
+ b.append(this.inject.afterMembers);
116
+ },
117
+ { multiline: true },
118
+ );
119
+ builder.append(this.inject.afterBody);
120
+ }
121
+
122
+ builder.appendLine();
123
+ }
124
+ }
125
+
126
+ const createInterface = <TBuilder extends SourceBuilder>(
127
+ name: KtInterface<TBuilder>['name'],
128
+ options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
129
+ ): KtInterface<TBuilder> => new KtInterface<TBuilder>({ ...options, name });
130
+
131
+ export const ktInterface: typeof createInterface & { write: typeof writeKtNodes } = Object.assign(createInterface, {
132
+ write: writeKtNodes,
133
+ });
@@ -0,0 +1,73 @@
1
+ import { type AstNodeOptions, notNullish, type Nullable, type SourceBuilder } from '@goast/core';
2
+
3
+ import { KtNode } from '../node.js';
4
+ import { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
5
+ import { ktParameter } from './parameter.js';
6
+ import type { KtType } from './types.js';
7
+
8
+ type Injects = 'extensionFor' | 'params' | 'returnType';
9
+
10
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
11
+ typeof KtNode<TBuilder, TInjects | Injects>,
12
+ {
13
+ extensionFor?: Nullable<KtType<TBuilder>>;
14
+ parameters?: Nullable<Nullable<KtType<TBuilder>>[]>;
15
+ returnType: KtType<TBuilder>;
16
+ suspend?: boolean;
17
+ }
18
+ >;
19
+
20
+ export class KtLambdaType<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
21
+ TBuilder,
22
+ TInjects | Injects
23
+ > {
24
+ public extensionFor: KtType<TBuilder> | null;
25
+ public parameters: KtType<TBuilder>[];
26
+ public returnType: KtType<TBuilder>;
27
+ public suspend: boolean;
28
+
29
+ constructor(options: Options<TBuilder, TInjects>) {
30
+ super(options);
31
+ this.extensionFor = options.extensionFor ?? null;
32
+ this.parameters = options.parameters?.filter(notNullish) ?? [];
33
+ this.returnType = options.returnType;
34
+ this.suspend = options.suspend ?? false;
35
+ }
36
+
37
+ protected override onWrite(builder: TBuilder): void {
38
+ if (this.suspend) {
39
+ builder.append('suspend ');
40
+ }
41
+
42
+ if (this.extensionFor) {
43
+ builder.append(this.inject.beforeExtensionFor);
44
+ writeKtNode(builder, this.extensionFor);
45
+ builder.append(this.inject.afterExtensionFor);
46
+ builder.append('.');
47
+ }
48
+
49
+ builder.append(this.inject.beforeParams);
50
+ if (this.parameters.length === 0) {
51
+ builder.append('()');
52
+ } else {
53
+ ktParameter.write(builder, this.parameters);
54
+ }
55
+ builder.append(this.inject.afterParams);
56
+
57
+ builder.append(' -> ');
58
+
59
+ builder.append(this.inject.beforeReturnType);
60
+ writeKtNode(builder, this.returnType);
61
+ builder.append(this.inject.afterReturnType);
62
+ }
63
+ }
64
+
65
+ const createLambdaType = <TBuilder extends SourceBuilder>(
66
+ parameters: Options<TBuilder>['parameters'],
67
+ returnType: Options<TBuilder>['returnType'],
68
+ options?: Omit<Options<TBuilder>, 'parameters' | 'returnType'>,
69
+ ): KtLambdaType<TBuilder> => new KtLambdaType<TBuilder>({ ...options, parameters, returnType });
70
+
71
+ export const ktLambdaType: typeof createLambdaType & { write: typeof writeKtNodes } = Object.assign(createLambdaType, {
72
+ write: writeKtNodes,
73
+ });
@@ -0,0 +1,74 @@
1
+ import {
2
+ type AppendValue,
3
+ type AstNodeOptions,
4
+ type BasicAppendValue,
5
+ notNullish,
6
+ type Nullable,
7
+ type SourceBuilder,
8
+ } from '@goast/core';
9
+
10
+ import { KtNode } from '../node.js';
11
+ import { writeKtNodes } from '../utils/write-kt-node.js';
12
+
13
+ type Injects = 'arguments' | 'body';
14
+
15
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
16
+ typeof KtNode<TBuilder, TInjects | Injects>,
17
+ {
18
+ arguments?: Nullable<Nullable<BasicAppendValue<TBuilder>>[]>;
19
+ body?: Nullable<AppendValue<TBuilder>>;
20
+ singleline?: boolean;
21
+ }
22
+ >;
23
+
24
+ export class KtLambda<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
25
+ TBuilder,
26
+ TInjects | Injects
27
+ > {
28
+ public arguments: BasicAppendValue<TBuilder>[];
29
+ public body: AppendValue<TBuilder> | null;
30
+ public singleline: boolean;
31
+
32
+ constructor(options: Options<TBuilder, TInjects>) {
33
+ super(options);
34
+ this.arguments = options.arguments?.filter(notNullish) ?? [];
35
+ this.body = options.body ?? null;
36
+ this.singleline = options.singleline ?? false;
37
+ }
38
+
39
+ protected override onWrite(builder: TBuilder): void {
40
+ const singleline = this.singleline || !this.body;
41
+
42
+ builder.parenthesize('{}', (b) => {
43
+ if (this.arguments.length > 0) {
44
+ b.append(' ', this.inject.beforeArguments);
45
+ writeKtNodes(b, this.arguments, { separator: ', ' });
46
+ b.append(this.inject.afterArguments);
47
+
48
+ b.append(' ->');
49
+ }
50
+
51
+ b.append(singleline ? ' ' : '\n');
52
+
53
+ b.append(this.inject.beforeBody, this.body, this.inject.afterBody);
54
+
55
+ if (singleline) {
56
+ if (!b.isCurrentLineEmpty) {
57
+ b.append(' ');
58
+ }
59
+ } else {
60
+ b.ensureCurrentLineEmpty();
61
+ }
62
+ });
63
+ }
64
+ }
65
+
66
+ const createLambda = <TBuilder extends SourceBuilder>(
67
+ args: Options<TBuilder>['arguments'],
68
+ body: Options<TBuilder>['body'],
69
+ options?: Omit<Options<TBuilder>, 'arguments' | 'body'>,
70
+ ): KtLambda<TBuilder> => new KtLambda<TBuilder>({ ...options, arguments: args, body });
71
+
72
+ export const ktLambda: typeof createLambda & { write: typeof writeKtNodes } = Object.assign(createLambda, {
73
+ write: writeKtNodes,
74
+ });
@@ -0,0 +1,102 @@
1
+ import { type AstNodeOptions, type BasicAppendValue, notNullish, type Nullable, type SourceBuilder } from '@goast/core';
2
+
3
+ import { KtNode } from '../node.js';
4
+ import { writeKtMembers } from '../utils/write-kt-members.js';
5
+ import { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
6
+ import { type KtArgument, ktArgument } from './argument.js';
7
+ import type { KtFunction } from './function.js';
8
+ import type { KtInitBlock } from './init-block.js';
9
+ import type { KtProperty } from './property.js';
10
+ import type { KtType, KtValue } from './types.js';
11
+
12
+ type Injects = 'modifiers' | 'name' | 'inheritList' | 'body' | 'members';
13
+
14
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
15
+ typeof KtNode<TBuilder, TInjects | Injects>,
16
+ {
17
+ data?: boolean;
18
+ name?: Nullable<string>;
19
+ class?: KtType<TBuilder>;
20
+ classArguments?: Nullable<Nullable<KtArgument<TBuilder> | KtValue<TBuilder>>[]>;
21
+ implements?: Nullable<Nullable<KtType<TBuilder>>[]>;
22
+ members?: Nullable<Nullable<KtObjectMember<TBuilder>>[]>;
23
+ companion?: Nullable<boolean>;
24
+ }
25
+ >;
26
+
27
+ export type KtObjectMember<TBuilder extends SourceBuilder> =
28
+ | KtInitBlock<TBuilder>
29
+ | KtProperty<TBuilder>
30
+ | KtFunction<TBuilder>
31
+ | BasicAppendValue<TBuilder>;
32
+
33
+ export class KtObject<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
34
+ TBuilder,
35
+ TInjects | Injects
36
+ > {
37
+ public data: boolean;
38
+ public name: string | null;
39
+ public class: KtType<TBuilder> | null;
40
+ public classArguments: (KtArgument<TBuilder> | KtValue<TBuilder>)[];
41
+ public implements: KtType<TBuilder>[];
42
+ public members: KtObjectMember<TBuilder>[];
43
+ public companion: boolean;
44
+
45
+ constructor(options: Options<TBuilder, TInjects>) {
46
+ super(options);
47
+ this.data = options.data ?? false;
48
+ this.name = options.name ?? null;
49
+ this.class = options.class ?? null;
50
+ this.classArguments = options.classArguments?.filter(notNullish) ?? [];
51
+ this.implements = options.implements?.filter(notNullish) ?? [];
52
+ this.members = options.members?.filter(notNullish) ?? [];
53
+ this.companion = options.companion ?? false;
54
+ }
55
+
56
+ protected override onWrite(builder: TBuilder): void {
57
+ builder.append(this.inject.beforeModifiers);
58
+ if (this.data) builder.append('data ');
59
+ if (this.companion) builder.append('companion ');
60
+ builder.append(this.inject.afterModifiers);
61
+
62
+ builder.append('object');
63
+
64
+ if (this.name) {
65
+ builder.append(' ', this.inject.beforeName, this.name, this.inject.afterName);
66
+ }
67
+
68
+ if (this.class || this.implements.length > 0) {
69
+ builder.append(' : ', this.inject.beforeInheritList);
70
+
71
+ if (this.class) {
72
+ writeKtNode(builder, this.class);
73
+ ktArgument.write(builder, this.classArguments);
74
+ if (this.implements.length > 0) builder.append(', ');
75
+ }
76
+
77
+ writeKtNodes(builder, this.implements, { separator: ', ' });
78
+ builder.append(this.inject.afterInheritList);
79
+ }
80
+
81
+ builder.append(' ', this.inject.beforeBody);
82
+ builder.parenthesize(
83
+ '{}',
84
+ (b) => {
85
+ builder.append(this.inject.beforeMembers);
86
+ writeKtMembers(b, this.members);
87
+ builder.append(this.inject.afterMembers);
88
+ },
89
+ { multiline: this.members.length > 0 },
90
+ );
91
+ builder.append(this.inject.afterBody);
92
+
93
+ if (this.name) builder.appendLine();
94
+ }
95
+ }
96
+
97
+ const createObject = <TBuilder extends SourceBuilder>(options?: Options<TBuilder>): KtObject<TBuilder> =>
98
+ new KtObject<TBuilder>(options ?? {});
99
+
100
+ export const ktObject: typeof createObject & { write: typeof writeKtNodes } = Object.assign(createObject, {
101
+ write: writeKtNodes,
102
+ });
@@ -0,0 +1,118 @@
1
+ import {
2
+ type AstNodeOptions,
3
+ type BasicAppendValue,
4
+ notNullish,
5
+ type Nullable,
6
+ type Prettify,
7
+ type SourceBuilder,
8
+ } from '@goast/core';
9
+
10
+ import type { KtAccessModifier } from '../common.js';
11
+ import { KtNode } from '../node.js';
12
+ import { writeKtNode } from '../utils/write-kt-node.js';
13
+ import { writeKtParameters } from '../utils/write-kt-parameters.js';
14
+ import { type KtAnnotation, ktAnnotation } from './annotation.js';
15
+ import type { KtType, KtValue } from './types.js';
16
+
17
+ type Injects = 'modifiers' | 'annotations' | 'name' | 'type' | 'default';
18
+
19
+ type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
20
+ typeof KtNode<TBuilder, TInjects | Injects>,
21
+ {
22
+ name: string;
23
+ type: KtType<TBuilder>;
24
+ annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
25
+ default?: Nullable<KtValue<TBuilder>>;
26
+ vararg?: Nullable<boolean>;
27
+ description?: Nullable<BasicAppendValue<TBuilder>>;
28
+
29
+ // class parameter options
30
+ accessModifier?: Nullable<KtAccessModifier>;
31
+ property?: Nullable<'readonly' | 'mutable'>;
32
+ propertyDescription?: Nullable<BasicAppendValue<TBuilder>>;
33
+ override?: Nullable<boolean>;
34
+ }
35
+ >;
36
+
37
+ export class KtParameter<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
38
+ TBuilder,
39
+ TInjects | Injects
40
+ > {
41
+ public name: string;
42
+ public type: KtType<TBuilder>;
43
+ public annotations: KtAnnotation<TBuilder>[];
44
+ public default: KtValue<TBuilder> | null;
45
+ public vararg: boolean;
46
+ public description: BasicAppendValue<TBuilder> | null;
47
+
48
+ // class parameter options
49
+ public accessModifier: KtAccessModifier | null;
50
+ public property: 'readonly' | 'mutable' | null;
51
+ public propertyDescription: BasicAppendValue<TBuilder> | null;
52
+ public override: boolean;
53
+
54
+ constructor(options: Options<TBuilder, TInjects>) {
55
+ super(options);
56
+ this.name = options.name;
57
+ this.type = options.type;
58
+ this.annotations = options.annotations?.filter(notNullish) ?? [];
59
+ this.default = options.default ?? null;
60
+ this.vararg = options.vararg ?? false;
61
+ this.description = options.description ?? null;
62
+
63
+ this.accessModifier = options.accessModifier ?? null;
64
+ this.property = options.property ?? null;
65
+ this.propertyDescription = options.propertyDescription ?? null;
66
+ this.override = options.override ?? false;
67
+ }
68
+
69
+ protected override onWrite(builder: TBuilder): void {
70
+ builder.append(this.inject.beforeAnnotations);
71
+ ktAnnotation.write(builder, this.annotations, { multiline: true });
72
+ builder.append(this.inject.afterAnnotations);
73
+
74
+ builder.append(this.inject.beforeModifiers);
75
+ if (this.accessModifier && this.property) builder.append(this.accessModifier, ' ');
76
+ if (this.override && this.property) builder.append('override ');
77
+ if (this.vararg) builder.append('vararg ');
78
+ builder.append(this.inject.afterModifiers);
79
+
80
+ if (this.property) builder.append(this.property === 'mutable' ? 'var' : 'val', ' ');
81
+ builder.append(this.inject.beforeName, this.name, this.inject.afterName);
82
+
83
+ builder.append(': ');
84
+
85
+ builder.append(this.inject.beforeType);
86
+ writeKtNode(builder, this.type);
87
+ builder.append(this.inject.afterType);
88
+
89
+ if (this.default) {
90
+ builder.append(' = ');
91
+ builder.append(this.inject.beforeDefault);
92
+ writeKtNode(builder, this.default);
93
+ builder.append(this.inject.afterDefault);
94
+ }
95
+ }
96
+ }
97
+
98
+ const createParameter = <TBuilder extends SourceBuilder>(
99
+ name: KtParameter<TBuilder>['name'],
100
+ type: KtParameter<TBuilder>['type'],
101
+ options?: Prettify<
102
+ Omit<Options<TBuilder>, 'name' | 'type' | 'accessModifier' | 'property' | 'propertyDescription' | 'override'>
103
+ >,
104
+ ): KtParameter<TBuilder> => new KtParameter<TBuilder>({ ...options, name, type });
105
+
106
+ const createClassParameter = <TBuilder extends SourceBuilder>(
107
+ name: KtParameter<TBuilder>['name'],
108
+ type: KtParameter<TBuilder>['type'],
109
+ options?: Prettify<Omit<Options<TBuilder>, 'name' | 'type'>>,
110
+ ): KtParameter<TBuilder> => new KtParameter<TBuilder>({ ...options, name, type });
111
+
112
+ export const ktParameter: typeof createParameter & {
113
+ class: typeof createClassParameter;
114
+ write: typeof writeKtParameters;
115
+ } = Object.assign(createParameter, {
116
+ class: createClassParameter,
117
+ write: writeKtParameters,
118
+ });