@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,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
|
+
});
|
|
@@ -0,0 +1,225 @@
|
|
|
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 type { KtAccessModifier } from '../common.js';
|
|
11
|
+
import { KtNode } from '../node.js';
|
|
12
|
+
import { writeKtNode, writeKtNodes } from '../utils/write-kt-node.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 { KtType, KtValue } from './types.js';
|
|
17
|
+
|
|
18
|
+
type AccessorInjects = 'annotations' | 'modifiers' | 'params' | 'body';
|
|
19
|
+
|
|
20
|
+
type AccessorOptions<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
21
|
+
typeof KtNode<TBuilder, TInjects | AccessorInjects>,
|
|
22
|
+
{
|
|
23
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
24
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
25
|
+
body?: Nullable<AppendValue<TBuilder>>;
|
|
26
|
+
singleExpression?: Nullable<boolean>;
|
|
27
|
+
}
|
|
28
|
+
>;
|
|
29
|
+
|
|
30
|
+
export abstract class KtPropertyAccessor<
|
|
31
|
+
TBuilder extends SourceBuilder,
|
|
32
|
+
TInjects extends string = never,
|
|
33
|
+
> extends KtNode<TBuilder, TInjects | AccessorInjects> {
|
|
34
|
+
public abstract get kind(): 'get' | 'set';
|
|
35
|
+
public accessModifier: KtAccessModifier | null;
|
|
36
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
37
|
+
public body: AppendValue<TBuilder> | null;
|
|
38
|
+
public singleExpression: boolean;
|
|
39
|
+
|
|
40
|
+
constructor(options: AccessorOptions<TBuilder, TInjects>) {
|
|
41
|
+
super(options);
|
|
42
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
43
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
44
|
+
this.body = options.body ?? null;
|
|
45
|
+
this.singleExpression = options.singleExpression ?? false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected override onWrite(builder: TBuilder): void {
|
|
49
|
+
builder.append(this.inject.beforeAnnotations);
|
|
50
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
51
|
+
builder.append(this.inject.afterAnnotations);
|
|
52
|
+
|
|
53
|
+
builder.append(this.inject.beforeModifiers);
|
|
54
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
55
|
+
builder.append(this.inject.afterModifiers);
|
|
56
|
+
|
|
57
|
+
builder.append(this.kind);
|
|
58
|
+
|
|
59
|
+
if (this.body) {
|
|
60
|
+
builder.append(this.inject.beforeParams);
|
|
61
|
+
builder.append(this.kind === 'set' ? '(value)' : '()');
|
|
62
|
+
builder.append(this.inject.afterParams);
|
|
63
|
+
|
|
64
|
+
if (this.singleExpression) {
|
|
65
|
+
builder.append(' = ', this.inject.beforeBody);
|
|
66
|
+
builder.indent(this.body);
|
|
67
|
+
} else {
|
|
68
|
+
builder.append(' ', this.inject.beforeBody);
|
|
69
|
+
builder.parenthesize('{}', this.body, { multiline: true });
|
|
70
|
+
}
|
|
71
|
+
builder.append(this.inject.afterBody);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
builder.appendLine();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export class KtPropertyGetter<TBuilder extends SourceBuilder> extends KtPropertyAccessor<TBuilder> {
|
|
78
|
+
public override readonly kind = 'get' as const;
|
|
79
|
+
}
|
|
80
|
+
export class KtPropertySetter<TBuilder extends SourceBuilder> extends KtPropertyAccessor<TBuilder> {
|
|
81
|
+
public override readonly kind = 'set' as const;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type Injects = 'doc' | 'annotations' | 'modifiers' | 'name' | 'type' | 'default' | 'delegate';
|
|
85
|
+
|
|
86
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
87
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
88
|
+
{
|
|
89
|
+
doc?: Nullable<KtDoc<TBuilder>>;
|
|
90
|
+
name: string;
|
|
91
|
+
type?: KtType<TBuilder>;
|
|
92
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
93
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
94
|
+
getter?: Nullable<KtPropertyGetter<TBuilder>>;
|
|
95
|
+
setter?: Nullable<KtPropertySetter<TBuilder>>;
|
|
96
|
+
default?: Nullable<KtValue<TBuilder>>;
|
|
97
|
+
delegate?: Nullable<KtType<TBuilder>>;
|
|
98
|
+
delegateArguments?: Nullable<Nullable<KtArgument<TBuilder> | KtValue<TBuilder>>[]>;
|
|
99
|
+
mutable?: Nullable<boolean>;
|
|
100
|
+
const?: Nullable<boolean>;
|
|
101
|
+
lateinit?: Nullable<boolean>;
|
|
102
|
+
open?: Nullable<boolean>;
|
|
103
|
+
override?: Nullable<boolean>;
|
|
104
|
+
abstract?: Nullable<boolean>;
|
|
105
|
+
}
|
|
106
|
+
>;
|
|
107
|
+
|
|
108
|
+
export class KtProperty<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
109
|
+
TBuilder,
|
|
110
|
+
TInjects | Injects
|
|
111
|
+
> {
|
|
112
|
+
public doc: KtDoc<TBuilder> | null;
|
|
113
|
+
public name: string;
|
|
114
|
+
public type: KtType<TBuilder> | null;
|
|
115
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
116
|
+
public accessModifier: KtAccessModifier | null;
|
|
117
|
+
public getter: KtPropertyGetter<TBuilder> | null;
|
|
118
|
+
public setter: KtPropertySetter<TBuilder> | null;
|
|
119
|
+
public default: KtValue<TBuilder> | null;
|
|
120
|
+
public delegate: KtType<TBuilder> | null;
|
|
121
|
+
public delegateArguments: (KtArgument<TBuilder> | KtValue<TBuilder>)[] | null;
|
|
122
|
+
public mutable: boolean;
|
|
123
|
+
public const: boolean;
|
|
124
|
+
public lateinit: boolean;
|
|
125
|
+
public open: boolean;
|
|
126
|
+
public override: boolean;
|
|
127
|
+
public abstract: boolean;
|
|
128
|
+
|
|
129
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
130
|
+
super(options);
|
|
131
|
+
this.doc = options.doc ?? null;
|
|
132
|
+
this.name = options.name;
|
|
133
|
+
this.type = options.type ?? null;
|
|
134
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
135
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
136
|
+
this.getter = options.getter ?? null;
|
|
137
|
+
this.setter = options.setter ?? null;
|
|
138
|
+
this.default = options.default ?? null;
|
|
139
|
+
this.delegate = options.delegate ?? null;
|
|
140
|
+
this.delegateArguments = options.delegateArguments?.filter(notNullish) ?? null;
|
|
141
|
+
this.mutable = options.mutable ?? false;
|
|
142
|
+
this.const = options.const ?? false;
|
|
143
|
+
this.lateinit = options.lateinit ?? false;
|
|
144
|
+
this.open = options.open ?? false;
|
|
145
|
+
this.override = options.override ?? false;
|
|
146
|
+
this.abstract = options.abstract ?? false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
protected override onWrite(builder: TBuilder): void {
|
|
150
|
+
builder.append(this.inject.beforeDoc);
|
|
151
|
+
this.doc?.write(builder);
|
|
152
|
+
builder.append(this.inject.afterDoc);
|
|
153
|
+
|
|
154
|
+
builder.append(this.inject.beforeAnnotations);
|
|
155
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
156
|
+
builder.append(this.inject.afterAnnotations);
|
|
157
|
+
|
|
158
|
+
builder.append(this.inject.beforeModifiers);
|
|
159
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
160
|
+
if (this.const) builder.append('const ');
|
|
161
|
+
if (this.lateinit) builder.append('lateinit ');
|
|
162
|
+
if (this.abstract) builder.append('abstract ');
|
|
163
|
+
if (this.override) builder.append('override ');
|
|
164
|
+
if (this.open) builder.append('open ');
|
|
165
|
+
builder.append(this.inject.afterModifiers);
|
|
166
|
+
|
|
167
|
+
builder.append(this.mutable || !!this.setter ? 'var ' : 'val ');
|
|
168
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
169
|
+
|
|
170
|
+
if (this.type || (!this.default && !this.getter?.body)) {
|
|
171
|
+
builder.append(': ', this.inject.beforeType);
|
|
172
|
+
writeKtNode(builder, this.type ?? 'Any?');
|
|
173
|
+
builder.append(this.inject.afterType);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (this.default) {
|
|
177
|
+
builder.append(' = ', this.inject.beforeDefault);
|
|
178
|
+
writeKtNode(builder, this.default);
|
|
179
|
+
builder.append(this.inject.afterDefault);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (this.delegate) {
|
|
183
|
+
builder.append(' by ', this.inject.beforeDelegate);
|
|
184
|
+
writeKtNode(builder, this.delegate);
|
|
185
|
+
if (this.delegateArguments) {
|
|
186
|
+
ktArgument.write(builder, this.delegateArguments);
|
|
187
|
+
}
|
|
188
|
+
builder.append(this.inject.afterDelegate);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
builder.appendLine();
|
|
192
|
+
|
|
193
|
+
if (this.getter || this.setter) {
|
|
194
|
+
builder.indent((b) => {
|
|
195
|
+
this.getter?.write(b);
|
|
196
|
+
this.setter?.write(b);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
builder.ensureCurrentLineEmpty();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const createPropertyGetter = <TBuilder extends SourceBuilder>(
|
|
205
|
+
options?: AccessorOptions<TBuilder>,
|
|
206
|
+
): KtPropertyGetter<TBuilder> => new KtPropertyGetter<TBuilder>(options ?? {});
|
|
207
|
+
|
|
208
|
+
const createPropertySetter = <TBuilder extends SourceBuilder>(
|
|
209
|
+
options?: AccessorOptions<TBuilder>,
|
|
210
|
+
): KtPropertySetter<TBuilder> => new KtPropertySetter<TBuilder>(options ?? {});
|
|
211
|
+
|
|
212
|
+
const createProperty = <TBuilder extends SourceBuilder>(
|
|
213
|
+
name: Options<TBuilder>['name'],
|
|
214
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
215
|
+
): KtProperty<TBuilder> => new KtProperty<TBuilder>({ ...options, name });
|
|
216
|
+
|
|
217
|
+
export const ktProperty: typeof createProperty & {
|
|
218
|
+
getter: typeof createPropertyGetter;
|
|
219
|
+
setter: typeof createPropertySetter;
|
|
220
|
+
write: typeof writeKtNodes;
|
|
221
|
+
} = Object.assign(createProperty, {
|
|
222
|
+
getter: createPropertyGetter,
|
|
223
|
+
setter: createPropertySetter,
|
|
224
|
+
write: writeKtNodes,
|
|
225
|
+
});
|