@goast/kotlin 0.5.1-beta.1 → 0.5.2
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.
- package/LICENSE +21 -21
- package/assets/client/okhttp3/ApiAbstractions.kt +30 -30
- package/assets/client/okhttp3/ApiClient.kt +253 -253
- package/assets/client/okhttp3/ApiResponse.kt +43 -43
- package/assets/client/okhttp3/Errors.kt +21 -21
- package/assets/client/okhttp3/PartConfig.kt +11 -11
- package/assets/client/okhttp3/RequestConfig.kt +18 -18
- package/assets/client/okhttp3/RequestMethod.kt +8 -8
- package/assets/client/okhttp3/ResponseExtensions.kt +24 -24
- package/assets/client/spring-reactive-web-clients/ApiRequestFile.kt +33 -33
- package/esm/src/generators/models/model-generator.d.ts.map +1 -1
- package/esm/src/generators/models/model-generator.js +1 -0
- package/package.json +2 -2
- package/script/src/generators/models/model-generator.d.ts.map +1 -1
- package/script/src/generators/models/model-generator.js +1 -0
- package/src/mod.ts +8 -0
- package/src/src/assets.ts +9 -0
- package/src/src/ast/_index.ts +66 -0
- package/src/src/ast/common.ts +1 -0
- package/src/src/ast/index.ts +1 -0
- package/src/src/ast/node.ts +10 -0
- package/src/src/ast/nodes/annotation.ts +79 -0
- package/src/src/ast/nodes/argument.ts +62 -0
- package/src/src/ast/nodes/call.ts +75 -0
- package/src/src/ast/nodes/class.ts +178 -0
- package/src/src/ast/nodes/collection-literal.ts +49 -0
- package/src/src/ast/nodes/constructor.ts +126 -0
- package/src/src/ast/nodes/doc-tag.ts +138 -0
- package/src/src/ast/nodes/doc.ts +111 -0
- package/src/src/ast/nodes/enum-value.ts +100 -0
- package/src/src/ast/nodes/enum.ts +163 -0
- package/src/src/ast/nodes/function.ts +178 -0
- package/src/src/ast/nodes/generic-parameter.ts +54 -0
- package/src/src/ast/nodes/init-block.ts +38 -0
- package/src/src/ast/nodes/interface.ts +133 -0
- package/src/src/ast/nodes/lambda-type.ts +73 -0
- package/src/src/ast/nodes/lambda.ts +74 -0
- package/src/src/ast/nodes/object.ts +102 -0
- package/src/src/ast/nodes/parameter.ts +118 -0
- package/src/src/ast/nodes/property.ts +225 -0
- package/src/src/ast/nodes/reference.ts +178 -0
- package/src/src/ast/nodes/string.ts +114 -0
- package/src/src/ast/nodes/types.ts +23 -0
- package/src/src/ast/references/index.ts +10 -0
- package/src/src/ast/references/jackson.ts +44 -0
- package/src/src/ast/references/jakarta.ts +14 -0
- package/src/src/ast/references/java.ts +20 -0
- package/src/src/ast/references/kotlin.ts +41 -0
- package/src/src/ast/references/kotlinx.ts +14 -0
- package/src/src/ast/references/okhttp3.ts +5 -0
- package/src/src/ast/references/reactor.ts +5 -0
- package/src/src/ast/references/spring-reactive.ts +33 -0
- package/src/src/ast/references/spring.ts +86 -0
- package/src/src/ast/references/swagger.ts +23 -0
- package/src/src/ast/utils/get-kotlin-builder-options.ts +19 -0
- package/src/src/ast/utils/to-kt-node.ts +31 -0
- package/src/src/ast/utils/write-kt-annotations.ts +15 -0
- package/src/src/ast/utils/write-kt-arguments.ts +45 -0
- package/src/src/ast/utils/write-kt-enum-values.ts +27 -0
- package/src/src/ast/utils/write-kt-generic-parameters.ts +12 -0
- package/src/src/ast/utils/write-kt-members.ts +25 -0
- package/src/src/ast/utils/write-kt-node.ts +37 -0
- package/src/src/ast/utils/write-kt-parameters.ts +25 -0
- package/src/src/common-results.ts +4 -0
- package/src/src/config.ts +41 -0
- package/src/src/file-builder.ts +112 -0
- package/src/src/generators/file-generator.ts +29 -0
- package/src/src/generators/index.ts +5 -0
- package/src/src/generators/models/args.ts +132 -0
- package/src/src/generators/models/index.ts +4 -0
- package/src/src/generators/models/model-generator.ts +703 -0
- package/src/src/generators/models/models-generator.ts +65 -0
- package/src/src/generators/models/models.ts +95 -0
- package/src/src/generators/services/okhttp3-clients/args.ts +88 -0
- package/src/src/generators/services/okhttp3-clients/index.ts +4 -0
- package/src/src/generators/services/okhttp3-clients/models.ts +73 -0
- package/src/src/generators/services/okhttp3-clients/okhttp3-client-generator.ts +597 -0
- package/src/src/generators/services/okhttp3-clients/okhttp3-clients-generator.ts +169 -0
- package/src/src/generators/services/okhttp3-clients/refs.ts +59 -0
- package/src/src/generators/services/spring-controllers/args.ts +93 -0
- package/src/src/generators/services/spring-controllers/index.ts +4 -0
- package/src/src/generators/services/spring-controllers/models.ts +76 -0
- package/src/src/generators/services/spring-controllers/refs.ts +17 -0
- package/src/src/generators/services/spring-controllers/spring-controller-generator.ts +1084 -0
- package/src/src/generators/services/spring-controllers/spring-controllers-generator.ts +140 -0
- package/src/src/generators/services/spring-reactive-web-clients/args.ts +101 -0
- package/src/src/generators/services/spring-reactive-web-clients/index.ts +4 -0
- package/src/src/generators/services/spring-reactive-web-clients/models.ts +62 -0
- package/src/src/generators/services/spring-reactive-web-clients/refs.ts +11 -0
- package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.ts +571 -0
- package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-clients-generator.ts +125 -0
- package/src/src/import-collection.ts +98 -0
- package/src/src/types.ts +3 -0
- package/src/src/utils.ts +39 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
type AstNodeOptions,
|
|
4
|
+
notNullish,
|
|
5
|
+
type Nullable,
|
|
6
|
+
type Prettify,
|
|
7
|
+
type SourceBuilder,
|
|
8
|
+
} from '@goast/core';
|
|
9
|
+
|
|
10
|
+
import { KtNode } from '../node.js';
|
|
11
|
+
import { writeKtEnumValues } from '../utils/write-kt-enum-values.js';
|
|
12
|
+
import { writeKtMembers } from '../utils/write-kt-members.js';
|
|
13
|
+
import { type KtAnnotation, ktAnnotation } from './annotation.js';
|
|
14
|
+
import { type KtArgument, ktArgument } from './argument.js';
|
|
15
|
+
import type { KtDoc } from './doc.js';
|
|
16
|
+
import type { KtFunction } from './function.js';
|
|
17
|
+
import type { KtParameter } from './parameter.js';
|
|
18
|
+
|
|
19
|
+
type Injects = 'doc' | 'annotations' | 'name' | 'arguments' | 'body' | 'members';
|
|
20
|
+
|
|
21
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
22
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
23
|
+
{
|
|
24
|
+
name: string;
|
|
25
|
+
doc?: Nullable<KtDoc<TBuilder>>;
|
|
26
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
27
|
+
arguments?: Nullable<Nullable<KtArgument<TBuilder> | AppendValue<TBuilder>>[]>;
|
|
28
|
+
members?: Nullable<Nullable<KtEnumValueMember<TBuilder>>[]>;
|
|
29
|
+
}
|
|
30
|
+
>;
|
|
31
|
+
|
|
32
|
+
export type KtEnumValueMember<TBuilder extends SourceBuilder> =
|
|
33
|
+
| KtParameter<TBuilder>
|
|
34
|
+
| KtFunction<TBuilder>
|
|
35
|
+
| AppendValue<TBuilder>;
|
|
36
|
+
|
|
37
|
+
export class KtEnumValue<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
38
|
+
TBuilder,
|
|
39
|
+
TInjects | Injects
|
|
40
|
+
> {
|
|
41
|
+
public name: string;
|
|
42
|
+
public doc: KtDoc<TBuilder> | null;
|
|
43
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
44
|
+
public arguments: (KtArgument<TBuilder> | AppendValue<TBuilder>)[];
|
|
45
|
+
public members: KtEnumValueMember<TBuilder>[];
|
|
46
|
+
|
|
47
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
48
|
+
super(options);
|
|
49
|
+
this.name = options.name;
|
|
50
|
+
this.doc = options.doc ?? null;
|
|
51
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
52
|
+
this.arguments = options.arguments?.filter(notNullish) ?? [];
|
|
53
|
+
this.members = options.members?.filter(notNullish) ?? [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected override onWrite(builder: TBuilder): void {
|
|
57
|
+
builder.append(this.inject.beforeDoc);
|
|
58
|
+
this.doc?.write(builder);
|
|
59
|
+
builder.append(this.inject.afterDoc);
|
|
60
|
+
|
|
61
|
+
builder.append(this.inject.beforeAnnotations);
|
|
62
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
63
|
+
builder.append(this.inject.afterAnnotations);
|
|
64
|
+
|
|
65
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
66
|
+
|
|
67
|
+
if (this.arguments.length > 0) {
|
|
68
|
+
builder.append(this.inject.beforeArguments);
|
|
69
|
+
ktArgument.write(builder, this.arguments);
|
|
70
|
+
builder.append(this.inject.afterArguments);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (this.members.length > 0) {
|
|
74
|
+
builder.append(' ');
|
|
75
|
+
builder.append(this.inject.beforeBody);
|
|
76
|
+
builder.parenthesize(
|
|
77
|
+
'{}',
|
|
78
|
+
(b) => {
|
|
79
|
+
builder.append(this.inject.beforeMembers);
|
|
80
|
+
writeKtMembers(b, this.members);
|
|
81
|
+
builder.append(this.inject.afterMembers);
|
|
82
|
+
},
|
|
83
|
+
{ multiline: true },
|
|
84
|
+
);
|
|
85
|
+
builder.append(this.inject.afterBody);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const createEnumValue = <TBuilder extends SourceBuilder>(
|
|
91
|
+
name: Options<TBuilder>['name'],
|
|
92
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
93
|
+
): KtEnumValue<TBuilder> => new KtEnumValue<TBuilder>({ ...options, name });
|
|
94
|
+
|
|
95
|
+
export const ktEnumValue: typeof createEnumValue & { write: typeof writeKtEnumValues } = Object.assign(
|
|
96
|
+
createEnumValue,
|
|
97
|
+
{
|
|
98
|
+
write: writeKtEnumValues,
|
|
99
|
+
},
|
|
100
|
+
);
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
type AstNodeOptions,
|
|
4
|
+
createOverwriteProxy,
|
|
5
|
+
notNullish,
|
|
6
|
+
type Nullable,
|
|
7
|
+
type Prettify,
|
|
8
|
+
type SourceBuilder,
|
|
9
|
+
} from '@goast/core';
|
|
10
|
+
|
|
11
|
+
import type { KtAccessModifier } from '../common.js';
|
|
12
|
+
import { KtNode } from '../node.js';
|
|
13
|
+
import { writeKtMembers } from '../utils/write-kt-members.js';
|
|
14
|
+
import { writeKtNodes } from '../utils/write-kt-node.js';
|
|
15
|
+
import { type KtAnnotation, ktAnnotation } from './annotation.js';
|
|
16
|
+
import type { KtClass } from './class.js';
|
|
17
|
+
import type { KtConstructor } from './constructor.js';
|
|
18
|
+
import { type KtDoc, ktDoc } from './doc.js';
|
|
19
|
+
import { type KtEnumValue, ktEnumValue } from './enum-value.js';
|
|
20
|
+
import type { KtFunction } from './function.js';
|
|
21
|
+
import { type KtInitBlock, ktInitBlock } from './init-block.js';
|
|
22
|
+
import type { KtInterface } from './interface.js';
|
|
23
|
+
import type { KtObject } from './object.js';
|
|
24
|
+
import type { KtProperty } from './property.js';
|
|
25
|
+
import type { KtType } from './types.js';
|
|
26
|
+
|
|
27
|
+
type Injects =
|
|
28
|
+
| 'doc'
|
|
29
|
+
| 'annotations'
|
|
30
|
+
| 'modifiers'
|
|
31
|
+
| 'name'
|
|
32
|
+
| 'primaryConstructor'
|
|
33
|
+
| 'implements'
|
|
34
|
+
| 'body'
|
|
35
|
+
| 'values'
|
|
36
|
+
| 'members';
|
|
37
|
+
|
|
38
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
39
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
40
|
+
{
|
|
41
|
+
name: string;
|
|
42
|
+
doc?: Nullable<KtDoc<TBuilder>>;
|
|
43
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
44
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
45
|
+
primaryConstructor?: Nullable<KtConstructor<TBuilder>>;
|
|
46
|
+
implements?: Nullable<Nullable<KtType<TBuilder>>[]>;
|
|
47
|
+
values?: Nullable<KtEnumValue<TBuilder>[]>;
|
|
48
|
+
members?: Nullable<Nullable<KtEnumMember<TBuilder>>[]>;
|
|
49
|
+
companionObject?: Nullable<KtObject<TBuilder>>;
|
|
50
|
+
}
|
|
51
|
+
>;
|
|
52
|
+
|
|
53
|
+
export type KtEnumMember<TBuilder extends SourceBuilder> =
|
|
54
|
+
| KtConstructor<TBuilder>
|
|
55
|
+
| KtEnum<TBuilder>
|
|
56
|
+
| KtInitBlock<TBuilder>
|
|
57
|
+
| KtInterface<TBuilder>
|
|
58
|
+
| KtProperty<TBuilder>
|
|
59
|
+
| KtFunction<TBuilder>
|
|
60
|
+
| KtClass<TBuilder>
|
|
61
|
+
| AppendValue<TBuilder>;
|
|
62
|
+
|
|
63
|
+
export class KtEnum<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
64
|
+
TBuilder,
|
|
65
|
+
TInjects | Injects
|
|
66
|
+
> {
|
|
67
|
+
public name: string;
|
|
68
|
+
public doc: KtDoc<TBuilder> | null;
|
|
69
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
70
|
+
public accessModifier: KtAccessModifier | null;
|
|
71
|
+
public primaryConstructor: KtConstructor<TBuilder> | null;
|
|
72
|
+
public implements: KtType<TBuilder>[];
|
|
73
|
+
public values: KtEnumValue<TBuilder>[];
|
|
74
|
+
public members: KtEnumMember<TBuilder>[];
|
|
75
|
+
public companionObject: KtObject<TBuilder> | null;
|
|
76
|
+
|
|
77
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
78
|
+
super(options);
|
|
79
|
+
this.name = options.name;
|
|
80
|
+
this.doc = options.doc ?? null;
|
|
81
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
82
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
83
|
+
this.primaryConstructor = options.primaryConstructor ?? null;
|
|
84
|
+
this.implements = options.implements?.filter(notNullish) ?? [];
|
|
85
|
+
this.values = options.values ?? [];
|
|
86
|
+
this.members = options.members?.filter(notNullish) ?? [];
|
|
87
|
+
this.companionObject = options.companionObject ?? null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected override onWrite(builder: TBuilder): void {
|
|
91
|
+
builder.append(this.inject.beforeDoc);
|
|
92
|
+
ktDoc.get(this.doc, { parameters: this.primaryConstructor?.parameters })?.write(builder);
|
|
93
|
+
builder.append(this.inject.afterDoc);
|
|
94
|
+
|
|
95
|
+
builder.append(this.inject.beforeAnnotations);
|
|
96
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
97
|
+
builder.append(this.inject.afterAnnotations);
|
|
98
|
+
|
|
99
|
+
builder.append(this.inject.beforeModifiers);
|
|
100
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
101
|
+
builder.append(this.inject.afterModifiers);
|
|
102
|
+
|
|
103
|
+
builder.append('enum class ');
|
|
104
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
105
|
+
|
|
106
|
+
if (this.primaryConstructor) {
|
|
107
|
+
builder.append(this.inject.beforePrimaryConstructor);
|
|
108
|
+
this.primaryConstructor.writeAsPrimary(builder);
|
|
109
|
+
builder.append(this.inject.afterPrimaryConstructor);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (this.implements.length > 0) {
|
|
113
|
+
builder.append(' : ');
|
|
114
|
+
builder.append(this.inject.beforeImplements);
|
|
115
|
+
writeKtNodes(builder, this.implements, { separator: ', ' });
|
|
116
|
+
builder.append(this.inject.afterImplements);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const allMembers = [
|
|
120
|
+
this.companionObject ? createOverwriteProxy(this.companionObject, { companion: true }) : null,
|
|
121
|
+
this.primaryConstructor?.body ? ktInitBlock(this.primaryConstructor?.body) : null,
|
|
122
|
+
...this.members,
|
|
123
|
+
].filter(notNullish);
|
|
124
|
+
|
|
125
|
+
if (this.values.length > 0 || allMembers.length > 0) {
|
|
126
|
+
builder.append(' ');
|
|
127
|
+
builder.append(this.inject.beforeBody);
|
|
128
|
+
builder.parenthesize(
|
|
129
|
+
'{}',
|
|
130
|
+
(b) => {
|
|
131
|
+
if (this.values.length > 0) {
|
|
132
|
+
b.append(this.inject.beforeValues);
|
|
133
|
+
ktEnumValue.write(b, this.values);
|
|
134
|
+
if (allMembers.length > 0) {
|
|
135
|
+
b.append(';\n\n');
|
|
136
|
+
}
|
|
137
|
+
b.append(this.inject.afterValues);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (allMembers.length > 0) {
|
|
141
|
+
b.append(this.inject.beforeMembers);
|
|
142
|
+
writeKtMembers(b, allMembers);
|
|
143
|
+
b.append(this.inject.afterMembers);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{ multiline: true },
|
|
147
|
+
);
|
|
148
|
+
builder.append(this.inject.afterBody);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
builder.appendLine();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const createEnum = <TBuilder extends SourceBuilder>(
|
|
156
|
+
name: Options<TBuilder>['name'],
|
|
157
|
+
values?: Options<TBuilder>['values'],
|
|
158
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name' | 'values'>>,
|
|
159
|
+
): KtEnum<TBuilder> => new KtEnum<TBuilder>({ ...options, name, values: values ?? undefined });
|
|
160
|
+
|
|
161
|
+
export const ktEnum: typeof createEnum & { write: typeof writeKtNodes } = Object.assign(createEnum, {
|
|
162
|
+
write: writeKtNodes,
|
|
163
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AppendValue,
|
|
3
|
+
type AstNodeOptions,
|
|
4
|
+
type BasicAppendValue,
|
|
5
|
+
notNullish,
|
|
6
|
+
type Nullable,
|
|
7
|
+
type Prettify,
|
|
8
|
+
type SourceBuilder,
|
|
9
|
+
} from '@goast/core';
|
|
10
|
+
|
|
11
|
+
import type { KtAccessModifier } from '../common.js';
|
|
12
|
+
import { KtNode } from '../node.js';
|
|
13
|
+
import { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
|
|
14
|
+
import { type KtAnnotation, ktAnnotation } from './annotation.js';
|
|
15
|
+
import { type KtDoc, ktDoc } from './doc.js';
|
|
16
|
+
import { type KtGenericParameter, ktGenericParameter } from './generic-parameter.js';
|
|
17
|
+
import { KtInterface } from './interface.js';
|
|
18
|
+
import { type KtParameter, ktParameter } from './parameter.js';
|
|
19
|
+
import type { KtType } from './types.js';
|
|
20
|
+
|
|
21
|
+
type Injects =
|
|
22
|
+
| 'doc'
|
|
23
|
+
| 'annotations'
|
|
24
|
+
| 'modifiers'
|
|
25
|
+
| 'generics'
|
|
26
|
+
| 'receiverAnnotations'
|
|
27
|
+
| 'receiverType'
|
|
28
|
+
| 'name'
|
|
29
|
+
| 'parameters'
|
|
30
|
+
| 'returnType';
|
|
31
|
+
|
|
32
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
33
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
34
|
+
{
|
|
35
|
+
name: string;
|
|
36
|
+
generics?: Nullable<Nullable<KtGenericParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
37
|
+
parameters?: Nullable<Nullable<KtParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
38
|
+
doc?: Nullable<KtDoc<TBuilder>>;
|
|
39
|
+
returnType?: Nullable<KtType<TBuilder>>;
|
|
40
|
+
body?: Nullable<AppendValue<TBuilder>>;
|
|
41
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
42
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
43
|
+
receiverType?: Nullable<KtType<TBuilder>>;
|
|
44
|
+
receiverAnnotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
45
|
+
singleExpression?: Nullable<boolean>;
|
|
46
|
+
open?: Nullable<boolean>;
|
|
47
|
+
inline?: Nullable<boolean>;
|
|
48
|
+
infix?: Nullable<boolean>;
|
|
49
|
+
tailrec?: Nullable<boolean>;
|
|
50
|
+
suspend?: Nullable<boolean>;
|
|
51
|
+
operator?: Nullable<boolean>;
|
|
52
|
+
override?: Nullable<boolean>;
|
|
53
|
+
abstract?: Nullable<boolean>;
|
|
54
|
+
}
|
|
55
|
+
>;
|
|
56
|
+
|
|
57
|
+
export class KtFunction<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
58
|
+
TBuilder,
|
|
59
|
+
TInjects | Injects
|
|
60
|
+
> {
|
|
61
|
+
public name: string;
|
|
62
|
+
public generics: (KtGenericParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
|
|
63
|
+
public parameters: (KtParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
|
|
64
|
+
public doc: KtDoc<TBuilder> | null;
|
|
65
|
+
public returnType: KtType<TBuilder> | null;
|
|
66
|
+
public body: AppendValue<TBuilder> | null;
|
|
67
|
+
public accessModifier: KtAccessModifier | null;
|
|
68
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
69
|
+
public receiverType: KtType<TBuilder> | null;
|
|
70
|
+
public receiverAnnotations: KtAnnotation<TBuilder>[];
|
|
71
|
+
public singleExpression: boolean;
|
|
72
|
+
public open: boolean;
|
|
73
|
+
public inline: boolean;
|
|
74
|
+
public infix: boolean;
|
|
75
|
+
public tailrec: boolean;
|
|
76
|
+
public suspend: boolean;
|
|
77
|
+
public operator: boolean;
|
|
78
|
+
public override: boolean;
|
|
79
|
+
public abstract: boolean;
|
|
80
|
+
|
|
81
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
82
|
+
super(options);
|
|
83
|
+
this.name = options.name;
|
|
84
|
+
this.generics = options.generics?.filter(notNullish) ?? [];
|
|
85
|
+
this.parameters = options.parameters?.filter(notNullish) ?? [];
|
|
86
|
+
this.doc = options.doc ?? null;
|
|
87
|
+
this.returnType = options.returnType ?? null;
|
|
88
|
+
this.body = options.body ?? null;
|
|
89
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
90
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
91
|
+
this.receiverType = options.receiverType ?? null;
|
|
92
|
+
this.receiverAnnotations = options.receiverAnnotations?.filter(notNullish) ?? [];
|
|
93
|
+
this.singleExpression = options.singleExpression ?? false;
|
|
94
|
+
this.open = options.open ?? false;
|
|
95
|
+
this.inline = options.inline ?? false;
|
|
96
|
+
this.infix = options.infix ?? false;
|
|
97
|
+
this.tailrec = options.tailrec ?? false;
|
|
98
|
+
this.suspend = options.suspend ?? false;
|
|
99
|
+
this.operator = options.operator ?? false;
|
|
100
|
+
this.override = options.override ?? false;
|
|
101
|
+
this.abstract = options.abstract ?? false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
protected override onWrite(builder: TBuilder): void {
|
|
105
|
+
builder.append(this.inject.beforeDoc);
|
|
106
|
+
ktDoc.get(this.doc, { generics: this.generics, parameters: this.parameters })?.write(builder);
|
|
107
|
+
builder.append(this.inject.afterDoc);
|
|
108
|
+
|
|
109
|
+
builder.append(this.inject.beforeAnnotations);
|
|
110
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
111
|
+
builder.append(this.inject.afterAnnotations);
|
|
112
|
+
|
|
113
|
+
builder.append(this.inject.beforeModifiers);
|
|
114
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
115
|
+
if (this.inline) builder.append('inline ');
|
|
116
|
+
if (this.infix) builder.append('infix ');
|
|
117
|
+
if (this.tailrec) builder.append('tailrec ');
|
|
118
|
+
if (this.suspend) builder.append('suspend ');
|
|
119
|
+
if (this.open) builder.append('open ');
|
|
120
|
+
if (this.override) builder.append('override ');
|
|
121
|
+
if (this.abstract) builder.append('abstract ');
|
|
122
|
+
if (this.operator) builder.append('operator ');
|
|
123
|
+
builder.append(this.inject.afterModifiers);
|
|
124
|
+
|
|
125
|
+
builder.append('fun ');
|
|
126
|
+
|
|
127
|
+
builder.append(this.inject.beforeGenerics);
|
|
128
|
+
ktGenericParameter.write(builder, this.generics);
|
|
129
|
+
builder.append(this.inject.afterGenerics);
|
|
130
|
+
if (this.generics.length > 0) builder.append(' ');
|
|
131
|
+
|
|
132
|
+
if (this.receiverType) {
|
|
133
|
+
builder.append(this.inject.beforeReceiverAnnotations);
|
|
134
|
+
ktAnnotation.write(builder, this.receiverAnnotations, { multiline: false });
|
|
135
|
+
builder.append(this.inject.afterReceiverAnnotations);
|
|
136
|
+
|
|
137
|
+
builder.append(this.inject.beforeReceiverType);
|
|
138
|
+
writeKtNode(builder, this.receiverType);
|
|
139
|
+
builder.append(this.inject.afterReceiverType);
|
|
140
|
+
builder.append('.');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
144
|
+
|
|
145
|
+
builder.append(this.inject.beforeParameters);
|
|
146
|
+
ktParameter.write(builder, this.parameters);
|
|
147
|
+
builder.append(this.inject.afterParameters);
|
|
148
|
+
|
|
149
|
+
if (this.returnType) {
|
|
150
|
+
builder.append(': ');
|
|
151
|
+
builder.append(this.inject.beforeReturnType);
|
|
152
|
+
writeKtNode(builder, this.returnType);
|
|
153
|
+
builder.append(this.inject.afterReturnType);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const isInInterface = this.getParentNode(builder) instanceof KtInterface;
|
|
157
|
+
if (!this.abstract && (this.body || !isInInterface)) {
|
|
158
|
+
builder.append(' ');
|
|
159
|
+
if (this.singleExpression && this.body) {
|
|
160
|
+
builder.append('= ');
|
|
161
|
+
builder.indent(this.body);
|
|
162
|
+
} else {
|
|
163
|
+
builder.parenthesize('{}', this.body, { multiline: !!this.body });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
builder.appendLine();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const createFunction = <TBuilder extends SourceBuilder>(
|
|
172
|
+
name: Options<TBuilder>['name'],
|
|
173
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
174
|
+
): KtFunction<TBuilder> => new KtFunction<TBuilder>({ ...options, name });
|
|
175
|
+
|
|
176
|
+
export const ktFunction: typeof createFunction & { write: typeof writeKtNodes } = Object.assign(createFunction, {
|
|
177
|
+
write: writeKtNodes,
|
|
178
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AstNodeOptions, BasicAppendValue, Nullable, Prettify, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { KtNode } from '../node.js';
|
|
4
|
+
import { writeKtGenericParameters } from '../utils/write-kt-generic-parameters.js';
|
|
5
|
+
import { writeKtNode } from '../utils/write-kt-node.js';
|
|
6
|
+
import type { KtType } from './types.js';
|
|
7
|
+
|
|
8
|
+
type Injects = 'name' | 'constraint';
|
|
9
|
+
|
|
10
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
11
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
12
|
+
{
|
|
13
|
+
name: string;
|
|
14
|
+
description?: Nullable<BasicAppendValue<TBuilder>>;
|
|
15
|
+
constraint?: Nullable<KtType<TBuilder>>;
|
|
16
|
+
}
|
|
17
|
+
>;
|
|
18
|
+
|
|
19
|
+
export class KtGenericParameter<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
20
|
+
TBuilder,
|
|
21
|
+
TInjects | Injects
|
|
22
|
+
> {
|
|
23
|
+
public name: string;
|
|
24
|
+
public description: BasicAppendValue<TBuilder> | null;
|
|
25
|
+
public constraint: KtType<TBuilder> | null;
|
|
26
|
+
|
|
27
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
28
|
+
super(options);
|
|
29
|
+
this.name = options.name;
|
|
30
|
+
this.description = options.description ?? null;
|
|
31
|
+
this.constraint = options.constraint ?? null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected override onWrite(builder: TBuilder): void {
|
|
35
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
36
|
+
|
|
37
|
+
if (this.constraint) {
|
|
38
|
+
builder.append(' : ');
|
|
39
|
+
builder.append(this.inject.beforeConstraint);
|
|
40
|
+
writeKtNode(builder, this.constraint);
|
|
41
|
+
builder.append(this.inject.afterConstraint);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const createGenericParameter = <TBuilder extends SourceBuilder>(
|
|
47
|
+
name: Options<TBuilder>['name'],
|
|
48
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
49
|
+
): KtGenericParameter<TBuilder> => new KtGenericParameter<TBuilder>({ ...options, name });
|
|
50
|
+
|
|
51
|
+
export const ktGenericParameter: typeof createGenericParameter & { write: typeof writeKtGenericParameters } = Object
|
|
52
|
+
.assign(createGenericParameter, {
|
|
53
|
+
write: writeKtGenericParameters,
|
|
54
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AppendValue, AstNodeOptions, Prettify, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { KtNode } from '../node.js';
|
|
4
|
+
import { writeKtNodes } from '../utils/write-kt-node.js';
|
|
5
|
+
|
|
6
|
+
type Injects = never;
|
|
7
|
+
|
|
8
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
9
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
10
|
+
{
|
|
11
|
+
body: AppendValue<TBuilder>;
|
|
12
|
+
}
|
|
13
|
+
>;
|
|
14
|
+
|
|
15
|
+
export class KtInitBlock<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
16
|
+
TBuilder,
|
|
17
|
+
TInjects | Injects
|
|
18
|
+
> {
|
|
19
|
+
public body: AppendValue<TBuilder>;
|
|
20
|
+
|
|
21
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
22
|
+
super(options);
|
|
23
|
+
this.body = options.body;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected override onWrite(builder: TBuilder): void {
|
|
27
|
+
builder.append('init ').parenthesize('{}', this.body, { multiline: !!this.body }).appendLine();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const createInitBlock = <TBuilder extends SourceBuilder>(
|
|
32
|
+
body: Options<TBuilder>['body'],
|
|
33
|
+
options?: Prettify<Omit<Options<TBuilder>, 'body'>>,
|
|
34
|
+
): KtInitBlock<TBuilder> => new KtInitBlock<TBuilder>({ ...options, body });
|
|
35
|
+
|
|
36
|
+
export const ktInitBlock: typeof createInitBlock & { write: typeof writeKtNodes } = Object.assign(createInitBlock, {
|
|
37
|
+
write: writeKtNodes,
|
|
38
|
+
});
|
|
@@ -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
|
+
});
|