@tsonic/emitter 0.0.6 → 0.0.13
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/.tsbuildinfo +1 -1
- package/dist/array.test.js +5 -5
- package/dist/array.test.js.map +1 -1
- package/dist/core/attributes.d.ts +43 -0
- package/dist/core/attributes.d.ts.map +1 -0
- package/dist/core/attributes.js +128 -0
- package/dist/core/attributes.js.map +1 -0
- package/dist/core/attributes.test.d.ts +5 -0
- package/dist/core/attributes.test.d.ts.map +1 -0
- package/dist/core/attributes.test.js +296 -0
- package/dist/core/attributes.test.js.map +1 -0
- package/dist/core/imports.test.js +6 -3
- package/dist/core/imports.test.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/module-emitter/static-container.d.ts.map +1 -1
- package/dist/core/module-emitter/static-container.js +50 -1
- package/dist/core/module-emitter/static-container.js.map +1 -1
- package/dist/core/module-emitter.test.js +2 -1
- package/dist/core/module-emitter.test.js.map +1 -1
- package/dist/core/module-map.d.ts.map +1 -1
- package/dist/core/module-map.js +5 -1
- package/dist/core/module-map.js.map +1 -1
- package/dist/core/module-map.test.d.ts +8 -0
- package/dist/core/module-map.test.d.ts.map +1 -0
- package/dist/core/module-map.test.js +94 -0
- package/dist/core/module-map.test.js.map +1 -0
- package/dist/core/type-compatibility.d.ts +31 -0
- package/dist/core/type-compatibility.d.ts.map +1 -0
- package/dist/core/type-compatibility.js +99 -0
- package/dist/core/type-compatibility.js.map +1 -0
- package/dist/core/type-resolution.d.ts +83 -3
- package/dist/core/type-resolution.d.ts.map +1 -1
- package/dist/core/type-resolution.js +262 -4
- package/dist/core/type-resolution.js.map +1 -1
- package/dist/core/type-resolution.test.js +110 -1
- package/dist/core/type-resolution.test.js.map +1 -1
- package/dist/emitter-types/context.d.ts.map +1 -1
- package/dist/emitter-types/context.js +21 -1
- package/dist/emitter-types/context.js.map +1 -1
- package/dist/emitter-types/core.d.ts +26 -0
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.d.ts.map +1 -1
- package/dist/emitter-types/identifiers.js +4 -43
- package/dist/emitter-types/identifiers.js.map +1 -1
- package/dist/emitter-types/index.d.ts +1 -1
- package/dist/emitter-types/index.d.ts.map +1 -1
- package/dist/emitter-types/index.js.map +1 -1
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +47 -1
- package/dist/emitter.js.map +1 -1
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +51 -3
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +138 -23
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls.d.ts.map +1 -1
- package/dist/expressions/calls.js +90 -13
- package/dist/expressions/calls.js.map +1 -1
- package/dist/expressions/collections.d.ts +3 -2
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +251 -52
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts +2 -2
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +81 -38
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +28 -7
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.test.js +191 -4
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts +7 -17
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +27 -87
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/literals.test.js +52 -2
- package/dist/expressions/literals.test.js.map +1 -1
- package/dist/expressions/operators.d.ts +29 -11
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +244 -67
- package/dist/expressions/operators.js.map +1 -1
- package/dist/expressions/other.d.ts +3 -0
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +27 -3
- package/dist/expressions/other.js.map +1 -1
- package/dist/generator-exchange.d.ts +1 -1
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +15 -4
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator-wrapper.d.ts +84 -0
- package/dist/generator-wrapper.d.ts.map +1 -0
- package/dist/generator-wrapper.js +312 -0
- package/dist/generator-wrapper.js.map +1 -0
- package/dist/generator-wrapper.test.d.ts +12 -0
- package/dist/generator-wrapper.test.d.ts.map +1 -0
- package/dist/generator-wrapper.test.js +179 -0
- package/dist/generator-wrapper.test.js.map +1 -0
- package/dist/generator.test.js +596 -6
- package/dist/generator.test.js.map +1 -1
- package/dist/golden-tests/config-parser.d.ts.map +1 -1
- package/dist/golden-tests/config-parser.js +81 -11
- package/dist/golden-tests/config-parser.js.map +1 -1
- package/dist/golden-tests/discovery.d.ts +14 -3
- package/dist/golden-tests/discovery.d.ts.map +1 -1
- package/dist/golden-tests/discovery.js +105 -12
- package/dist/golden-tests/discovery.js.map +1 -1
- package/dist/golden-tests/index.d.ts +1 -1
- package/dist/golden-tests/index.d.ts.map +1 -1
- package/dist/golden-tests/index.js.map +1 -1
- package/dist/golden-tests/runner.d.ts +1 -0
- package/dist/golden-tests/runner.d.ts.map +1 -1
- package/dist/golden-tests/runner.js +83 -25
- package/dist/golden-tests/runner.js.map +1 -1
- package/dist/golden-tests/types.d.ts +18 -1
- package/dist/golden-tests/types.d.ts.map +1 -1
- package/dist/golden.test.d.ts +12 -5
- package/dist/golden.test.d.ts.map +1 -1
- package/dist/golden.test.js +40 -21
- package/dist/golden.test.js.map +1 -1
- package/dist/hierarchical-bindings.test.js +2 -2
- package/dist/hierarchical-bindings.test.js.map +1 -1
- package/dist/integration.test.js +57 -10
- package/dist/integration.test.js.map +1 -1
- package/dist/invariants/emitter-globals-subset.test.d.ts +15 -0
- package/dist/invariants/emitter-globals-subset.test.d.ts.map +1 -0
- package/dist/invariants/emitter-globals-subset.test.js +137 -0
- package/dist/invariants/emitter-globals-subset.test.js.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts +19 -0
- package/dist/invariants/numeric-proof-contract.test.d.ts.map +1 -0
- package/dist/invariants/numeric-proof-contract.test.js +565 -0
- package/dist/invariants/numeric-proof-contract.test.js.map +1 -0
- package/dist/specialization/generic-functions.test.js +376 -0
- package/dist/specialization/generic-functions.test.js.map +1 -1
- package/dist/specialization/interfaces.test.js +6 -6
- package/dist/specialization/interfaces.test.js.map +1 -1
- package/dist/specialization/substitution.d.ts.map +1 -1
- package/dist/specialization/substitution.js +7 -0
- package/dist/specialization/substitution.js.map +1 -1
- package/dist/specialization/type-aliases.test.js +88 -5
- package/dist/specialization/type-aliases.test.js.map +1 -1
- package/dist/statement-emitter.d.ts.map +1 -1
- package/dist/statement-emitter.js +5 -1
- package/dist/statement-emitter.js.map +1 -1
- package/dist/statements/blocks.d.ts +39 -1
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +129 -3
- package/dist/statements/blocks.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +16 -5
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/classes/members/properties.d.ts.map +1 -1
- package/dist/statements/classes/members/properties.js +10 -1
- package/dist/statements/classes/members/properties.js.map +1 -1
- package/dist/statements/classes/properties.d.ts.map +1 -1
- package/dist/statements/classes/properties.js +4 -0
- package/dist/statements/classes/properties.js.map +1 -1
- package/dist/statements/control/conditionals.d.ts.map +1 -1
- package/dist/statements/control/conditionals.js +352 -1
- package/dist/statements/control/conditionals.js.map +1 -1
- package/dist/statements/control/loops.d.ts +6 -0
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +9 -2
- package/dist/statements/control/loops.js.map +1 -1
- package/dist/statements/declarations/classes.d.ts.map +1 -1
- package/dist/statements/declarations/classes.js +20 -6
- package/dist/statements/declarations/classes.js.map +1 -1
- package/dist/statements/declarations/functions.d.ts.map +1 -1
- package/dist/statements/declarations/functions.js +98 -26
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/statements/declarations/interfaces.js +11 -1
- package/dist/statements/declarations/interfaces.js.map +1 -1
- package/dist/statements/declarations/structs.test.js +7 -5
- package/dist/statements/declarations/structs.test.js.map +1 -1
- package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/statements/declarations/type-aliases.js +18 -9
- package/dist/statements/declarations/type-aliases.js.map +1 -1
- package/dist/statements/declarations/variables.d.ts.map +1 -1
- package/dist/statements/declarations/variables.js +54 -2
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/index.test.js +164 -3
- package/dist/statements/index.test.js.map +1 -1
- package/dist/types/arrays.d.ts +10 -1
- package/dist/types/arrays.d.ts.map +1 -1
- package/dist/types/arrays.js +16 -1
- package/dist/types/arrays.js.map +1 -1
- package/dist/types/dictionaries.d.ts +3 -2
- package/dist/types/dictionaries.d.ts.map +1 -1
- package/dist/types/dictionaries.js +14 -8
- package/dist/types/dictionaries.js.map +1 -1
- package/dist/types/emitter.d.ts.map +1 -1
- package/dist/types/emitter.js +3 -0
- package/dist/types/emitter.js.map +1 -1
- package/dist/types/index.test.js +5 -2
- package/dist/types/index.test.js.map +1 -1
- package/dist/types/parameters.d.ts.map +1 -1
- package/dist/types/parameters.js +29 -0
- package/dist/types/parameters.js.map +1 -1
- package/dist/types/primitives.d.ts +12 -1
- package/dist/types/primitives.d.ts.map +1 -1
- package/dist/types/primitives.js +14 -1
- package/dist/types/primitives.js.map +1 -1
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +136 -30
- package/dist/types/references.js.map +1 -1
- package/dist/types/references.test.d.ts +11 -0
- package/dist/types/references.test.d.ts.map +1 -0
- package/dist/types/references.test.js +382 -0
- package/dist/types/references.test.js.map +1 -0
- package/dist/types/tuples.d.ts +23 -0
- package/dist/types/tuples.d.ts.map +1 -0
- package/dist/types/tuples.js +54 -0
- package/dist/types/tuples.js.map +1 -0
- package/dist/types/unions.test.js +62 -15
- package/dist/types/unions.test.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -3
|
@@ -1,32 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Literal expression emitters
|
|
3
|
+
*
|
|
4
|
+
* NEW NUMERIC SPEC:
|
|
5
|
+
* - Integer literals (42) have type int
|
|
6
|
+
* - Floating literals (42.0, 3.14, 1e3) have type double
|
|
7
|
+
* - The raw lexeme determines the C# type, NOT contextual typing
|
|
8
|
+
* - No automatic widening from int to double based on expected type
|
|
3
9
|
*/
|
|
4
10
|
import { IrExpression, IrType } from "@tsonic/frontend";
|
|
5
11
|
import { EmitterContext, CSharpFragment } from "../types.js";
|
|
6
|
-
/**
|
|
7
|
-
* Check if a C# type requires integer values
|
|
8
|
-
*/
|
|
9
|
-
export declare const requiresInteger: (clrType: string | undefined) => boolean;
|
|
10
12
|
/**
|
|
11
13
|
* Emit a literal value (string, number, boolean, null, undefined)
|
|
12
14
|
*
|
|
13
15
|
* @param expr - The literal expression
|
|
14
16
|
* @param context - Emitter context
|
|
15
17
|
* @param expectedType - Optional expected IR type (for null → default conversion in generic contexts)
|
|
16
|
-
* @param expectedClrType - Optional expected C# type (for int-required contexts)
|
|
17
18
|
*/
|
|
18
19
|
export declare const emitLiteral: (expr: Extract<IrExpression, {
|
|
19
20
|
kind: "literal";
|
|
20
|
-
}>, context: EmitterContext, expectedType?: IrType
|
|
21
|
-
/**
|
|
22
|
-
* Helper to determine expected CLR type from IrType for numeric contexts.
|
|
23
|
-
* Returns the CLR type name if it requires integer, undefined otherwise.
|
|
24
|
-
*
|
|
25
|
-
* TODO: Expand this to handle more cases:
|
|
26
|
-
* - Method parameter types (requires signature lookup)
|
|
27
|
-
* - LINQ methods: Take(int), Skip(int), ElementAt(int)
|
|
28
|
-
* - String methods: Substring(int, int)
|
|
29
|
-
* - Generic type argument inference contexts
|
|
30
|
-
*/
|
|
31
|
-
export declare const getExpectedClrTypeForNumeric: (irType: IrType | undefined) => string | undefined;
|
|
21
|
+
}>, context: EmitterContext, expectedType?: IrType) => [CSharpFragment, EmitterContext];
|
|
32
22
|
//# sourceMappingURL=literals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literals.d.ts","sourceRoot":"","sources":["../../src/expressions/literals.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"literals.d.ts","sourceRoot":"","sources":["../../src/expressions/literals.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAM7D;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,EAChD,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CAuDjC,CAAC"}
|
|
@@ -1,62 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Literal expression emitters
|
|
3
|
+
*
|
|
4
|
+
* NEW NUMERIC SPEC:
|
|
5
|
+
* - Integer literals (42) have type int
|
|
6
|
+
* - Floating literals (42.0, 3.14, 1e3) have type double
|
|
7
|
+
* - The raw lexeme determines the C# type, NOT contextual typing
|
|
8
|
+
* - No automatic widening from int to double based on expected type
|
|
3
9
|
*/
|
|
4
|
-
import { containsTypeParameter } from "../core/type-resolution.js";
|
|
5
|
-
/**
|
|
6
|
-
* C# types that require integer values (not double).
|
|
7
|
-
* Used to determine when numeric literals should emit as int vs double.
|
|
8
|
-
*/
|
|
9
|
-
const INT_REQUIRED_TYPES = new Set([
|
|
10
|
-
"int",
|
|
11
|
-
"Int32",
|
|
12
|
-
"System.Int32",
|
|
13
|
-
"long",
|
|
14
|
-
"Int64",
|
|
15
|
-
"System.Int64",
|
|
16
|
-
"short",
|
|
17
|
-
"Int16",
|
|
18
|
-
"System.Int16",
|
|
19
|
-
"byte",
|
|
20
|
-
"Byte",
|
|
21
|
-
"System.Byte",
|
|
22
|
-
"sbyte",
|
|
23
|
-
"SByte",
|
|
24
|
-
"System.SByte",
|
|
25
|
-
"uint",
|
|
26
|
-
"UInt32",
|
|
27
|
-
"System.UInt32",
|
|
28
|
-
"ulong",
|
|
29
|
-
"UInt64",
|
|
30
|
-
"System.UInt64",
|
|
31
|
-
"ushort",
|
|
32
|
-
"UInt16",
|
|
33
|
-
"System.UInt16",
|
|
34
|
-
]);
|
|
35
|
-
/**
|
|
36
|
-
* Check if a C# type requires integer values
|
|
37
|
-
*/
|
|
38
|
-
export const requiresInteger = (clrType) => {
|
|
39
|
-
if (!clrType)
|
|
40
|
-
return false;
|
|
41
|
-
return INT_REQUIRED_TYPES.has(clrType);
|
|
42
|
-
};
|
|
10
|
+
import { containsTypeParameter, isDefinitelyValueType, } from "../core/type-resolution.js";
|
|
43
11
|
/**
|
|
44
12
|
* Emit a literal value (string, number, boolean, null, undefined)
|
|
45
13
|
*
|
|
46
14
|
* @param expr - The literal expression
|
|
47
15
|
* @param context - Emitter context
|
|
48
16
|
* @param expectedType - Optional expected IR type (for null → default conversion in generic contexts)
|
|
49
|
-
* @param expectedClrType - Optional expected C# type (for int-required contexts)
|
|
50
17
|
*/
|
|
51
|
-
export const emitLiteral = (expr, context, expectedType
|
|
18
|
+
export const emitLiteral = (expr, context, expectedType) => {
|
|
52
19
|
const { value } = expr;
|
|
53
20
|
if (value === null) {
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
21
|
+
// Emit "default" instead of "null" in two cases:
|
|
22
|
+
// 1. Generic contexts where expected type contains type parameters (CS0403)
|
|
23
|
+
// Example: Result<T> { value: null } → { value = default }
|
|
24
|
+
// 2. Value type contexts where null is invalid (CS0037)
|
|
25
|
+
// Example: Result<number, string> { value: null } → { value = default }
|
|
26
|
+
if (expectedType) {
|
|
27
|
+
const typeParams = context.typeParameters ?? new Set();
|
|
28
|
+
if (containsTypeParameter(expectedType, typeParams) ||
|
|
29
|
+
isDefinitelyValueType(expectedType)) {
|
|
30
|
+
return [{ text: "default" }, context];
|
|
31
|
+
}
|
|
60
32
|
}
|
|
61
33
|
return [{ text: "null" }, context];
|
|
62
34
|
}
|
|
@@ -74,21 +46,15 @@ export const emitLiteral = (expr, context, expectedType, expectedClrType) => {
|
|
|
74
46
|
return [{ text: `"${escaped}"` }, context];
|
|
75
47
|
}
|
|
76
48
|
if (typeof value === "number") {
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
? String(value)
|
|
84
|
-
: String(Math.floor(value));
|
|
85
|
-
return [{ text }, context];
|
|
86
|
-
}
|
|
87
|
-
// TypeScript `number` is always `double` in C#
|
|
88
|
-
// Emit as double: ensure decimal point for integer values
|
|
89
|
-
if (Number.isInteger(value) && !String(value).includes(".")) {
|
|
90
|
-
return [{ text: `${value}.0` }, context];
|
|
49
|
+
// NEW NUMERIC SPEC: Use raw lexeme to preserve user's literal form.
|
|
50
|
+
// - Integer literals (42) → type int in C#
|
|
51
|
+
// - Floating literals (42.0, 3.14, 1e3) → type double in C#
|
|
52
|
+
// The raw lexeme determines the C# type, NOT contextual typing.
|
|
53
|
+
if (expr.raw !== undefined) {
|
|
54
|
+
return [{ text: expr.raw }, context];
|
|
91
55
|
}
|
|
56
|
+
// Fallback if raw is not available (shouldn't happen for source literals)
|
|
57
|
+
// Use String(value) which will produce integer form for whole numbers
|
|
92
58
|
return [{ text: String(value) }, context];
|
|
93
59
|
}
|
|
94
60
|
if (typeof value === "boolean") {
|
|
@@ -96,30 +62,4 @@ export const emitLiteral = (expr, context, expectedType, expectedClrType) => {
|
|
|
96
62
|
}
|
|
97
63
|
return [{ text: String(value) }, context];
|
|
98
64
|
};
|
|
99
|
-
/**
|
|
100
|
-
* Helper to determine expected CLR type from IrType for numeric contexts.
|
|
101
|
-
* Returns the CLR type name if it requires integer, undefined otherwise.
|
|
102
|
-
*
|
|
103
|
-
* TODO: Expand this to handle more cases:
|
|
104
|
-
* - Method parameter types (requires signature lookup)
|
|
105
|
-
* - LINQ methods: Take(int), Skip(int), ElementAt(int)
|
|
106
|
-
* - String methods: Substring(int, int)
|
|
107
|
-
* - Generic type argument inference contexts
|
|
108
|
-
*/
|
|
109
|
-
export const getExpectedClrTypeForNumeric = (irType) => {
|
|
110
|
-
if (!irType)
|
|
111
|
-
return undefined;
|
|
112
|
-
if (irType.kind === "primitiveType") {
|
|
113
|
-
// TS number -> C# double (default)
|
|
114
|
-
// TS doesn't have int type, so this won't trigger
|
|
115
|
-
return undefined;
|
|
116
|
-
}
|
|
117
|
-
if (irType.kind === "referenceType") {
|
|
118
|
-
// Check if it's an int type from .NET interop
|
|
119
|
-
if (requiresInteger(irType.name)) {
|
|
120
|
-
return irType.name;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return undefined;
|
|
124
|
-
};
|
|
125
65
|
//# sourceMappingURL=literals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literals.js","sourceRoot":"","sources":["../../src/expressions/literals.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"literals.js","sourceRoot":"","sources":["../../src/expressions/literals.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,IAAgD,EAChD,OAAuB,EACvB,YAAqB,EACa,EAAE;IACpC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,iDAAiD;QACjD,4EAA4E;QAC5E,8DAA8D;QAC9D,wDAAwD;QACxD,2EAA2E;QAC3E,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,GAAG,EAAU,CAAC;YAC/D,IACE,qBAAqB,CAAC,YAAY,EAAE,UAAU,CAAC;gBAC/C,qBAAqB,CAAC,YAAY,CAAC,EACnC,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,2BAA2B;QAC3B,MAAM,OAAO,GAAG,KAAK;aAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,oEAAoE;QACpE,2CAA2C;QAC3C,4DAA4D;QAC5D,gEAAgE;QAChE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,0EAA0E;QAC1E,sEAAsE;QACtE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC"}
|
|
@@ -85,6 +85,47 @@ describe("emitLiteral", () => {
|
|
|
85
85
|
const [fragment] = emitLiteral(expr, context, expectedType);
|
|
86
86
|
expect(fragment.text).to.equal("default");
|
|
87
87
|
});
|
|
88
|
+
// Bug 2 regression: null to value type (CS0037)
|
|
89
|
+
it("emits 'default' when expectedType is number (value type)", () => {
|
|
90
|
+
const expr = {
|
|
91
|
+
kind: "literal",
|
|
92
|
+
value: null,
|
|
93
|
+
};
|
|
94
|
+
// number is a value type (double in C#), null is invalid
|
|
95
|
+
const expectedType = { kind: "primitiveType", name: "number" };
|
|
96
|
+
const context = createContext();
|
|
97
|
+
const [fragment] = emitLiteral(expr, context, expectedType);
|
|
98
|
+
expect(fragment.text).to.equal("default");
|
|
99
|
+
});
|
|
100
|
+
it("emits 'default' when expectedType is number | null union (value type after stripNullish)", () => {
|
|
101
|
+
const expr = {
|
|
102
|
+
kind: "literal",
|
|
103
|
+
value: null,
|
|
104
|
+
};
|
|
105
|
+
// Result<number, string>.value is substituted to number | null
|
|
106
|
+
// After stripNullish, it's number (a value type)
|
|
107
|
+
const expectedType = {
|
|
108
|
+
kind: "unionType",
|
|
109
|
+
types: [
|
|
110
|
+
{ kind: "primitiveType", name: "number" },
|
|
111
|
+
{ kind: "primitiveType", name: "null" },
|
|
112
|
+
],
|
|
113
|
+
};
|
|
114
|
+
const context = createContext();
|
|
115
|
+
const [fragment] = emitLiteral(expr, context, expectedType);
|
|
116
|
+
expect(fragment.text).to.equal("default");
|
|
117
|
+
});
|
|
118
|
+
it("emits 'default' when expectedType is boolean (value type)", () => {
|
|
119
|
+
const expr = {
|
|
120
|
+
kind: "literal",
|
|
121
|
+
value: null,
|
|
122
|
+
};
|
|
123
|
+
// boolean is a value type (bool in C#), null is invalid
|
|
124
|
+
const expectedType = { kind: "primitiveType", name: "boolean" };
|
|
125
|
+
const context = createContext();
|
|
126
|
+
const [fragment] = emitLiteral(expr, context, expectedType);
|
|
127
|
+
expect(fragment.text).to.equal("default");
|
|
128
|
+
});
|
|
88
129
|
});
|
|
89
130
|
describe("undefined literal", () => {
|
|
90
131
|
it("emits 'default' for undefined", () => {
|
|
@@ -98,14 +139,23 @@ describe("emitLiteral", () => {
|
|
|
98
139
|
});
|
|
99
140
|
});
|
|
100
141
|
describe("number literal", () => {
|
|
101
|
-
it("emits
|
|
142
|
+
it("emits integer literals as-is (lets C# infer type)", () => {
|
|
102
143
|
const expr = {
|
|
103
144
|
kind: "literal",
|
|
104
145
|
value: 42,
|
|
105
146
|
};
|
|
106
147
|
const context = createContext();
|
|
107
148
|
const [fragment] = emitLiteral(expr, context);
|
|
108
|
-
expect(fragment.text).to.equal("42
|
|
149
|
+
expect(fragment.text).to.equal("42");
|
|
150
|
+
});
|
|
151
|
+
it("emits decimal literals as-is (lets C# infer double)", () => {
|
|
152
|
+
const expr = {
|
|
153
|
+
kind: "literal",
|
|
154
|
+
value: 3.14,
|
|
155
|
+
};
|
|
156
|
+
const context = createContext();
|
|
157
|
+
const [fragment] = emitLiteral(expr, context);
|
|
158
|
+
expect(fragment.text).to.equal("3.14");
|
|
109
159
|
});
|
|
110
160
|
it("emits integer format in array index context", () => {
|
|
111
161
|
const expr = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literals.test.js","sourceRoot":"","sources":["../../src/expressions/literals.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"literals.test.js","sourceRoot":"","sources":["../../src/expressions/literals.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Operator expression emitters (binary, logical, unary, update, assignment, conditional)
|
|
3
|
+
*
|
|
4
|
+
* NEW NUMERIC SPEC:
|
|
5
|
+
* - Literals use raw lexeme (no contextual widening)
|
|
6
|
+
* - Integer casts only from IrCastExpression (not inferred from expectedType)
|
|
7
|
+
* - Binary ops: int op int = int, double op anything = double (C# semantics)
|
|
3
8
|
*/
|
|
4
9
|
import { IrExpression, IrType } from "@tsonic/frontend";
|
|
5
10
|
import { EmitterContext, CSharpFragment } from "../types.js";
|
|
6
11
|
/**
|
|
7
12
|
* Emit a binary operator expression
|
|
8
13
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
14
|
+
* NEW NUMERIC SPEC: No contextual type propagation for numeric literals.
|
|
15
|
+
* Literals use their raw lexeme - C# will naturally handle int + int = int,
|
|
16
|
+
* int + double = double, etc.
|
|
17
|
+
*
|
|
18
|
+
* Explicit casts come from IrCastExpression nodes (generated by type-checker
|
|
19
|
+
* when user intent allows int → double coercion).
|
|
20
|
+
*
|
|
21
|
+
* STRING INDEXER FIX: In C#, string[int] returns char, not string.
|
|
22
|
+
* When comparing a string indexer result with a single-character string literal,
|
|
23
|
+
* we emit the string as a char literal to avoid CS0019 (char == string).
|
|
13
24
|
*
|
|
14
25
|
* @param expr - The binary expression
|
|
15
26
|
* @param context - Emitter context
|
|
16
|
-
* @param
|
|
27
|
+
* @param _expectedType - Unused under new spec (kept for API compatibility)
|
|
17
28
|
*/
|
|
18
29
|
export declare const emitBinary: (expr: Extract<IrExpression, {
|
|
19
30
|
kind: "binary";
|
|
20
|
-
}>, context: EmitterContext,
|
|
31
|
+
}>, context: EmitterContext, _expectedType?: IrType) => [CSharpFragment, EmitterContext];
|
|
21
32
|
/**
|
|
22
33
|
* Emit a logical operator expression (&&, ||, ??)
|
|
23
34
|
*
|
|
@@ -37,17 +48,16 @@ export declare const emitLogical: (expr: Extract<IrExpression, {
|
|
|
37
48
|
/**
|
|
38
49
|
* Emit a unary operator expression (-, +, !, ~, typeof, void, delete)
|
|
39
50
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* explicit cast. This handles `-1 as int`.
|
|
51
|
+
* NEW NUMERIC SPEC: No contextual type propagation for numeric literals.
|
|
52
|
+
* Explicit casts come from IrCastExpression nodes.
|
|
43
53
|
*
|
|
44
54
|
* @param expr - The unary expression
|
|
45
55
|
* @param context - Emitter context
|
|
46
|
-
* @param
|
|
56
|
+
* @param _expectedType - Unused under new spec (kept for API compatibility)
|
|
47
57
|
*/
|
|
48
58
|
export declare const emitUnary: (expr: Extract<IrExpression, {
|
|
49
59
|
kind: "unary";
|
|
50
|
-
}>, context: EmitterContext,
|
|
60
|
+
}>, context: EmitterContext, _expectedType?: IrType) => [CSharpFragment, EmitterContext];
|
|
51
61
|
/**
|
|
52
62
|
* Emit an update operator expression (++, --)
|
|
53
63
|
*/
|
|
@@ -59,6 +69,10 @@ export declare const emitUpdate: (expr: Extract<IrExpression, {
|
|
|
59
69
|
*
|
|
60
70
|
* Passes the LHS type as expected type to RHS, enabling proper integer
|
|
61
71
|
* literal emission for cases like `this.value = this.value + 1`.
|
|
72
|
+
*
|
|
73
|
+
* Special handling for JS mode array element assignment:
|
|
74
|
+
* - In JS mode, array[idx] = value must emit Array.set(array, idx, value)
|
|
75
|
+
* - NOT Array.get(array, idx) = value (which is invalid C#)
|
|
62
76
|
*/
|
|
63
77
|
export declare const emitAssignment: (expr: Extract<IrExpression, {
|
|
64
78
|
kind: "assignment";
|
|
@@ -66,6 +80,10 @@ export declare const emitAssignment: (expr: Extract<IrExpression, {
|
|
|
66
80
|
/**
|
|
67
81
|
* Emit a conditional (ternary) expression
|
|
68
82
|
*
|
|
83
|
+
* Supports type predicate narrowing:
|
|
84
|
+
* - `isUser(x) ? x.name : "anon"` → `x.Is1() ? (x.As1()).name : "anon"`
|
|
85
|
+
* - `!isUser(x) ? "anon" : x.name` → `!x.Is1() ? "anon" : (x.As1()).name`
|
|
86
|
+
*
|
|
69
87
|
* @param expr - The conditional expression
|
|
70
88
|
* @param context - Emitter context
|
|
71
89
|
* @param expectedType - Optional expected type (for null → default in generic contexts)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/expressions/operators.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/expressions/operators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAC;AA0F9E;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EAC/C,SAAS,cAAc,EACvB,gBAAgB,MAAM,KACrB,CAAC,cAAc,EAAE,cAAc,CAyHjC,CAAC;AAUF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,EAChD,SAAS,cAAc,KACtB,CAAC,cAAc,EAAE,cAAc,CAYjC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,EAC9C,SAAS,cAAc,EACvB,gBAAgB,MAAM,KACrB,CAAC,cAAc,EAAE,cAAc,CAwBjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EAC/C,SAAS,cAAc,KACtB,CAAC,cAAc,EAAE,cAAc,CAQjC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,EACnD,SAAS,cAAc,KACtB,CAAC,cAAc,EAAE,cAAc,CAoEjC,CAAC;AAwEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,EACpD,SAAS,cAAc,EACvB,eAAe,MAAM,KACpB,CAAC,cAAc,EAAE,cAAc,CA8DjC,CAAC"}
|