@alloy-js/csharp 0.21.0-dev.17 → 0.21.0-dev.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/src/components/access-expression/access-expression.d.ts +5 -0
  2. package/dist/src/components/access-expression/access-expression.d.ts.map +1 -1
  3. package/dist/src/components/access-expression/access-expression.js.map +1 -1
  4. package/dist/src/components/access-expression/part-descriptors.d.ts +8 -0
  5. package/dist/src/components/access-expression/part-descriptors.d.ts.map +1 -1
  6. package/dist/src/components/access-expression/part-descriptors.js +22 -2
  7. package/dist/src/components/access-expression/part-descriptors.js.map +1 -1
  8. package/dist/src/components/attributes/attributes.d.ts +2 -6
  9. package/dist/src/components/attributes/attributes.d.ts.map +1 -1
  10. package/dist/src/components/attributes/attributes.js +15 -1
  11. package/dist/src/components/attributes/attributes.js.map +1 -1
  12. package/dist/src/components/attributes/attributes.test.js +54 -1
  13. package/dist/src/components/attributes/attributes.test.js.map +1 -1
  14. package/dist/src/components/parameters/parameters.d.ts +20 -0
  15. package/dist/src/components/parameters/parameters.d.ts.map +1 -1
  16. package/dist/src/components/parameters/parameters.js +8 -1
  17. package/dist/src/components/parameters/parameters.js.map +1 -1
  18. package/dist/src/components/parameters/parameters.test.js +31 -0
  19. package/dist/src/components/parameters/parameters.test.js.map +1 -1
  20. package/dist/src/contexts/reference-context.d.ts +12 -0
  21. package/dist/src/contexts/reference-context.d.ts.map +1 -0
  22. package/dist/src/contexts/reference-context.js +15 -0
  23. package/dist/src/contexts/reference-context.js.map +1 -0
  24. package/dist/src/create-library.d.ts.map +1 -1
  25. package/dist/src/create-library.js +7 -7
  26. package/dist/src/create-library.js.map +1 -1
  27. package/dist/src/symbols/reference.d.ts.map +1 -1
  28. package/dist/src/symbols/reference.js +4 -1
  29. package/dist/src/symbols/reference.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +1 -1
  32. package/src/components/access-expression/access-expression.tsx +6 -0
  33. package/src/components/access-expression/part-descriptors.ts +26 -2
  34. package/src/components/attributes/attributes.test.tsx +43 -1
  35. package/src/components/attributes/attributes.tsx +14 -7
  36. package/src/components/parameters/parameters.test.tsx +37 -0
  37. package/src/components/parameters/parameters.tsx +38 -0
  38. package/src/contexts/reference-context.ts +18 -0
  39. package/src/create-library.ts +24 -14
  40. package/src/symbols/reference.tsx +9 -1
  41. package/temp/api.json +142 -75
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alloy-js/csharp",
3
- "version": "0.21.0-dev.17",
3
+ "version": "0.21.0-dev.19",
4
4
  "description": "Alloy components for CSharp language.",
