@typespec/emitter-framework 0.11.0-dev.1 → 0.11.0-dev.10
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/dist/src/core/components/index.js +2 -1
- package/dist/src/core/components/index.js.map +1 -0
- package/dist/src/core/components/output.js +2 -1
- package/dist/src/core/components/output.js.map +1 -0
- package/dist/src/core/components/overrides/component-overrides.js +2 -1
- package/dist/src/core/components/overrides/component-overrides.js.map +1 -0
- package/dist/src/core/components/overrides/config.js +2 -1
- package/dist/src/core/components/overrides/config.js.map +1 -0
- package/dist/src/core/components/overrides/context.js +2 -1
- package/dist/src/core/components/overrides/context.js.map +1 -0
- package/dist/src/core/context/index.js +2 -1
- package/dist/src/core/context/index.js.map +1 -0
- package/dist/src/core/context/name-policy-context.js +2 -1
- package/dist/src/core/context/name-policy-context.js.map +1 -0
- package/dist/src/core/context/tsp-context.js +2 -1
- package/dist/src/core/context/tsp-context.js.map +1 -0
- package/dist/src/core/index.js +2 -1
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/transport-name-policy.js +2 -1
- package/dist/src/core/transport-name-policy.js.map +1 -0
- package/dist/src/core/write-output.d.ts.map +1 -1
- package/dist/src/core/write-output.js +4 -3
- package/dist/src/core/write-output.js.map +1 -0
- package/dist/src/csharp/components/class/declaration.d.ts +1 -1
- package/dist/src/csharp/components/class/declaration.d.ts.map +1 -1
- package/dist/src/csharp/components/class/declaration.js +14 -5
- package/dist/src/csharp/components/class/declaration.js.map +1 -0
- package/dist/src/csharp/components/class/declaration.test.js +65 -105
- package/dist/src/csharp/components/class/declaration.test.js.map +1 -0
- package/dist/src/csharp/components/enum/declaration.js +2 -1
- package/dist/src/csharp/components/enum/declaration.js.map +1 -0
- package/dist/src/csharp/components/enum/declaration.test.js +52 -88
- package/dist/src/csharp/components/enum/declaration.test.js.map +1 -0
- package/dist/src/csharp/components/index.js +2 -1
- package/dist/src/csharp/components/index.js.map +1 -0
- package/dist/src/csharp/components/property/property.d.ts.map +1 -1
- package/dist/src/csharp/components/property/property.js +40 -14
- package/dist/src/csharp/components/property/property.js.map +1 -0
- package/dist/src/csharp/components/property/property.test.js +129 -29
- package/dist/src/csharp/components/property/property.test.js.map +1 -0
- package/dist/src/csharp/components/type-expression.d.ts.map +1 -1
- package/dist/src/csharp/components/type-expression.js +22 -3
- package/dist/src/csharp/components/type-expression.js.map +1 -0
- package/dist/src/csharp/components/type-expression.test.js +87 -54
- package/dist/src/csharp/components/type-expression.test.js.map +1 -0
- package/dist/src/csharp/components/utils/doc-comments.js +2 -1
- package/dist/src/csharp/components/utils/doc-comments.js.map +1 -0
- package/dist/src/csharp/components/utils/nullable-util.d.ts +4 -0
- package/dist/src/csharp/components/utils/nullable-util.d.ts.map +1 -0
- package/dist/src/csharp/components/utils/nullable-util.js +27 -0
- package/dist/src/csharp/components/utils/nullable-util.js.map +1 -0
- package/dist/src/csharp/components/utils/refkey.js +2 -1
- package/dist/src/csharp/components/utils/refkey.js.map +1 -0
- package/dist/src/csharp/index.js +2 -1
- package/dist/src/csharp/index.js.map +1 -0
- package/dist/src/lib.js +2 -1
- package/dist/src/lib.js.map +1 -0
- package/dist/src/testing/index.js +2 -1
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/scenario-test/code-block-expectation.js +2 -1
- package/dist/src/testing/scenario-test/code-block-expectation.js.map +1 -0
- package/dist/src/testing/scenario-test/code-block-expectation.test.js +2 -1
- package/dist/src/testing/scenario-test/code-block-expectation.test.js.map +1 -0
- package/dist/src/testing/scenario-test/harness.js +2 -1
- package/dist/src/testing/scenario-test/harness.js.map +1 -0
- package/dist/src/testing/scenario-test/index.js +2 -1
- package/dist/src/testing/scenario-test/index.js.map +1 -0
- package/dist/src/testing/scenario-test/snippet-extractor.js +2 -1
- package/dist/src/testing/scenario-test/snippet-extractor.js.map +1 -0
- package/dist/src/typescript/components/array-expression.js +2 -1
- package/dist/src/typescript/components/array-expression.js.map +1 -0
- package/dist/src/typescript/components/arrow-function.js +2 -1
- package/dist/src/typescript/components/arrow-function.js.map +1 -0
- package/dist/src/typescript/components/class-method.js +2 -1
- package/dist/src/typescript/components/class-method.js.map +1 -0
- package/dist/src/typescript/components/enum-declaration.js +2 -1
- package/dist/src/typescript/components/enum-declaration.js.map +1 -0
- package/dist/src/typescript/components/function-declaration.js +2 -1
- package/dist/src/typescript/components/function-declaration.js.map +1 -0
- package/dist/src/typescript/components/function-expression.js +2 -1
- package/dist/src/typescript/components/function-expression.js.map +1 -0
- package/dist/src/typescript/components/function-type.js +2 -1
- package/dist/src/typescript/components/function-type.js.map +1 -0
- package/dist/src/typescript/components/index.js +2 -1
- package/dist/src/typescript/components/index.js.map +1 -0
- package/dist/src/typescript/components/interface-declaration.js +2 -1
- package/dist/src/typescript/components/interface-declaration.js.map +1 -0
- package/dist/src/typescript/components/interface-member.js +2 -1
- package/dist/src/typescript/components/interface-member.js.map +1 -0
- package/dist/src/typescript/components/interface-method.js +2 -1
- package/dist/src/typescript/components/interface-method.js.map +1 -0
- package/dist/src/typescript/components/record-expression.js +2 -1
- package/dist/src/typescript/components/record-expression.js.map +1 -0
- package/dist/src/typescript/components/static-serializers.js +2 -1
- package/dist/src/typescript/components/static-serializers.js.map +1 -0
- package/dist/src/typescript/components/type-alias-declaration.js +2 -1
- package/dist/src/typescript/components/type-alias-declaration.js.map +1 -0
- package/dist/src/typescript/components/type-declaration.js +2 -1
- package/dist/src/typescript/components/type-declaration.js.map +1 -0
- package/dist/src/typescript/components/type-expression.js +2 -1
- package/dist/src/typescript/components/type-expression.js.map +1 -0
- package/dist/src/typescript/components/type-transform.js +2 -1
- package/dist/src/typescript/components/type-transform.js.map +1 -0
- package/dist/src/typescript/components/union/declaration.js +2 -1
- package/dist/src/typescript/components/union/declaration.js.map +1 -0
- package/dist/src/typescript/components/union/declaration.test.js +2 -1
- package/dist/src/typescript/components/union/declaration.test.js.map +1 -0
- package/dist/src/typescript/components/union/expression.js +2 -1
- package/dist/src/typescript/components/union/expression.js.map +1 -0
- package/dist/src/typescript/components/union/expression.test.js +2 -1
- package/dist/src/typescript/components/union/expression.test.js.map +1 -0
- package/dist/src/typescript/components/value-expression.js +2 -1
- package/dist/src/typescript/components/value-expression.js.map +1 -0
- package/dist/src/typescript/index.js +2 -1
- package/dist/src/typescript/index.js.map +1 -0
- package/dist/src/typescript/lib.js +2 -1
- package/dist/src/typescript/lib.js.map +1 -0
- package/dist/src/typescript/utils/index.js +2 -1
- package/dist/src/typescript/utils/index.js.map +1 -0
- package/dist/src/typescript/utils/operation.js +2 -1
- package/dist/src/typescript/utils/operation.js.map +1 -0
- package/dist/src/typescript/utils/refkey.js +2 -1
- package/dist/src/typescript/utils/refkey.js.map +1 -0
- package/dist/test/test-host.js +2 -1
- package/dist/test/test-host.js.map +1 -0
- package/dist/test/testing/snippet-extractor-csharp.test.js +2 -1
- package/dist/test/testing/snippet-extractor-csharp.test.js.map +1 -0
- package/dist/test/testing/snippet-extractor-java.test.js +2 -1
- package/dist/test/testing/snippet-extractor-java.test.js.map +1 -0
- package/dist/test/testing/snippet-extractor-python.test.js +2 -1
- package/dist/test/testing/snippet-extractor-python.test.js.map +1 -0
- package/dist/test/testing/snippet-extractor-typescript.test.js +2 -1
- package/dist/test/testing/snippet-extractor-typescript.test.js.map +1 -0
- package/dist/test/typescript/components/arrow-function.test.js +18 -22
- package/dist/test/typescript/components/arrow-function.test.js.map +1 -0
- package/dist/test/typescript/components/component-override.test.js +3 -2
- package/dist/test/typescript/components/component-override.test.js.map +1 -0
- package/dist/test/typescript/components/enum-declaration.test.js +2 -1
- package/dist/test/typescript/components/enum-declaration.test.js.map +1 -0
- package/dist/test/typescript/components/function-declaration.test.js +3 -2
- package/dist/test/typescript/components/function-declaration.test.js.map +1 -0
- package/dist/test/typescript/components/function-expression.test.js +18 -22
- package/dist/test/typescript/components/function-expression.test.js.map +1 -0
- package/dist/test/typescript/components/function-type.test.js +18 -22
- package/dist/test/typescript/components/function-type.test.js.map +1 -0
- package/dist/test/typescript/components/interface-declaration.test.js +3 -2
- package/dist/test/typescript/components/interface-declaration.test.js.map +1 -0
- package/dist/test/typescript/components/interface-method.test.js +37 -45
- package/dist/test/typescript/components/interface-method.test.js.map +1 -0
- package/dist/test/typescript/components/member-expression.test.js +2 -1
- package/dist/test/typescript/components/member-expression.test.js.map +1 -0
- package/dist/test/typescript/components/type-alias-declaration.test.js +8 -5
- package/dist/test/typescript/components/type-alias-declaration.test.js.map +1 -0
- package/dist/test/typescript/components/type-transform.test.js +29 -27
- package/dist/test/typescript/components/type-transform.test.js.map +1 -0
- package/dist/test/typescript/components/value-expression.test.js +3 -2
- package/dist/test/typescript/components/value-expression.test.js.map +1 -0
- package/dist/test/typescript/utils.js +2 -1
- package/dist/test/typescript/utils.js.map +1 -0
- package/dist/test/utils.d.ts +1 -0
- package/dist/test/utils.d.ts.map +1 -1
- package/dist/test/utils.js +13 -3
- package/dist/test/utils.js.map +1 -0
- package/dist/test/vitest.setup.js +2 -1
- package/dist/test/vitest.setup.js.map +1 -0
- package/package.json +8 -8
- package/src/core/write-output.ts +2 -2
- package/src/csharp/components/class/declaration.test.tsx +64 -102
- package/src/csharp/components/class/declaration.tsx +13 -3
- package/src/csharp/components/enum/declaration.test.tsx +47 -78
- package/src/csharp/components/property/property.test.tsx +108 -25
- package/src/csharp/components/property/property.tsx +43 -11
- package/src/csharp/components/type-expression.test.tsx +84 -69
- package/src/csharp/components/type-expression.tsx +25 -4
- package/src/csharp/components/utils/nullable-util.ts +25 -0
- package/test/typescript/components/arrow-function.test.tsx +23 -42
- package/test/typescript/components/component-override.test.tsx +1 -1
- package/test/typescript/components/function-declaration.test.tsx +2 -1
- package/test/typescript/components/function-expression.test.tsx +23 -42
- package/test/typescript/components/function-type.test.tsx +22 -40
- package/test/typescript/components/interface-declaration.test.tsx +1 -1
- package/test/typescript/components/interface-method.test.tsx +50 -92
- package/test/typescript/components/type-alias-declaration.test.tsx +8 -6
- package/test/typescript/components/type-transform.test.tsx +37 -37
- package/test/typescript/components/value-expression.test.tsx +1 -1
- package/test/utils.ts +10 -3
- package/dist/test/typescript/test-host.d.ts +0 -12
- package/dist/test/typescript/test-host.d.ts.map +0 -1
- package/dist/test/typescript/test-host.js +0 -29
- package/test/typescript/test-host.ts +0 -37
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type Children
|
|
1
|
+
import { For, type Children } from "@alloy-js/core";
|
|
2
2
|
import * as cs from "@alloy-js/csharp";
|
|
3
3
|
import { Method } from "@alloy-js/csharp";
|
|
4
|
-
import type
|
|
4
|
+
import { isVoidType, type Interface, type Model } from "@typespec/compiler";
|
|
5
5
|
import { useTsp } from "../../../core/index.js";
|
|
6
6
|
import { Property } from "../property/property.jsx";
|
|
7
7
|
import { TypeExpression } from "../type-expression.jsx";
|
|
@@ -41,6 +41,12 @@ export function ClassDeclaration(props: ClassDeclarationProps): Children {
|
|
|
41
41
|
{...props}
|
|
42
42
|
name={className}
|
|
43
43
|
refkey={refkeys}
|
|
44
|
+
baseType={
|
|
45
|
+
props.baseType ??
|
|
46
|
+
(props.type.kind === "Model" && props.type.baseModel ? (
|
|
47
|
+
<TypeExpression type={props.type.baseModel} />
|
|
48
|
+
) : undefined)
|
|
49
|
+
}
|
|
44
50
|
doc={getDocComments($, props.type)}
|
|
45
51
|
>
|
|
46
52
|
{props.type.kind === "Model" && (
|
|
@@ -53,8 +59,12 @@ export function ClassDeclaration(props: ClassDeclarationProps): Children {
|
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
function ClassProperties(props: ClassPropertiesProps): Children {
|
|
62
|
+
// Ignore 'void' type properties which is not valid in csharp
|
|
63
|
+
const properties = Array.from(props.type.properties.entries()).filter(
|
|
64
|
+
([_, p]) => !isVoidType(p.type),
|
|
65
|
+
);
|
|
56
66
|
return (
|
|
57
|
-
<For each={
|
|
67
|
+
<For each={properties} doubleHardline>
|
|
58
68
|
{([name, property]) => <Property type={property} jsonAttributes={props.jsonAttributes} />}
|
|
59
69
|
</For>
|
|
60
70
|
);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tester } from "#test/test-host.js";
|
|
2
2
|
import { type Children } from "@alloy-js/core";
|
|
3
|
-
import { createCSharpNamePolicy,
|
|
3
|
+
import { createCSharpNamePolicy, SourceFile } from "@alloy-js/csharp";
|
|
4
4
|
import { t, type TesterInstance } from "@typespec/compiler/testing";
|
|
5
5
|
import { beforeEach, expect, it } from "vitest";
|
|
6
6
|
import { Output } from "../../../core/index.js";
|
|
@@ -16,9 +16,7 @@ function Wrapper(props: { children: Children }) {
|
|
|
16
16
|
const policy = createCSharpNamePolicy();
|
|
17
17
|
return (
|
|
18
18
|
<Output program={runner.program} namePolicy={policy}>
|
|
19
|
-
<
|
|
20
|
-
<SourceFile path="test.cs">{props.children}</SourceFile>
|
|
21
|
-
</Namespace>
|
|
19
|
+
<SourceFile path="test.cs">{props.children}</SourceFile>
|
|
22
20
|
</Output>
|
|
23
21
|
);
|
|
24
22
|
}
|
|
@@ -37,14 +35,11 @@ it("renders a basic enum declaration", async () => {
|
|
|
37
35
|
<EnumDeclaration type={TestEnum} />
|
|
38
36
|
</Wrapper>,
|
|
39
37
|
).toRenderTo(`
|
|
40
|
-
|
|
38
|
+
enum TestEnum
|
|
41
39
|
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Value2,
|
|
46
|
-
Value3
|
|
47
|
-
}
|
|
40
|
+
Value1,
|
|
41
|
+
Value2,
|
|
42
|
+
Value3
|
|
48
43
|
}
|
|
49
44
|
`);
|
|
50
45
|
});
|
|
@@ -59,12 +54,9 @@ it("renders an empty enum declaration", async () => {
|
|
|
59
54
|
<EnumDeclaration type={TestEnum} />
|
|
60
55
|
</Wrapper>,
|
|
61
56
|
).toRenderTo(`
|
|
62
|
-
|
|
57
|
+
enum TestEnum
|
|
63
58
|
{
|
|
64
|
-
enum TestEnum
|
|
65
|
-
{
|
|
66
59
|
|
|
67
|
-
}
|
|
68
60
|
}
|
|
69
61
|
`);
|
|
70
62
|
});
|
|
@@ -82,13 +74,10 @@ it("can override enum name", async () => {
|
|
|
82
74
|
<EnumDeclaration type={TestEnum} name="CustomEnumName" />
|
|
83
75
|
</Wrapper>,
|
|
84
76
|
).toRenderTo(`
|
|
85
|
-
|
|
77
|
+
enum CustomEnumName
|
|
86
78
|
{
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
Value1,
|
|
90
|
-
Value2
|
|
91
|
-
}
|
|
79
|
+
Value1,
|
|
80
|
+
Value2
|
|
92
81
|
}
|
|
93
82
|
`);
|
|
94
83
|
});
|
|
@@ -106,13 +95,10 @@ it("renders an enum with access modifiers", async () => {
|
|
|
106
95
|
<EnumDeclaration type={TestEnum} internal />
|
|
107
96
|
</Wrapper>,
|
|
108
97
|
).toRenderTo(`
|
|
109
|
-
|
|
98
|
+
internal enum TestEnum
|
|
110
99
|
{
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
Value1,
|
|
114
|
-
Value2
|
|
115
|
-
}
|
|
100
|
+
Value1,
|
|
101
|
+
Value2
|
|
116
102
|
}
|
|
117
103
|
`);
|
|
118
104
|
});
|
|
@@ -128,21 +114,16 @@ it("renders enum with C# naming conventions", async () => {
|
|
|
128
114
|
|
|
129
115
|
expect(
|
|
130
116
|
<Output program={runner.program} namePolicy={createCSharpNamePolicy()}>
|
|
131
|
-
<
|
|
132
|
-
<
|
|
133
|
-
|
|
134
|
-
</SourceFile>
|
|
135
|
-
</Namespace>
|
|
117
|
+
<SourceFile path="test.cs">
|
|
118
|
+
<EnumDeclaration type={TestEnum} />
|
|
119
|
+
</SourceFile>
|
|
136
120
|
</Output>,
|
|
137
121
|
).toRenderTo(`
|
|
138
|
-
|
|
122
|
+
enum TestEnum
|
|
139
123
|
{
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
ValueTwo,
|
|
144
|
-
ValueThree
|
|
145
|
-
}
|
|
124
|
+
ValueOne,
|
|
125
|
+
ValueTwo,
|
|
126
|
+
ValueThree
|
|
146
127
|
}
|
|
147
128
|
`);
|
|
148
129
|
});
|
|
@@ -159,13 +140,10 @@ it("renders enum with single value", async () => {
|
|
|
159
140
|
<EnumDeclaration type={TestEnum} />
|
|
160
141
|
</Wrapper>,
|
|
161
142
|
).toRenderTo(`
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
OnlyValue
|
|
167
|
-
}
|
|
168
|
-
}
|
|
143
|
+
enum TestEnum
|
|
144
|
+
{
|
|
145
|
+
OnlyValue
|
|
146
|
+
}
|
|
169
147
|
`);
|
|
170
148
|
});
|
|
171
149
|
|
|
@@ -184,15 +162,12 @@ it("renders enum with numeric-like member names", async () => {
|
|
|
184
162
|
<EnumDeclaration type={TestEnum} />
|
|
185
163
|
</Wrapper>,
|
|
186
164
|
).toRenderTo(`
|
|
187
|
-
|
|
165
|
+
enum TestEnum
|
|
188
166
|
{
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
Value10,
|
|
194
|
-
Value100
|
|
195
|
-
}
|
|
167
|
+
Value0,
|
|
168
|
+
Value1,
|
|
169
|
+
Value10,
|
|
170
|
+
Value100
|
|
196
171
|
}
|
|
197
172
|
`);
|
|
198
173
|
});
|
|
@@ -217,19 +192,16 @@ it("renders multiple enums in the same namespace", async () => {
|
|
|
217
192
|
<EnumDeclaration type={TestEnum2} />
|
|
218
193
|
</Wrapper>,
|
|
219
194
|
).toRenderTo(`
|
|
220
|
-
|
|
195
|
+
enum TestEnum1
|
|
196
|
+
{
|
|
197
|
+
Value1,
|
|
198
|
+
Value2
|
|
199
|
+
}
|
|
200
|
+
enum TestEnum2
|
|
221
201
|
{
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
Value2
|
|
226
|
-
}
|
|
227
|
-
enum TestEnum2
|
|
228
|
-
{
|
|
229
|
-
OptionA,
|
|
230
|
-
OptionB,
|
|
231
|
-
OptionC
|
|
232
|
-
}
|
|
202
|
+
OptionA,
|
|
203
|
+
OptionB,
|
|
204
|
+
OptionC
|
|
233
205
|
}
|
|
234
206
|
`);
|
|
235
207
|
});
|
|
@@ -249,19 +221,16 @@ it("renders an enum with doc comments", async () => {
|
|
|
249
221
|
<EnumDeclaration type={TestEnum} />
|
|
250
222
|
</Wrapper>,
|
|
251
223
|
).toRenderTo(`
|
|
252
|
-
|
|
224
|
+
enum TestEnum
|
|
253
225
|
{
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
/// </summary>
|
|
263
|
-
Value2
|
|
264
|
-
}
|
|
226
|
+
/// <summary>
|
|
227
|
+
/// This is value one
|
|
228
|
+
/// </summary>
|
|
229
|
+
Value1,
|
|
230
|
+
/// <summary>
|
|
231
|
+
/// This is value two
|
|
232
|
+
/// </summary>
|
|
233
|
+
Value2
|
|
265
234
|
}
|
|
266
235
|
`);
|
|
267
236
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tester } from "#test/test-host.js";
|
|
2
|
-
import { type Children } from "@alloy-js/core";
|
|
3
|
-
import { ClassDeclaration, createCSharpNamePolicy,
|
|
2
|
+
import { List, type Children } from "@alloy-js/core";
|
|
3
|
+
import { ClassDeclaration, createCSharpNamePolicy, SourceFile } from "@alloy-js/csharp";
|
|
4
4
|
import { t, type TesterInstance } from "@typespec/compiler/testing";
|
|
5
5
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
6
6
|
import { Output } from "../../../core/components/output.jsx";
|
|
@@ -16,11 +16,9 @@ function Wrapper(props: { children: Children }) {
|
|
|
16
16
|
const policy = createCSharpNamePolicy();
|
|
17
17
|
return (
|
|
18
18
|
<Output program={tester.program} namePolicy={policy}>
|
|
19
|
-
<
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
</SourceFile>
|
|
23
|
-
</Namespace>
|
|
19
|
+
<SourceFile path="test.cs">
|
|
20
|
+
<ClassDeclaration name="Test">{props.children}</ClassDeclaration>
|
|
21
|
+
</SourceFile>
|
|
24
22
|
</Output>
|
|
25
23
|
);
|
|
26
24
|
}
|
|
@@ -37,12 +35,47 @@ it("maps prop: string | null to nullable property", async () => {
|
|
|
37
35
|
<Property type={prop1} />
|
|
38
36
|
</Wrapper>,
|
|
39
37
|
).toRenderTo(`
|
|
40
|
-
|
|
38
|
+
class Test
|
|
41
39
|
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
public required string? Prop1 { get; set; }
|
|
41
|
+
}
|
|
42
|
+
`);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("maps optional properties to nullable properties", async () => {
|
|
46
|
+
const { prop1 } = await tester.compile(t.code`
|
|
47
|
+
model TestModel {
|
|
48
|
+
${t.modelProperty("prop1")}?: string;
|
|
49
|
+
}
|
|
50
|
+
`);
|
|
51
|
+
|
|
52
|
+
expect(
|
|
53
|
+
<Wrapper>
|
|
54
|
+
<Property type={prop1} />
|
|
55
|
+
</Wrapper>,
|
|
56
|
+
).toRenderTo(`
|
|
57
|
+
class Test
|
|
58
|
+
{
|
|
59
|
+
public string? Prop1 { get; set; }
|
|
60
|
+
}
|
|
61
|
+
`);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("maps optional and nullable properties to nullable properties", async () => {
|
|
65
|
+
const { prop1 } = await tester.compile(t.code`
|
|
66
|
+
model TestModel {
|
|
67
|
+
${t.modelProperty("prop1")}?: string | null;
|
|
68
|
+
}
|
|
69
|
+
`);
|
|
70
|
+
|
|
71
|
+
expect(
|
|
72
|
+
<Wrapper>
|
|
73
|
+
<Property type={prop1} />
|
|
74
|
+
</Wrapper>,
|
|
75
|
+
).toRenderTo(`
|
|
76
|
+
class Test
|
|
77
|
+
{
|
|
78
|
+
public string? Prop1 { get; set; }
|
|
46
79
|
}
|
|
47
80
|
`);
|
|
48
81
|
});
|
|
@@ -60,13 +93,10 @@ describe("jsonAttributes", () => {
|
|
|
60
93
|
<Property type={prop1} jsonAttributes />
|
|
61
94
|
</Wrapper>,
|
|
62
95
|
).toRenderTo(`
|
|
63
|
-
|
|
96
|
+
class Test
|
|
64
97
|
{
|
|
65
|
-
|
|
66
|
-
{
|
|
67
|
-
[System.Text.Json.JsonPropertyName("prop1")]
|
|
68
|
-
public required string Prop1 { get; set; }
|
|
69
|
-
}
|
|
98
|
+
[System.Text.Json.JsonPropertyName("prop1")]
|
|
99
|
+
public required string Prop1 { get; set; }
|
|
70
100
|
}
|
|
71
101
|
`);
|
|
72
102
|
});
|
|
@@ -84,14 +114,67 @@ describe("jsonAttributes", () => {
|
|
|
84
114
|
<Property type={prop1} jsonAttributes />
|
|
85
115
|
</Wrapper>,
|
|
86
116
|
).toRenderTo(`
|
|
87
|
-
|
|
117
|
+
class Test
|
|
118
|
+
{
|
|
119
|
+
[System.Text.Json.JsonPropertyName("prop_1")]
|
|
120
|
+
public required string Prop1 { get; set; }
|
|
121
|
+
}
|
|
122
|
+
`);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("inherit prop: override, new", async () => {
|
|
126
|
+
const r = await tester.compile(t.code`
|
|
127
|
+
model TestModel extends BaseModel {
|
|
128
|
+
${t.modelProperty("prop1")}: string;
|
|
129
|
+
${t.modelProperty("prop2")}: string | null;
|
|
130
|
+
}
|
|
131
|
+
model BaseModel {
|
|
132
|
+
prop1: string | null;
|
|
133
|
+
prop2: string | null;
|
|
134
|
+
}
|
|
135
|
+
`);
|
|
136
|
+
|
|
137
|
+
expect(
|
|
138
|
+
<Wrapper>
|
|
139
|
+
<List>
|
|
140
|
+
<Property type={r.prop1} />
|
|
141
|
+
<Property type={r.prop2} />
|
|
142
|
+
</List>
|
|
143
|
+
</Wrapper>,
|
|
144
|
+
).toRenderTo(`
|
|
145
|
+
class Test
|
|
88
146
|
{
|
|
89
|
-
|
|
90
|
-
{
|
|
91
|
-
[System.Text.Json.JsonPropertyName("prop_1")]
|
|
92
|
-
public required string Prop1 { get; set; }
|
|
93
|
-
}
|
|
147
|
+
public new required string Prop1 { get; set; }
|
|
148
|
+
public override required string? Prop2 { get; set; }
|
|
94
149
|
}
|
|
95
|
-
|
|
150
|
+
`);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("inherit prop: virtual", async () => {
|
|
154
|
+
const r = await tester.compile(t.code`
|
|
155
|
+
model TestModel extends BaseModel {
|
|
156
|
+
prop1: string;
|
|
157
|
+
prop2: string | null;
|
|
158
|
+
}
|
|
159
|
+
model BaseModel {
|
|
160
|
+
${t.modelProperty("prop1")}: string | null;
|
|
161
|
+
${t.modelProperty("prop2")}: string | null;
|
|
162
|
+
}
|
|
163
|
+
`);
|
|
164
|
+
|
|
165
|
+
expect(
|
|
166
|
+
<Wrapper>
|
|
167
|
+
<List>
|
|
168
|
+
<Property type={r.prop1} />
|
|
169
|
+
<Property type={r.prop2} />
|
|
170
|
+
</List>
|
|
171
|
+
</Wrapper>,
|
|
172
|
+
).toRenderTo(`
|
|
173
|
+
class Test
|
|
174
|
+
{
|
|
175
|
+
public required string? Prop1 { get; set; }
|
|
176
|
+
public virtual required string? Prop2 { get; set; }
|
|
177
|
+
}
|
|
178
|
+
`);
|
|
96
179
|
});
|
|
97
180
|
});
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type Children } from "@alloy-js/core";
|
|
2
2
|
import * as cs from "@alloy-js/csharp";
|
|
3
3
|
import { Attribute } from "@alloy-js/csharp";
|
|
4
|
-
import { type ModelProperty, resolveEncodedName, type Type } from "@typespec/compiler";
|
|
4
|
+
import { getProperty, type ModelProperty, resolveEncodedName, type Type } from "@typespec/compiler";
|
|
5
5
|
import { useTsp } from "../../../core/index.js";
|
|
6
6
|
import { TypeExpression } from "../type-expression.jsx";
|
|
7
7
|
import { getDocComments } from "../utils/doc-comments.jsx";
|
|
8
|
+
import { getNullableUnionInnerType } from "../utils/nullable-util.js";
|
|
8
9
|
|
|
9
10
|
export interface PropertyProps {
|
|
10
11
|
type: ModelProperty;
|
|
@@ -16,14 +17,47 @@ export interface PropertyProps {
|
|
|
16
17
|
* Create a C# property declaration from a TypeSpec property type.
|
|
17
18
|
*/
|
|
18
19
|
export function Property(props: PropertyProps): Children {
|
|
19
|
-
const result = preprocessPropertyType(props.type
|
|
20
|
+
const result = preprocessPropertyType(props.type);
|
|
20
21
|
const { $ } = useTsp();
|
|
21
22
|
|
|
23
|
+
let overrideType: "" | "override" | "new" = "";
|
|
24
|
+
let isVirtual = false;
|
|
25
|
+
if (props.type.model) {
|
|
26
|
+
if (props.type.model.baseModel) {
|
|
27
|
+
const base = props.type.model.baseModel;
|
|
28
|
+
const baseProperty = getProperty(base, props.type.name);
|
|
29
|
+
if (baseProperty) {
|
|
30
|
+
const baseResult = preprocessPropertyType(baseProperty);
|
|
31
|
+
if (baseResult.nullable === result.nullable && baseResult.type === result.type) {
|
|
32
|
+
overrideType = "override";
|
|
33
|
+
} else {
|
|
34
|
+
overrideType = "new";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (
|
|
39
|
+
overrideType === "" &&
|
|
40
|
+
props.type.model.derivedModels &&
|
|
41
|
+
props.type.model.derivedModels.length > 0
|
|
42
|
+
) {
|
|
43
|
+
isVirtual = props.type.model.derivedModels.some((derived) => {
|
|
44
|
+
const derivedProperty = derived.properties.get(props.type.name);
|
|
45
|
+
if (derivedProperty) {
|
|
46
|
+
const derivedResult = preprocessPropertyType(derivedProperty);
|
|
47
|
+
return derivedResult.nullable === result.nullable && derivedResult.type === result.type;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
22
53
|
return (
|
|
23
54
|
<cs.Property
|
|
24
55
|
name={props.type.name}
|
|
25
56
|
type={<TypeExpression type={result.type} />}
|
|
57
|
+
override={overrideType === "override"}
|
|
58
|
+
new={overrideType === "new"}
|
|
26
59
|
public
|
|
60
|
+
virtual={isVirtual}
|
|
27
61
|
required={!props.type.optional}
|
|
28
62
|
nullable={result.nullable}
|
|
29
63
|
doc={getDocComments($, props.type)}
|
|
@@ -44,19 +78,17 @@ function JsonNameAttribute(props: JsonNameAttributeProps): Children {
|
|
|
44
78
|
return <Attribute name="System.Text.Json.JsonPropertyName" args={[JSON.stringify(jsonName)]} />;
|
|
45
79
|
}
|
|
46
80
|
|
|
47
|
-
function preprocessPropertyType(
|
|
48
|
-
const
|
|
81
|
+
function preprocessPropertyType(prop: ModelProperty): { type: Type; nullable: boolean } {
|
|
82
|
+
const type = prop.type;
|
|
49
83
|
|
|
50
84
|
if (type.kind === "Union") {
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (nonNullVariant && nullVariant && variants.size === 2) {
|
|
55
|
-
return { type: nonNullVariant.type, nullable: true };
|
|
85
|
+
const innerType = getNullableUnionInnerType(type);
|
|
86
|
+
if (innerType) {
|
|
87
|
+
return { type: innerType, nullable: true };
|
|
56
88
|
} else {
|
|
57
|
-
return { type, nullable:
|
|
89
|
+
return { type, nullable: prop.optional };
|
|
58
90
|
}
|
|
59
91
|
} else {
|
|
60
|
-
return { type, nullable:
|
|
92
|
+
return { type, nullable: prop.optional };
|
|
61
93
|
}
|
|
62
94
|
}
|