Skip to content

Commit 92cd483

Browse files
committed
fix(compiler): address Copilot code review comments on TypeScript generator
1 parent 4fe3d0b commit 92cd483

File tree

2 files changed

+60
-37
lines changed

2 files changed

+60
-37
lines changed

compiler/fory_compiler/generators/typescript.py

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,15 @@ class TypeScriptGenerator(BaseGenerator):
6262
PrimitiveKind.VAR_UINT64: "bigint | number",
6363
PrimitiveKind.TAGGED_UINT64: "bigint | number",
6464
PrimitiveKind.FLOAT16: "number",
65+
PrimitiveKind.BFLOAT16: "number",
6566
PrimitiveKind.FLOAT32: "number",
6667
PrimitiveKind.FLOAT64: "number",
6768
PrimitiveKind.STRING: "string",
6869
PrimitiveKind.BYTES: "Uint8Array",
6970
PrimitiveKind.DATE: "Date",
7071
PrimitiveKind.TIMESTAMP: "Date",
72+
PrimitiveKind.DURATION: "number",
73+
PrimitiveKind.DECIMAL: "number",
7174
PrimitiveKind.ANY: "any",
7275
}
7376

@@ -108,7 +111,7 @@ def split_imported_types(
108111
imported.append(item)
109112
else:
110113
local.append(item)
111-
return local, imported # Return (local, imported) tuple
114+
return imported, local # Return (imported, local) tuple
112115

113116
def get_module_name(self) -> str:
114117
"""Get the TypeScript module name from package."""
@@ -178,7 +181,7 @@ def generate_module(self) -> GeneratedFile:
178181
lines.append("")
179182

180183
# Generate enums (top-level only)
181-
local_enums, _ = self.split_imported_types(self.schema.enums)
184+
_, local_enums = self.split_imported_types(self.schema.enums)
182185
if local_enums:
183186
lines.append("// Enums")
184187
lines.append("")
@@ -187,7 +190,7 @@ def generate_module(self) -> GeneratedFile:
187190
lines.append("")
188191

189192
# Generate unions (top-level only)
190-
local_unions, _ = self.split_imported_types(self.schema.unions)
193+
_, local_unions = self.split_imported_types(self.schema.unions)
191194
if local_unions:
192195
lines.append("// Unions")
193196
lines.append("")
@@ -196,7 +199,7 @@ def generate_module(self) -> GeneratedFile:
196199
lines.append("")
197200

198201
# Generate messages (including nested types)
199-
local_messages, _ = self.split_imported_types(self.schema.messages)
202+
_, local_messages = self.split_imported_types(self.schema.messages)
200203
if local_messages:
201204
lines.append("// Messages")
202205
lines.append("")
@@ -244,17 +247,7 @@ def generate_message(
244247
if comment:
245248
lines.append(comment)
246249

247-
# Generate nested enums first
248-
for nested_enum in message.nested_enums:
249-
lines.extend(self.generate_enum(nested_enum, indent=indent))
250-
lines.append("")
251-
252-
# Generate nested unions
253-
for nested_union in message.nested_unions:
254-
lines.extend(self.generate_union(nested_union, indent=indent))
255-
lines.append("")
256-
257-
# Generate the main interface
250+
# Generate the main interface first
258251
lines.append(f"{ind}export interface {message.name} {{")
259252

260253
# Generate fields
@@ -266,7 +259,17 @@ def generate_message(
266259

267260
lines.append(f"{ind}}}")
268261

269-
# Generate nested messages
262+
# Generate nested enums after parent interface
263+
for nested_enum in message.nested_enums:
264+
lines.append("")
265+
lines.extend(self.generate_enum(nested_enum, indent=indent))
266+
267+
# Generate nested unions after parent interface
268+
for nested_union in message.nested_unions:
269+
lines.append("")
270+
lines.extend(self.generate_union(nested_union, indent=indent))
271+
272+
# Generate nested messages after parent interface
270273
for nested_msg in message.nested_messages:
271274
lines.append("")
272275
lines.extend(
@@ -350,33 +353,25 @@ def generate_registration(self) -> List[str]:
350353

351354
return lines
352355

353-
def _generate_message_registration(
354-
self, message: Message, lines: List[str], parent: Optional[str] = None
355-
):
356+
def _generate_message_registration(self, message: Message, lines: List[str]):
356357
"""Generate registration for a message and its nested types."""
357-
qual_name = f"{parent}.{message.name}" if parent else message.name
358-
359-
# Register nested enums
358+
# Register nested enums with simple names
360359
for nested_enum in message.nested_enums:
361360
if self.should_register_by_id(nested_enum):
362361
type_id = nested_enum.type_id
363-
lines.append(
364-
f" fory.register({qual_name}.{nested_enum.name}, {type_id});"
365-
)
362+
lines.append(f" fory.register({nested_enum.name}, {type_id});")
366363

367-
# Register nested unions
364+
# Register nested unions with simple names
368365
for nested_union in message.nested_unions:
369366
if self.should_register_by_id(nested_union):
370367
type_id = nested_union.type_id
371-
lines.append(
372-
f" fory.registerUnion({qual_name}.{nested_union.name}, {type_id});"
373-
)
368+
lines.append(f" fory.registerUnion({nested_union.name}, {type_id});")
374369

375-
# Register nested messages
370+
# Register nested messages recursively
376371
for nested_msg in message.nested_messages:
377-
self._generate_message_registration(nested_msg, lines, qual_name)
372+
self._generate_message_registration(nested_msg, lines)
378373

379-
# Register the message itself
374+
# Register the message itself with simple name
380375
if self.should_register_by_id(message):
381376
type_id = message.type_id
382-
lines.append(f" fory.register({qual_name}, {type_id});")
377+
lines.append(f" fory.register({message.name}, {type_id});")

compiler/fory_compiler/tests/test_typescript_codegen.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,30 @@ def test_typescript_nested_enum():
137137
assert "HOME = 1" in output
138138

139139

140+
def test_typescript_nested_enum_registration_uses_simple_name():
141+
"""Test that nested enums are registered with simple names, not qualified names."""
142+
source = dedent(
143+
"""
144+
package example;
145+
146+
message Person [id=100] {
147+
string name = 1;
148+
149+
enum PhoneType [id=101] {
150+
MOBILE = 0;
151+
HOME = 1;
152+
}
153+
}
154+
"""
155+
)
156+
output = generate_typescript(source)
157+
158+
# Check that nested enum is registered with simple name (not qualified name)
159+
assert "fory.register(PhoneType, 101)" in output
160+
# Ensure qualified names are NOT used
161+
assert "Person.PhoneType" not in output
162+
163+
140164
def test_typescript_union_generation():
141165
"""Test that unions are properly generated as discriminated unions."""
142166
source = dedent(
@@ -278,10 +302,14 @@ def test_typescript_field_naming():
278302
)
279303
output = generate_typescript(source)
280304

281-
# Check camelCase conversion
282-
assert "first_name:" in output or "firstName:" in output
283-
assert "last_name:" in output or "lastName:" in output
284-
assert "phone_number:" in output or "phoneNumber:" in output
305+
# Check that field names are properly converted to camelCase
306+
assert "firstName:" in output
307+
assert "lastName:" in output
308+
assert "phoneNumber:" in output
309+
# Ensure snake_case is not used
310+
assert "first_name:" not in output
311+
assert "last_name:" not in output
312+
assert "phone_number:" not in output
285313

286314

287315
def test_typescript_no_runtime_dependencies():

0 commit comments

Comments
 (0)