5
5
  "exports": {
6
6
  ".": {
@@ -122,6 +122,12 @@ export interface AccessExpressionPartProps {
122
122
  * you provide a symbol or refkey and the symbol's nullable flag is set.
123
123
  */
124
124
  nullable?: boolean;
125
+
126
+ /**
127
+ * Wether this part is an attribute reference (used in an attribute context).
128
+ * In that case the "Attribute" suffix is trimmed from the name if present.
129
+ */
130
+ attribute?: boolean;
125
131
  }
126
132
 
127
133
  AccessExpression.Part = function (props: AccessExpressionPartProps) {
@@ -128,9 +128,12 @@ function createPartDescriptorFromProps(
128
128
  } else if (first && partProps.refkey) {
129
129
  return partProps.refkey;
130
130
  } else if (partProps.id !== undefined) {
131
- return partProps.id;
131
+ return normalizeIfAttribute(partProps.id, partProps.attribute);
132
132
  } else if (symbolSource.value) {
133
- return escapeId(symbolSource.value.name);
133
+ return normalizeIfAttribute(
134
+ escapeId(symbolSource.value.name),
135
+ partProps.attribute,
136
+ );
134
137
  } else {
135
138
  return "<unresolved symbol>";
136
139
  }
@@ -173,3 +176,24 @@ function createPartDescriptorFromProps(
173
176
  function escapeId(id: string) {
174
177
  return id.replace(/"/g, '\\"');
175
178
  }
179
+
180
+ function normalizeIfAttribute(id: string, isAttribute?: boolean) {
181
+ if (isAttribute) {
182
+ return normalizeAttributeName(id);
183
+ }
184
+ return id;
185
+ }
186
+
187
+ /**
188
+ * Normalize attribute name by removing the "Attribute" suffix if present.
189
+ * @example
190
+ * ```ts
191
+ * normalizeAttributeName("TestAttribute") // returns "Test"
192
+ * ```
193
+ */
194
+ export function normalizeAttributeName(name: string) {
195
+ if (name !== undefined && name.endsWith("Attribute")) {
196
+ return name.substring(0, name.length - "Attribute".length);
197
+ }
198
+ return name;
199
+ }
@@ -1,4 +1,8 @@
1
- import { expect, it } from "vitest";
1
+ import { ClassDeclaration } from "#components/class/declaration.jsx";
2
+ import { createLibrary } from "#createLibrary";
3
+ import { TestNamespace } from "#test/utils.jsx";
4
+ import { List, namekey } from "@alloy-js/core";
5
+ import { describe, expect, it } from "vitest";
2
6
  import { Attribute, AttributeList } from "./attributes.jsx";
3
7
 
4
8
  it("define attribute", () => {
@@ -7,6 +11,44 @@ it("define attribute", () => {
7
11
  `);
8
12
  });
9
13
 
14
+ describe("Attribute suffix trimming", () => {
15
+ it("define attribute whose name ending with 'Attribute'", () => {
16
+ expect(<Attribute name="TestAttribute" />).toRenderTo(`
17
+ [Test]
18
+ `);
19
+ });
20
+
21
+ it("when using namekey", () => {
22
+ const key = namekey("TestAttribute");
23
+ expect(
24
+ <TestNamespace>
25
+ <List>
26
+ <Attribute name={key} />
27
+ <ClassDeclaration name={key} />
28
+ </List>
29
+ </TestNamespace>,
30
+ ).toRenderTo(`
31
+ [Test]
32
+ class TestAttribute;
33
+ `);
34
+ });
35
+
36
+ it("when referenced from library", () => {
37
+ const TestLib = createLibrary("TestLib", {
38
+ TestAttribute: { kind: "method", methodKind: "ordinary" },
39
+ });
40
+ expect(
41
+ <TestNamespace>
42
+ <Attribute name={TestLib.TestAttribute} />
43
+ </TestNamespace>,
44
+ ).toRenderTo(`
45
+ using TestLib;
46
+
47
+ [Test]
48
+ `);
49
+ });
50
+ });
51
+
10
52
  it("define attribute with single arg", () => {
11
53
  expect(<Attribute name="Test" args={[`"abc"`]} />).toRenderTo(`
12
54
  [Test("abc")]
@@ -1,15 +1,13 @@
1
+ import { normalizeAttributeName } from "#components/access-expression/part-descriptors.js";
1
2
  import {
2
3
  Children,
3
4
  findKeyedChildren,
4
5
  For,
5
6
  Indent,
7
+ Refkeyable,
6
8
  taggedComponent,
7
9
  } from "@alloy-js/core";
8
-
9
- export interface AttributeItem {
10
- name: string;
11
- args?: string[];
12
- }
10
+ import { ReferenceContext } from "../../contexts/reference-context.js";
13
11
 
14
12
  export type AttributesProp = Array<string | AttributeProps | Children>;
15
13
 
@@ -54,7 +52,7 @@ function renderAttribute(attr: string | AttributeProps | Children): Children {
54
52
 
55
53
  export interface AttributeProps {
56
54
  /** Attribute name */
57
- name: Children;
55
+ name: string | Refkeyable;
58
56
 
59
57
  /** Argument */
60
58
  args?: Children[];
@@ -81,7 +79,8 @@ export const Attribute = taggedComponent(
81
79
  (props: AttributeProps) => {
82
80
  return (
83
81
  <group>
84
- [{props.name}
82
+ [
83
+ <AttributeName name={props.name} />
85
84
  {props.args && props.args.length > 0 && (
86
85
  <>
87
86
  (
@@ -98,3 +97,11 @@ export const Attribute = taggedComponent(
98
97
  );
99
98
  },
100
99
  );
100
+
101
+ function AttributeName(props: Pick<AttributeProps, "name">) {
102
+ return typeof props.name === "string" ?
103
+ normalizeAttributeName(props.name)
104
+ : <ReferenceContext.Provider value={"attribute"}>
105
+ {props.name}
106
+ </ReferenceContext.Provider>;
107
+ }
@@ -148,3 +148,40 @@ it("can attach attributes", () => {
148
148
  }
149
149
  `);
150
150
  });
151
+
152
+ it("can add modifiers: in | out | ref", () => {
153
+ expect(
154
+ <Wrapper>
155
+ <Method
156
+ name="MethodOne"
157
+ parameters={[
158
+ {
159
+ name: "param1",
160
+ type: "T1",
161
+ ref: true,
162
+ },
163
+ {
164
+ name: "param2",
165
+ type: "T2",
166
+ in: true,
167
+ },
168
+ {
169
+ name: "param3",
170
+ type: "T3",
171
+ out: true,
172
+ },
173
+ {
174
+ name: "param4",
175
+ type: "T4",
176
+ refReadonly: true,
177
+ },
178
+ ]}
179
+ />
180
+ </Wrapper>,
181
+ ).toRenderTo(`
182
+ public class TestClass
183
+ {
184
+ void MethodOne(ref T1 param1, in T2 param2, out T3 param3, ref readonly T4 param4) {}
185
+ }
186
+ `);
187
+ });
@@ -22,6 +22,27 @@ export interface ParameterProps {
22
22
 
23
23
  refkey?: Refkey;
24
24
 
25
+ /**
26
+ * Parameter modifier: The argument must be initialized before calling the method. The method can't assign a new value to the parameter. The compiler might create a temporary variable to hold a copy of the argument to in parameters.
27
+ * @see https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#in-parameter-modifier
28
+ * */
29
+ in?: boolean;
30
+ /**
31
+ * Parameter modifier: The calling method isn't required to initialize the argument before calling the method. The method must assign a value to the parameter.
32
+ * @see https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#out-parameter-modifier
33
+ * */
34
+ out?: boolean;
35
+ /**
36
+ * Parameter modifier: The argument must be initialized before calling the method. The method can assign a new value to the parameter, but isn't required to do so.
37
+ * @see https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#ref-parameter-modifier
38
+ */
39
+ ref?: boolean;
40
+ /**
41
+ * Parameter modifier: The argument must be initialized before calling the method. The method can't assign a new value to the parameter.
42
+ * @see https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#ref-readonly-modifier
43
+ */
44
+ refReadonly?: boolean;
45
+
25
46
  /**
26
47
  * Define attributes to attach
27
48
  * @example
@@ -48,9 +69,26 @@ export function Parameter(props: ParameterProps) {
48
69
  isNullable: props.optional,
49
70
  });
50
71
 
72
+ // Only one of in, out, ref, ref readonly can be specified
73
+ const modifiers: (keyof ParameterProps)[] = (
74
+ ["in", "out", "ref", "refReadonly"] as (keyof ParameterProps)[]
75
+ ).filter((k) => props[k]);
76
+
77
+ if (modifiers.length > 1) {
78
+ throw new Error(
79
+ `Only one of 'in', 'out', 'ref', 'ref readonly' can be specified for parameter '${
80
+ typeof props.name === "string" ? props.name : props.name.name
81
+ }'`,
82
+ );
83
+ }
84
+ const modifier =
85
+ modifiers.length === 0 ? ""
86
+ : modifiers[0] === "refReadonly" ? "ref readonly "
87
+ : modifiers[0] + " ";
51
88
  return (
52
89
  <Declaration symbol={memberSymbol}>
53
90
  <AttributeList attributes={props.attributes} endline />
91
+ <>{modifier}</>
54
92
  <TypeSlot>{props.type}</TypeSlot>
55
93
  {props.optional ? "?" : ""} <Name />
56
94
  {props.default ? code` = ${props.default}` : ""}
@@ -0,0 +1,18 @@
1
+ import { ComponentContext, createContext, useContext } from "@alloy-js/core";
2
+
3
+ /** What kind of reference.
4
+ * - 'standard' Default reference nothing special.
5
+ * - 'attribute' means we are referencing an attribute and so the name should be trimmed of "Attribute" suffix.
6
+ */
7
+
8
+ export type ReferenceContext = "standard" | "attribute";
9
+
10
+ /**
11
+ * Provides scopes for instance and static private members.
12
+ */
13
+ export const ReferenceContext: ComponentContext<ReferenceContext> =
14
+ createContext<ReferenceContext>();
15
+
16
+ export function useReferenceContext(): "standard" | "attribute" {
17
+ return useContext(ReferenceContext) ?? "standard";
18
+ }
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  Binder,
3
3
  LibrarySymbolReference,
4
+ namekey,
4
5
  refkey,
5
6
  REFKEYABLE,
6
7
  TO_SYMBOL,
@@ -123,7 +124,7 @@ export function createLibrary<T extends Record<string, Descriptor>>(
123
124
  name,
124
125
  )! as NamespaceSymbol;
125
126
  } else {
126
- ownerSymbol = new NamespaceSymbol(name, ownerSymbol!, {
127
+ ownerSymbol = new NamespaceSymbol(namekey(name), ownerSymbol!, {
127
128
  binder,
128
129
  refkeys: refkey(),
129
130
  });
@@ -213,24 +214,33 @@ function createSymbolFromDescriptor(
213
214
  if (ownerSymbol.members.symbolNames.has(name)) {
214
215
  return ownerSymbol.members.symbolNames.get(name)! as NamespaceSymbol;
215
216
  }
216
- return new NamespaceSymbol(name, ownerSymbol as NamespaceSymbol, {
217
- binder,
218
- refkeys: refkey(),
219
- lazyMemberInitializer,
220
- });
217
+ return new NamespaceSymbol(
218
+ namekey(name),
219
+ ownerSymbol as NamespaceSymbol,
220
+ {
221
+ binder,
222
+ refkeys: refkey(),
223
+ lazyMemberInitializer,
224
+ },
225
+ );
221
226
  case "class":
222
227
  case "enum":
223
228
  case "interface":
224
229
  case "struct":
225
230
  case "record":
226
- return new NamedTypeSymbol(name, ownerSymbol.members, descriptor.kind, {
227
- binder,
228
- refkeys: refkey(),
229
- lazyMemberInitializer,
230
- });
231
+ return new NamedTypeSymbol(
232
+ namekey(name),
233
+ ownerSymbol.members,
234
+ descriptor.kind,
235
+ {
236
+ binder,
237
+ refkeys: refkey(),
238
+ lazyMemberInitializer,
239
+ },
240
+ );
231
241
  case "method":
232
242
  return new MethodSymbol(
233
- name,
243
+ namekey(name),
234
244
  ownerSymbol.members,
235
245
  descriptor.methodKind,
236
246
  {
@@ -240,7 +250,7 @@ function createSymbolFromDescriptor(
240
250
  );
241
251
  case "field":
242
252
  case "property":
243
- return new CSharpSymbol(name, ownerSymbol.members, {
253
+ return new CSharpSymbol(namekey(name), ownerSymbol.members, {
244
254
  binder,
245
255
  refkeys: refkey(),
246
256
  type:
@@ -252,7 +262,7 @@ function createSymbolFromDescriptor(
252
262
  lazyMemberInitializer,
253
263
  });
254
264
  case "generic":
255
- return new CSharpSymbol(name, ownerSymbol.members, {
265
+ return new CSharpSymbol(namekey(name), ownerSymbol.members, {
256
266
  binder,
257
267
  refkeys: refkey(),
258
268
  });
@@ -7,6 +7,7 @@ import {
7
7
  resolve,
8
8
  unresolvedRefkey,
9
9
  } from "@alloy-js/core";
10
+ import { useReferenceContext } from "../contexts/reference-context.js";
10
11
  import { CSharpScope } from "../scopes/csharp.js";
11
12
  import { CSharpNamespaceScope } from "../scopes/namespace.js";
12
13
  import { useSourceFileScope } from "../scopes/source-file.js";
@@ -56,12 +57,19 @@ export function ref(
56
57
  }
57
58
 
58
59
  const parts = [];
60
+ const referenceContext = useReferenceContext();
59
61
 
60
62
  for (const nsScope of pathDown) {
61
63
  parts.push(<AccessExpression.Part symbol={nsScope.ownerSymbol!} />);
62
64
  }
63
65
 
64
- parts.push(<AccessExpression.Part symbol={lexicalDeclaration} />);
66
+ parts.push(
67
+ <AccessExpression.Part
68
+ symbol={lexicalDeclaration}
69
+ attribute={referenceContext === "attribute"}
70
+ />,
71
+ );
72
+
65
73
  for (const member of memberPath) {
66
74
  parts.push(<AccessExpression.Part symbol={member} />);
67
75
  }
package/temp/api.json CHANGED
@@ -995,6 +995,33 @@
995
995
  "endIndex": 4
996
996
  }
997
997
  },
998
+ {
999
+ "kind": "PropertySignature",
1000
+ "canonicalReference": "@alloy-js/csharp!AccessExpressionPartProps#attribute:member",
1001
+ "docComment": "/**\n * Wether this part is an attribute reference (used in an attribute context).\n * In that case the \"Attribute\" suffix is trimmed from the name if present.\n */\n",
1002
+ "excerptTokens": [
1003
+ {
1004
+ "kind": "Content",
1005
+ "text": "attribute?: "
1006
+ },
1007
+ {
1008
+ "kind": "Content",
1009
+ "text": "boolean"
1010
+ },
1011
+ {
1012
+ "kind": "Content",
1013
+ "text": ";"
1014
+ }
1015
+ ],
1016
+ "isReadonly": false,
1017
+ "isOptional": true,
1018
+ "releaseTag": "Public",
1019
+ "name": "attribute",
1020
+ "propertyTypeTokenRange": {
1021
+ "startIndex": 1,
1022
+ "endIndex": 2
1023
+ }
1024
+ },
998
1025
  {
999
1026
  "kind": "PropertySignature",
1000
1027
  "canonicalReference": "@alloy-js/csharp!AccessExpressionPartProps#children:member",
@@ -1577,78 +1604,6 @@
1577
1604
  "endIndex": 14
1578
1605
  }
1579
1606
  },
1580
- {
1581
- "kind": "Interface",
1582
- "canonicalReference": "@alloy-js/csharp!AttributeItem:interface",
1583
- "docComment": "",
1584
- "excerptTokens": [
1585
- {
1586
- "kind": "Content",
1587
- "text": "export interface AttributeItem "
1588
- }
1589
- ],
1590
- "fileUrlPath": "src/components/attributes/attributes.tsx",
1591
- "releaseTag": "Public",
1592
- "name": "AttributeItem",
1593
- "preserveMemberOrder": false,
1594
- "members": [
1595
- {
1596
- "kind": "PropertySignature",
1597
- "canonicalReference": "@alloy-js/csharp!AttributeItem#args:member",
1598
- "docComment": "",
1599
- "excerptTokens": [
1600
- {
1601
- "kind": "Content",
1602
- "text": "args?: "
1603
- },
1604
- {
1605
- "kind": "Content",
1606
- "text": "string[]"
1607
- },
1608
- {
1609
- "kind": "Content",
1610
- "text": ";"
1611
- }
1612
- ],
1613
- "isReadonly": false,
1614
- "isOptional": true,
1615
- "releaseTag": "Public",
1616
- "name": "args",
1617
- "propertyTypeTokenRange": {
1618
- "startIndex": 1,
1619
- "endIndex": 2
1620
- }
1621
- },
1622
- {
1623
- "kind": "PropertySignature",
1624
- "canonicalReference": "@alloy-js/csharp!AttributeItem#name:member",
1625
- "docComment": "",
1626
- "excerptTokens": [
1627
- {
1628
- "kind": "Content",
1629
- "text": "name: "
1630
- },
1631
- {
1632
- "kind": "Content",
1633
- "text": "string"
1634
- },
1635
- {
1636
- "kind": "Content",
1637
- "text": ";"
1638
- }
1639
- ],
1640
- "isReadonly": false,
1641
- "isOptional": false,
1642
- "releaseTag": "Public",
1643
- "name": "name",
1644
- "propertyTypeTokenRange": {
1645
- "startIndex": 1,
1646
- "endIndex": 2
1647
- }
1648
- }
1649
- ],
1650
- "extendsTokenRanges": []
1651
- },
1652
1607
  {
1653
1608
  "kind": "Function",
1654
1609
  "canonicalReference": "@alloy-js/csharp!AttributeList:function(1)",
@@ -1857,10 +1812,14 @@
1857
1812
  "kind": "Content",
1858
1813
  "text": "name: "
1859
1814
  },
1815
+ {
1816
+ "kind": "Content",
1817
+ "text": "string | "
1818
+ },
1860
1819
  {
1861
1820
  "kind": "Reference",
1862
- "text": "Children",
1863
- "canonicalReference": "@alloy-js/core!Children:type"
1821
+ "text": "Refkeyable",
1822
+ "canonicalReference": "@alloy-js/core!Refkeyable:type"
1864
1823
  },
1865
1824
  {
1866
1825
  "kind": "Content",
@@ -1873,7 +1832,7 @@
1873
1832
  "name": "name",
1874
1833
  "propertyTypeTokenRange": {
1875
1834
  "startIndex": 1,
1876
- "endIndex": 2
1835
+ "endIndex": 3
1877
1836
  }
1878
1837
  }
1879
1838
  ],
@@ -13690,6 +13649,33 @@
13690
13649
  "endIndex": 2
13691
13650
  }
13692
13651
  },
13652
+ {
13653
+ "kind": "PropertySignature",
13654
+ "canonicalReference": "@alloy-js/csharp!ParameterProps#in:member",
13655
+ "docComment": "/**\n * Parameter modifier: The argument must be initialized before calling the method. The method can't assign a new value to the parameter. The compiler might create a temporary variable to hold a copy of the argument to in parameters.\n *\n * @see\n *\n * https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#in-parameter-modifier\n */\n",
13656
+ "excerptTokens": [
13657
+ {
13658
+ "kind": "Content",
13659
+ "text": "in?: "
13660
+ },
13661
+ {
13662
+ "kind": "Content",
13663
+ "text": "boolean"
13664
+ },
13665
+ {
13666
+ "kind": "Content",
13667
+ "text": ";"
13668
+ }
13669
+ ],
13670
+ "isReadonly": false,
13671
+ "isOptional": true,
13672
+ "releaseTag": "Public",
13673
+ "name": "in",
13674
+ "propertyTypeTokenRange": {
13675
+ "startIndex": 1,
13676
+ "endIndex": 2
13677
+ }
13678
+ },
13693
13679
  {
13694
13680
  "kind": "PropertySignature",
13695
13681
  "canonicalReference": "@alloy-js/csharp!ParameterProps#name:member",
@@ -13749,6 +13735,60 @@
13749
13735
  "endIndex": 2
13750
13736
  }
13751
13737
  },
13738
+ {
13739
+ "kind": "PropertySignature",
13740
+ "canonicalReference": "@alloy-js/csharp!ParameterProps#out:member",
13741
+ "docComment": "/**\n * Parameter modifier: The calling method isn't required to initialize the argument before calling the method. The method must assign a value to the parameter.\n *\n * @see\n *\n * https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#out-parameter-modifier\n */\n",
13742
+ "excerptTokens": [
13743
+ {
13744
+ "kind": "Content",
13745
+ "text": "out?: "
13746
+ },
13747
+ {
13748
+ "kind": "Content",
13749
+ "text": "boolean"
13750
+ },
13751
+ {
13752
+ "kind": "Content",
13753
+ "text": ";"
13754
+ }
13755
+ ],
13756
+ "isReadonly": false,
13757
+ "isOptional": true,
13758
+ "releaseTag": "Public",
13759
+ "name": "out",
13760
+ "propertyTypeTokenRange": {
13761
+ "startIndex": 1,
13762
+ "endIndex": 2
13763
+ }
13764
+ },
13765
+ {
13766
+ "kind": "PropertySignature",
13767
+ "canonicalReference": "@alloy-js/csharp!ParameterProps#ref:member",
13768
+ "docComment": "/**\n * Parameter modifier: The argument must be initialized before calling the method. The method can assign a new value to the parameter, but isn't required to do so.\n *\n * @see\n *\n * https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#ref-parameter-modifier\n */\n",
13769
+ "excerptTokens": [
13770
+ {
13771
+ "kind": "Content",
13772
+ "text": "ref?: "
13773
+ },
13774
+ {
13775
+ "kind": "Content",
13776
+ "text": "boolean"
13777
+ },
13778
+ {
13779
+ "kind": "Content",
13780
+ "text": ";"
13781
+ }
13782
+ ],
13783
+ "isReadonly": false,
13784
+ "isOptional": true,
13785
+ "releaseTag": "Public",
13786
+ "name": "ref",
13787
+ "propertyTypeTokenRange": {
13788
+ "startIndex": 1,
13789
+ "endIndex": 2
13790
+ }
13791
+ },
13752
13792
  {
13753
13793
  "kind": "PropertySignature",
13754
13794
  "canonicalReference": "@alloy-js/csharp!ParameterProps#refkey:member",
@@ -13777,6 +13817,33 @@
13777
13817
  "endIndex": 2
13778
13818
  }
13779
13819
  },
13820
+ {
13821
+ "kind": "PropertySignature",
13822
+ "canonicalReference": "@alloy-js/csharp!ParameterProps#refReadonly:member",
13823
+ "docComment": "/**\n * Parameter modifier: The argument must be initialized before calling the method. The method can't assign a new value to the parameter.\n *\n * @see\n *\n * https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters#ref-readonly-modifier\n */\n",
13824
+ "excerptTokens": [
13825
+ {
13826
+ "kind": "Content",
13827
+ "text": "refReadonly?: "
13828
+ },
13829
+ {
13830
+ "kind": "Content",
13831
+ "text": "boolean"
13832
+ },
13833
+ {
13834
+ "kind": "Content",
13835
+ "text": ";"
13836
+ }
13837
+ ],
13838
+ "isReadonly": false,
13839
+ "isOptional": true,
13840
+ "releaseTag": "Public",
13841
+ "name": "refReadonly",
13842
+ "propertyTypeTokenRange": {
13843
+ "startIndex": 1,
13844
+ "endIndex": 2
13845
+ }
13846
+ },
13780
13847
  {
13781
13848
  "kind": "PropertySignature",
13782
13849
  "canonicalReference": "@alloy-js/csharp!ParameterProps#type:member",