@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.
- package/LICENSE +21 -21
- package/README.md +45 -45
- package/assets/client/okhttp3/ApiClient.kt +252 -252
- package/assets/client/spring-reactive-web-clients/ApiRequestFile.kt +33 -33
- package/esm/src/generators/models/model-generator.js +2 -2
- package/esm/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
- package/esm/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
- package/esm/src/generators/services/spring-reactive-web-clients/models.d.ts +1 -1
- package/esm/src/generators/services/spring-reactive-web-clients/models.d.ts.map +1 -1
- package/esm/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts.map +1 -1
- package/package.json +2 -2
- package/script/src/generators/models/model-generator.js +2 -2
- package/script/src/generators/services/okhttp3-clients/okhttp3-client-generator.js +28 -28
- package/script/src/generators/services/spring-controllers/spring-controller-generator.js +9 -9
- package/script/src/generators/services/spring-reactive-web-clients/models.d.ts +1 -1
- package/script/src/generators/services/spring-reactive-web-clients/models.d.ts.map +1 -1
- package/script/src/generators/services/spring-reactive-web-clients/spring-reactive-web-client-generator.d.ts.map +1 -1
- 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 +24 -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 +108 -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 +691 -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 +62 -0
- package/src/src/generators/services/okhttp3-clients/okhttp3-client-generator.ts +594 -0
- package/src/src/generators/services/okhttp3-clients/okhttp3-clients-generator.ts +130 -0
- package/src/src/generators/services/okhttp3-clients/refs.ts +55 -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 +71 -0
- package/src/src/generators/services/spring-controllers/refs.ts +17 -0
- package/src/src/generators/services/spring-controllers/spring-controller-generator.ts +814 -0
- package/src/src/generators/services/spring-controllers/spring-controllers-generator.ts +118 -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 +572 -0
- package/src/src/generators/services/spring-reactive-web-clients/spring-reactive-web-clients-generator.ts +128 -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,62 @@
|
|
|
1
|
+
import type { AstNodeOptions, Nullable, Prettify, SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { KtNode } from '../node.js';
|
|
4
|
+
import { writeKtArguments } from '../utils/write-kt-arguments.js';
|
|
5
|
+
import { writeKtNode } from '../utils/write-kt-node.js';
|
|
6
|
+
import type { KtValue } from './types.js';
|
|
7
|
+
|
|
8
|
+
type Injects = 'name' | 'value';
|
|
9
|
+
|
|
10
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
11
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
12
|
+
{
|
|
13
|
+
name?: Nullable<string>;
|
|
14
|
+
value: KtValue<TBuilder>;
|
|
15
|
+
}
|
|
16
|
+
>;
|
|
17
|
+
|
|
18
|
+
export class KtArgument<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
19
|
+
TBuilder,
|
|
20
|
+
TInjects | Injects
|
|
21
|
+
> {
|
|
22
|
+
public name: string | null;
|
|
23
|
+
public value: KtValue<TBuilder>;
|
|
24
|
+
|
|
25
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
26
|
+
super(options);
|
|
27
|
+
this.name = options?.name ?? null;
|
|
28
|
+
this.value = options.value;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected override onWrite(builder: TBuilder): void {
|
|
32
|
+
if (this.name) {
|
|
33
|
+
builder.append(this.inject.beforeName);
|
|
34
|
+
builder.append(this.name);
|
|
35
|
+
builder.append(this.inject.afterName);
|
|
36
|
+
builder.append(' = ');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
builder.append(this.inject.beforeValue);
|
|
40
|
+
writeKtNode(builder, this.value);
|
|
41
|
+
builder.append(this.inject.afterValue);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const createArgument = <TBuilder extends SourceBuilder>(
|
|
46
|
+
value: Options<TBuilder>['value'],
|
|
47
|
+
options?: Prettify<Omit<Options<TBuilder>, 'value'>>,
|
|
48
|
+
): KtArgument<TBuilder> => new KtArgument<TBuilder>({ ...options, value });
|
|
49
|
+
|
|
50
|
+
const createNamedArgument = <TBuilder extends SourceBuilder>(
|
|
51
|
+
name: Options<TBuilder>['name'],
|
|
52
|
+
value: Options<TBuilder>['value'],
|
|
53
|
+
options?: Prettify<Omit<Options<TBuilder>, 'value' | 'name'>>,
|
|
54
|
+
): KtArgument<TBuilder> => new KtArgument<TBuilder>({ ...options, value, name });
|
|
55
|
+
|
|
56
|
+
export const ktArgument: typeof createArgument & {
|
|
57
|
+
named: typeof createNamedArgument;
|
|
58
|
+
write: typeof writeKtArguments;
|
|
59
|
+
} = Object.assign(createArgument, {
|
|
60
|
+
named: createNamedArgument,
|
|
61
|
+
write: writeKtArguments,
|
|
62
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ArrayItem,
|
|
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 { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
|
|
12
|
+
import { type KtArgument, ktArgument } from './argument.js';
|
|
13
|
+
import type { KtType, KtValue } from './types.js';
|
|
14
|
+
|
|
15
|
+
type Injects = never;
|
|
16
|
+
|
|
17
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
18
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
19
|
+
{
|
|
20
|
+
path: Nullable<KtType<TBuilder> | KtValue<TBuilder>>[];
|
|
21
|
+
arguments?: Nullable<Nullable<KtArgument<TBuilder> | KtValue<TBuilder>>[]>;
|
|
22
|
+
infix?: boolean;
|
|
23
|
+
}
|
|
24
|
+
>;
|
|
25
|
+
|
|
26
|
+
export class KtCall<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
27
|
+
TBuilder,
|
|
28
|
+
TInjects | Injects
|
|
29
|
+
> {
|
|
30
|
+
public path: (KtType<TBuilder> | KtValue<TBuilder>)[];
|
|
31
|
+
public arguments: (KtArgument<TBuilder> | KtValue<TBuilder>)[] | null;
|
|
32
|
+
public infix: boolean;
|
|
33
|
+
|
|
34
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
35
|
+
super(options);
|
|
36
|
+
this.path = options.path.filter(notNullish);
|
|
37
|
+
this.arguments = options.arguments?.filter(notNullish) ?? null;
|
|
38
|
+
this.infix = options.infix ?? false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected override onWrite(builder: TBuilder): void {
|
|
42
|
+
if (this.infix && this.arguments?.length === 1 && this.path.length > 1) {
|
|
43
|
+
writeKtNodes(builder, this.path.slice(0, 1), { separator: '.' });
|
|
44
|
+
builder.append(' ');
|
|
45
|
+
writeKtNode(builder, this.path.at(-1));
|
|
46
|
+
builder.append(' ');
|
|
47
|
+
writeKtNode(builder, this.arguments[0]);
|
|
48
|
+
} else {
|
|
49
|
+
if (this.path.length > 2) {
|
|
50
|
+
writeKtNode(builder, this.path[0]);
|
|
51
|
+
builder.ensureCurrentLineEmpty();
|
|
52
|
+
builder.indent((builder) => {
|
|
53
|
+
builder.append('.');
|
|
54
|
+
writeKtNodes(builder, this.path.slice(1), { separator: '\n.' });
|
|
55
|
+
});
|
|
56
|
+
} else {
|
|
57
|
+
writeKtNodes(builder, this.path, { separator: '.' });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (this.arguments) {
|
|
61
|
+
ktArgument.write(builder, this.arguments);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const createCall = <TBuilder extends SourceBuilder>(
|
|
68
|
+
path: Options<TBuilder>['path'] | ArrayItem<Options<TBuilder>['path']>,
|
|
69
|
+
args?: Options<TBuilder>['arguments'],
|
|
70
|
+
options?: Prettify<Omit<Options<TBuilder>, 'path' | 'arguments'>>,
|
|
71
|
+
): KtCall<TBuilder> => new KtCall<TBuilder>({ ...options, path: Array.isArray(path) ? path : [path], arguments: args });
|
|
72
|
+
|
|
73
|
+
export const ktCall: typeof createCall & { write: typeof writeKtNodes } = Object.assign(createCall, {
|
|
74
|
+
write: writeKtNodes,
|
|
75
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
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 { writeKtNode, writeKtNodes } from '../utils/write-kt-node.js';
|
|
16
|
+
import { type KtAnnotation, ktAnnotation } from './annotation.js';
|
|
17
|
+
import { ktArgument } from './argument.js';
|
|
18
|
+
import type { KtConstructor } from './constructor.js';
|
|
19
|
+
import { type KtDoc, ktDoc } from './doc.js';
|
|
20
|
+
import type { KtEnum } from './enum.js';
|
|
21
|
+
import type { KtFunction } from './function.js';
|
|
22
|
+
import { type KtGenericParameter, ktGenericParameter } from './generic-parameter.js';
|
|
23
|
+
import { type KtInitBlock, ktInitBlock } from './init-block.js';
|
|
24
|
+
import type { KtInterface } from './interface.js';
|
|
25
|
+
import type { KtObject } from './object.js';
|
|
26
|
+
import type { KtProperty } from './property.js';
|
|
27
|
+
import type { KtType } from './types.js';
|
|
28
|
+
|
|
29
|
+
type Injects =
|
|
30
|
+
| 'doc'
|
|
31
|
+
| 'annotations'
|
|
32
|
+
| 'modifiers'
|
|
33
|
+
| 'name'
|
|
34
|
+
| 'generics'
|
|
35
|
+
| 'primaryConstructor'
|
|
36
|
+
| 'inheritList'
|
|
37
|
+
| 'body'
|
|
38
|
+
| 'members';
|
|
39
|
+
|
|
40
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
41
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
42
|
+
{
|
|
43
|
+
doc?: Nullable<KtDoc<TBuilder>>;
|
|
44
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
45
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
46
|
+
open?: Nullable<boolean>;
|
|
47
|
+
abstract?: Nullable<boolean>;
|
|
48
|
+
classKind?: Nullable<KtClassKind>;
|
|
49
|
+
name: string;
|
|
50
|
+
generics?: Nullable<Nullable<KtGenericParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
51
|
+
primaryConstructor?: Nullable<KtConstructor<TBuilder>>;
|
|
52
|
+
extends?: Nullable<KtType<TBuilder>>;
|
|
53
|
+
implements?: Nullable<Nullable<KtType<TBuilder>>[]>;
|
|
54
|
+
companionObject?: Nullable<KtObject<TBuilder>>;
|
|
55
|
+
members?: Nullable<Nullable<KtClassMember<TBuilder>>[]>;
|
|
56
|
+
}
|
|
57
|
+
>;
|
|
58
|
+
|
|
59
|
+
export type KtClassKind = 'data' | 'value' | 'annotation' | 'sealed';
|
|
60
|
+
export type KtClassMember<TBuilder extends SourceBuilder> =
|
|
61
|
+
| KtConstructor<TBuilder>
|
|
62
|
+
| KtEnum<TBuilder>
|
|
63
|
+
| KtInitBlock<TBuilder>
|
|
64
|
+
| KtInterface<TBuilder>
|
|
65
|
+
| KtProperty<TBuilder>
|
|
66
|
+
| KtFunction<TBuilder>
|
|
67
|
+
| KtClass<TBuilder>
|
|
68
|
+
| AppendValue<TBuilder>;
|
|
69
|
+
|
|
70
|
+
export class KtClass<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
71
|
+
TBuilder,
|
|
72
|
+
TInjects | Injects
|
|
73
|
+
> {
|
|
74
|
+
public doc: KtDoc<TBuilder> | null;
|
|
75
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
76
|
+
public accessModifier: KtAccessModifier | null;
|
|
77
|
+
public open: boolean;
|
|
78
|
+
public abstract: boolean;
|
|
79
|
+
public classKind: KtClassKind | null;
|
|
80
|
+
public name: string;
|
|
81
|
+
public generics: (KtGenericParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
|
|
82
|
+
public primaryConstructor: KtConstructor<TBuilder> | null;
|
|
83
|
+
public extends: KtType<TBuilder> | null;
|
|
84
|
+
public implements: KtType<TBuilder>[];
|
|
85
|
+
public members: KtClassMember<TBuilder>[];
|
|
86
|
+
public companionObject: Nullable<KtObject<TBuilder>>;
|
|
87
|
+
|
|
88
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
89
|
+
super(options);
|
|
90
|
+
this.doc = options.doc ?? null;
|
|
91
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
92
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
93
|
+
this.open = options.open ?? false;
|
|
94
|
+
this.abstract = options.abstract ?? false;
|
|
95
|
+
this.classKind = options.classKind ?? null;
|
|
96
|
+
this.name = options.name;
|
|
97
|
+
this.generics = options.generics?.filter(notNullish) ?? [];
|
|
98
|
+
this.primaryConstructor = options.primaryConstructor ?? null;
|
|
99
|
+
this.extends = options.extends ?? null;
|
|
100
|
+
this.implements = options.implements?.filter(notNullish) ?? [];
|
|
101
|
+
this.members = options.members?.filter(notNullish) ?? [];
|
|
102
|
+
this.companionObject = options.companionObject;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
protected override onWrite(builder: TBuilder): void {
|
|
106
|
+
builder.append(this.inject.beforeDoc);
|
|
107
|
+
ktDoc.get(this.doc, { generics: this.generics, parameters: this.primaryConstructor?.parameters })?.write(builder);
|
|
108
|
+
builder.append(this.inject.afterDoc);
|
|
109
|
+
|
|
110
|
+
builder.append(this.inject.beforeAnnotations);
|
|
111
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
112
|
+
builder.append(this.inject.afterAnnotations);
|
|
113
|
+
|
|
114
|
+
builder.append(this.inject.beforeModifiers);
|
|
115
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
116
|
+
if (this.open) builder.append('open ');
|
|
117
|
+
if (this.abstract) builder.append('abstract ');
|
|
118
|
+
if (this.classKind) builder.append(this.classKind, ' ');
|
|
119
|
+
builder.append(this.inject.afterModifiers);
|
|
120
|
+
|
|
121
|
+
builder.append('class ');
|
|
122
|
+
builder.append(this.inject.beforeName, this.name, this.inject.afterName);
|
|
123
|
+
|
|
124
|
+
builder.append(this.inject.beforeGenerics);
|
|
125
|
+
ktGenericParameter.write(builder, this.generics);
|
|
126
|
+
builder.append(this.inject.afterGenerics);
|
|
127
|
+
|
|
128
|
+
if (this.primaryConstructor) {
|
|
129
|
+
builder.append(this.inject.beforePrimaryConstructor);
|
|
130
|
+
this.primaryConstructor.writeAsPrimary(builder);
|
|
131
|
+
builder.append(this.inject.afterPrimaryConstructor);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (this.extends || this.implements.length > 0) {
|
|
135
|
+
builder.append(' : ');
|
|
136
|
+
builder.append(this.inject.beforeInheritList);
|
|
137
|
+
writeKtNode(builder, this.extends);
|
|
138
|
+
if (this.extends && this.primaryConstructor?.delegateTarget === 'super') {
|
|
139
|
+
ktArgument.write(builder, this.primaryConstructor.delegateArguments);
|
|
140
|
+
}
|
|
141
|
+
if (this.extends && this.implements.length > 0) {
|
|
142
|
+
builder.append(', ');
|
|
143
|
+
}
|
|
144
|
+
writeKtNodes(builder, this.implements, { separator: ', ' });
|
|
145
|
+
builder.append(this.inject.afterInheritList);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (this.members.length > 0 || this.primaryConstructor?.body || this.companionObject) {
|
|
149
|
+
builder.append(' ');
|
|
150
|
+
builder.append(this.inject.beforeBody);
|
|
151
|
+
builder.parenthesize(
|
|
152
|
+
'{}',
|
|
153
|
+
(b) => {
|
|
154
|
+
b.append(this.inject.beforeMembers);
|
|
155
|
+
writeKtMembers(b, [
|
|
156
|
+
this.companionObject ? createOverwriteProxy(this.companionObject, { companion: true }) : null,
|
|
157
|
+
this.primaryConstructor?.body ? ktInitBlock(this.primaryConstructor?.body) : null,
|
|
158
|
+
...this.members,
|
|
159
|
+
]);
|
|
160
|
+
b.append(this.inject.afterMembers);
|
|
161
|
+
},
|
|
162
|
+
{ multiline: true },
|
|
163
|
+
);
|
|
164
|
+
builder.append(this.inject.afterBody);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
builder.appendLine();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const createClass = <TBuilder extends SourceBuilder>(
|
|
172
|
+
name: Options<TBuilder>['name'],
|
|
173
|
+
options?: Prettify<Omit<Options<TBuilder>, 'name'>>,
|
|
174
|
+
): KtClass<TBuilder> => new KtClass<TBuilder>({ ...options, name });
|
|
175
|
+
|
|
176
|
+
export const ktClass: typeof createClass & { write: typeof writeKtNodes } = Object.assign(createClass, {
|
|
177
|
+
write: writeKtNodes,
|
|
178
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type AstNodeOptions, notNullish, type Nullable, type SourceBuilder } from '@goast/core';
|
|
2
|
+
|
|
3
|
+
import { KtNode } from '../node.js';
|
|
4
|
+
import { writeKtNodes } from '../utils/write-kt-node.js';
|
|
5
|
+
import type { KtValue } from './types.js';
|
|
6
|
+
|
|
7
|
+
type Injects = never;
|
|
8
|
+
|
|
9
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
10
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
11
|
+
{
|
|
12
|
+
elements: Nullable<Nullable<KtValue<TBuilder>>[]>;
|
|
13
|
+
}
|
|
14
|
+
>;
|
|
15
|
+
|
|
16
|
+
export class KtCollectionLiteral<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
17
|
+
TBuilder,
|
|
18
|
+
TInjects | Injects
|
|
19
|
+
> {
|
|
20
|
+
public elements: KtValue<TBuilder>[];
|
|
21
|
+
|
|
22
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
23
|
+
super(options);
|
|
24
|
+
this.elements = options.elements?.filter(notNullish) ?? [];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected override onWrite(builder: TBuilder): void {
|
|
28
|
+
const multiline = this.elements.length > 2;
|
|
29
|
+
builder.parenthesize(
|
|
30
|
+
'[]',
|
|
31
|
+
(b) => {
|
|
32
|
+
writeKtNodes(b, this.elements, { separator: multiline ? ',\n' : ', ' });
|
|
33
|
+
},
|
|
34
|
+
{ multiline },
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const createCollectionLiteral = <TBuilder extends SourceBuilder>(
|
|
40
|
+
elements: Options<TBuilder>['elements'],
|
|
41
|
+
options?: Omit<Options<TBuilder>, 'elements'>,
|
|
42
|
+
): KtCollectionLiteral<TBuilder> => new KtCollectionLiteral<TBuilder>({ ...options, elements });
|
|
43
|
+
|
|
44
|
+
export const ktCollectionLiteral: typeof createCollectionLiteral & { write: typeof writeKtNodes } = Object.assign(
|
|
45
|
+
createCollectionLiteral,
|
|
46
|
+
{
|
|
47
|
+
write: writeKtNodes,
|
|
48
|
+
},
|
|
49
|
+
);
|
|
@@ -0,0 +1,126 @@
|
|
|
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 { writeKtNodes } from '../utils/write-kt-node.js';
|
|
14
|
+
import { type KtAnnotation, ktAnnotation } from './annotation.js';
|
|
15
|
+
import { type KtArgument, ktArgument } from './argument.js';
|
|
16
|
+
import { type KtParameter, ktParameter } from './parameter.js';
|
|
17
|
+
import type { KtValue } from './types.js';
|
|
18
|
+
|
|
19
|
+
type Injects = 'annotations' | 'modifiers' | 'params' | 'body' | 'delegate';
|
|
20
|
+
|
|
21
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
22
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
23
|
+
{
|
|
24
|
+
accessModifier?: Nullable<KtAccessModifier>;
|
|
25
|
+
annotations?: Nullable<Nullable<KtAnnotation<TBuilder>>[]>;
|
|
26
|
+
parameters?: Nullable<Nullable<KtParameter<TBuilder> | BasicAppendValue<TBuilder>>[]>;
|
|
27
|
+
body?: Nullable<AppendValue<TBuilder>>;
|
|
28
|
+
delegateTarget?: Nullable<KtDelegateTarget>;
|
|
29
|
+
delegateArguments?: Nullable<Nullable<KtArgument<TBuilder> | KtValue<TBuilder>>[]>;
|
|
30
|
+
}
|
|
31
|
+
>;
|
|
32
|
+
|
|
33
|
+
export type KtDelegateTarget = 'this' | 'super';
|
|
34
|
+
|
|
35
|
+
export class KtConstructor<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
36
|
+
TBuilder,
|
|
37
|
+
TInjects | Injects
|
|
38
|
+
> {
|
|
39
|
+
public accessModifier: KtAccessModifier | null;
|
|
40
|
+
public annotations: KtAnnotation<TBuilder>[];
|
|
41
|
+
public parameters: (KtParameter<TBuilder> | BasicAppendValue<TBuilder>)[];
|
|
42
|
+
public body: AppendValue<TBuilder> | null;
|
|
43
|
+
public delegateTarget: KtDelegateTarget | null;
|
|
44
|
+
public delegateArguments: (KtArgument<TBuilder> | KtValue<TBuilder>)[];
|
|
45
|
+
|
|
46
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
47
|
+
super(options);
|
|
48
|
+
this.parameters = options.parameters?.filter(notNullish) ?? [];
|
|
49
|
+
this.body = options.body ?? null;
|
|
50
|
+
this.accessModifier = options.accessModifier ?? null;
|
|
51
|
+
this.annotations = options.annotations?.filter(notNullish) ?? [];
|
|
52
|
+
this.delegateTarget = options.delegateTarget ?? null;
|
|
53
|
+
this.delegateArguments = options.delegateArguments?.filter(notNullish) ?? [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected override onWrite(builder: TBuilder): void {
|
|
57
|
+
builder.append(this.inject.beforeAnnotations);
|
|
58
|
+
ktAnnotation.write(builder, this.annotations, { multiline: true });
|
|
59
|
+
builder.append(this.inject.afterAnnotations);
|
|
60
|
+
|
|
61
|
+
builder.append(this.inject.beforeModifiers);
|
|
62
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
63
|
+
builder.append(this.inject.afterModifiers);
|
|
64
|
+
|
|
65
|
+
builder.append('constructor');
|
|
66
|
+
|
|
67
|
+
builder.append(this.inject.beforeParams);
|
|
68
|
+
ktParameter.write(builder, this.parameters);
|
|
69
|
+
builder.append(this.inject.afterParams);
|
|
70
|
+
|
|
71
|
+
if (this.delegateTarget) {
|
|
72
|
+
builder.append(' : ');
|
|
73
|
+
builder.append(this.inject.beforeDelegate);
|
|
74
|
+
builder.append(this.delegateTarget);
|
|
75
|
+
ktArgument.write(builder, this.delegateArguments);
|
|
76
|
+
builder.append(this.inject.afterDelegate);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
builder.append(' ');
|
|
80
|
+
builder.append(this.inject.beforeBody);
|
|
81
|
+
builder.parenthesize('{}', this.body, { multiline: !!this.body });
|
|
82
|
+
builder.append(this.inject.afterBody);
|
|
83
|
+
|
|
84
|
+
builder.appendLine();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public writeAsPrimary(builder: TBuilder): void {
|
|
88
|
+
builder.append(this.inject.before);
|
|
89
|
+
this.onWriteAsPrimary(builder);
|
|
90
|
+
builder.append(this.inject.after);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
protected onWriteAsPrimary(builder: TBuilder): void {
|
|
94
|
+
const needsCtorKeyword = this.annotations.length > 0 || !!this.accessModifier;
|
|
95
|
+
if (needsCtorKeyword) builder.append(' ');
|
|
96
|
+
|
|
97
|
+
builder.append(this.inject.beforeAnnotations);
|
|
98
|
+
ktAnnotation.write(builder, this.annotations);
|
|
99
|
+
builder.append(this.inject.afterAnnotations);
|
|
100
|
+
|
|
101
|
+
builder.append(this.inject.beforeModifiers);
|
|
102
|
+
if (this.accessModifier) builder.append(this.accessModifier, ' ');
|
|
103
|
+
builder.append(this.inject.afterModifiers);
|
|
104
|
+
|
|
105
|
+
if (needsCtorKeyword) builder.append('constructor');
|
|
106
|
+
|
|
107
|
+
if (needsCtorKeyword || this.parameters.length > 0) {
|
|
108
|
+
builder.append(this.inject.beforeParams);
|
|
109
|
+
ktParameter.write(builder, this.parameters);
|
|
110
|
+
builder.append(this.inject.afterParams);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const createConstructor = <TBuilder extends SourceBuilder>(
|
|
116
|
+
parameters?: Options<TBuilder>['parameters'],
|
|
117
|
+
body?: Options<TBuilder>['body'],
|
|
118
|
+
options?: Prettify<Omit<Options<TBuilder>, 'parameters' | 'body'>>,
|
|
119
|
+
): KtConstructor<TBuilder> => new KtConstructor<TBuilder>({ ...options, parameters: parameters ?? undefined, body });
|
|
120
|
+
|
|
121
|
+
export const ktConstructor: typeof createConstructor & { write: typeof writeKtNodes } = Object.assign(
|
|
122
|
+
createConstructor,
|
|
123
|
+
{
|
|
124
|
+
write: writeKtNodes,
|
|
125
|
+
},
|
|
126
|
+
);
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AstNodeOptions,
|
|
3
|
+
type BasicAppendValue,
|
|
4
|
+
basicAppendValueGroup,
|
|
5
|
+
notNullish,
|
|
6
|
+
type Nullable,
|
|
7
|
+
type ParametersWithOverloads,
|
|
8
|
+
type Prettify,
|
|
9
|
+
type SingleOrMultiple,
|
|
10
|
+
type SourceBuilder,
|
|
11
|
+
type StringSuggestions,
|
|
12
|
+
} from '@goast/core';
|
|
13
|
+
|
|
14
|
+
import { isKotlinAppendValue } from '../../file-builder.js';
|
|
15
|
+
import { KtNode } from '../node.js';
|
|
16
|
+
import { type KtAppendValue, writeKtNodes } from '../utils/write-kt-node.js';
|
|
17
|
+
|
|
18
|
+
type Injects = never;
|
|
19
|
+
|
|
20
|
+
type Options<TBuilder extends SourceBuilder, TInjects extends string = never> = AstNodeOptions<
|
|
21
|
+
typeof KtNode<TBuilder, TInjects | Injects>,
|
|
22
|
+
{
|
|
23
|
+
tag: string;
|
|
24
|
+
args?: Nullable<Nullable<BasicAppendValue<TBuilder>>[]>;
|
|
25
|
+
description?: Nullable<BasicAppendValue<TBuilder>>;
|
|
26
|
+
}
|
|
27
|
+
>;
|
|
28
|
+
|
|
29
|
+
export class KtDocTag<TBuilder extends SourceBuilder, TInjects extends string = never> extends KtNode<
|
|
30
|
+
TBuilder,
|
|
31
|
+
TInjects | Injects
|
|
32
|
+
> {
|
|
33
|
+
public tag: string;
|
|
34
|
+
public args: BasicAppendValue<TBuilder>[];
|
|
35
|
+
public description: BasicAppendValue<TBuilder> | null;
|
|
36
|
+
|
|
37
|
+
constructor(options: Options<TBuilder, TInjects>) {
|
|
38
|
+
super(options);
|
|
39
|
+
this.tag = options.tag;
|
|
40
|
+
this.args = options.args?.filter(notNullish) ?? [];
|
|
41
|
+
this.description = options.description ?? null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected override onWrite(builder: TBuilder): void {
|
|
45
|
+
builder.append('@', this.tag);
|
|
46
|
+
this.args.forEach((a) => builder.append(' ', a));
|
|
47
|
+
if (this.description) builder.append(' ', this.description);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
type _KtDocTagOpt<TBuilder extends SourceBuilder> = Prettify<Omit<Options<TBuilder>, 'tag'>>;
|
|
52
|
+
|
|
53
|
+
type _KtDocTagArgsMap<TBuilder extends SourceBuilder> =
|
|
54
|
+
& {
|
|
55
|
+
suppress(options?: _KtDocTagOpt<TBuilder>): never;
|
|
56
|
+
}
|
|
57
|
+
& {
|
|
58
|
+
[K in 'return' | 'constructor' | 'receiver' | 'author' | 'since']: (
|
|
59
|
+
description: BasicAppendValue<TBuilder>,
|
|
60
|
+
options?: _KtDocTagOpt<TBuilder>,
|
|
61
|
+
) => never;
|
|
62
|
+
}
|
|
63
|
+
& {
|
|
64
|
+
[K in 'param' | 'property']: (
|
|
65
|
+
name: string,
|
|
66
|
+
description: BasicAppendValue<TBuilder>,
|
|
67
|
+
options?: _KtDocTagOpt<TBuilder>,
|
|
68
|
+
) => never;
|
|
69
|
+
}
|
|
70
|
+
& {
|
|
71
|
+
[K in 'see' | 'sample']: (identifier: string, options?: _KtDocTagOpt<TBuilder>) => never;
|
|
72
|
+
}
|
|
73
|
+
& {
|
|
74
|
+
[K in 'throws' | 'exception']: (
|
|
75
|
+
$class: BasicAppendValue<TBuilder>,
|
|
76
|
+
description: BasicAppendValue<TBuilder>,
|
|
77
|
+
options?: _KtDocTagOpt<TBuilder>,
|
|
78
|
+
) => never;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const tagsWithDescription = [
|
|
82
|
+
'return',
|
|
83
|
+
'constructor',
|
|
84
|
+
'receiver',
|
|
85
|
+
'author',
|
|
86
|
+
'since',
|
|
87
|
+
'param',
|
|
88
|
+
'property',
|
|
89
|
+
'throws',
|
|
90
|
+
'exception',
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
type _KtDocTagArgs<
|
|
94
|
+
TTagName extends StringSuggestions<keyof _KtDocTagArgsMap<TBuilder>>,
|
|
95
|
+
TBuilder extends SourceBuilder,
|
|
96
|
+
> = TTagName extends keyof _KtDocTagArgsMap<TBuilder>
|
|
97
|
+
// deno-lint-ignore no-explicit-any
|
|
98
|
+
? _KtDocTagArgsMap<TBuilder>[TTagName] extends (...args: any[]) => any
|
|
99
|
+
? ParametersWithOverloads<_KtDocTagArgsMap<TBuilder>[TTagName]>
|
|
100
|
+
: never
|
|
101
|
+
: [options?: _KtDocTagOpt<TBuilder>];
|
|
102
|
+
|
|
103
|
+
function createDocTag<
|
|
104
|
+
TTagName extends StringSuggestions<keyof _KtDocTagArgsMap<TBuilder>>,
|
|
105
|
+
TBuilder extends SourceBuilder,
|
|
106
|
+
>(tag: TTagName, ...args: _KtDocTagArgs<TTagName, TBuilder>): KtDocTag<TBuilder>;
|
|
107
|
+
function createDocTag<TBuilder extends SourceBuilder>(tag: string, ...args: unknown[]): KtDocTag<TBuilder> {
|
|
108
|
+
let opt: _KtDocTagOpt<TBuilder> = {};
|
|
109
|
+
if (args.length > 0) {
|
|
110
|
+
const lastArg = args[args.length - 1];
|
|
111
|
+
if (!isKotlinAppendValue(lastArg) && !!lastArg) {
|
|
112
|
+
opt = args.pop() as _KtDocTagOpt<TBuilder>;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const params = args as BasicAppendValue<TBuilder>[];
|
|
117
|
+
if (tagsWithDescription.includes(tag)) {
|
|
118
|
+
const description = params.pop();
|
|
119
|
+
if (opt.description && description) {
|
|
120
|
+
opt.description = basicAppendValueGroup<TBuilder>([description, opt.description], '\n');
|
|
121
|
+
} else if (description) {
|
|
122
|
+
opt.description = description;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return new KtDocTag({ ...opt, tag, args: params });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const writeDocTags = <TBuilder extends SourceBuilder>(
|
|
130
|
+
builder: TBuilder,
|
|
131
|
+
nodes: SingleOrMultiple<Nullable<KtAppendValue<TBuilder>>>,
|
|
132
|
+
): void => {
|
|
133
|
+
writeKtNodes(builder, nodes, { separator: '\n' });
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export const ktDocTag: typeof createDocTag & { write: typeof writeDocTags } = Object.assign(createDocTag, {
|
|
137
|
+
write: writeDocTags,
|
|
138
|
+
});
|