Skip to content

Commit 08e928d

Browse files
author
nicosammito
committed
feat: enhance type inference in getTypesFromNode by widening parameter types and adding new test case
1 parent 87f0a7b commit 08e928d

2 files changed

Lines changed: 61 additions & 2 deletions

File tree

src/extraction/getTypesFromNode.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,48 @@ export const getTypesFromNode = (
3737
}
3838
};
3939

40+
// Create a version of the node with primitive literals removed
41+
// This allows inferring the "expected" type of parameters (e.g. keyof T)
42+
// rather than the specific type of the argument provided (e.g. "id").
43+
const nodeIdParams = nodeId + "_params";
44+
const nodeForParams = {
45+
...nodeWithDefaults,
46+
id: nodeIdParams,
47+
parameters: {
48+
...nodeWithDefaults.parameters,
49+
nodes: nodeWithDefaults.parameters.nodes.map(p => {
50+
// If it's a primitive literal, remove it to allow wider type inference for parameters
51+
if (p.value?.__typename === "LiteralValue" && p.value.value !== null && typeof p.value.value !== 'object') {
52+
return { ...p, value: null };
53+
}
54+
return p;
55+
})
56+
}
57+
};
58+
4059
const mockFlow: Flow = {
4160
id: "gid://sagittarius/Flow/0" as any,
42-
nodes: { __typename: "NodeFunctionConnection", nodes: [nodeWithDefaults] }
61+
nodes: { __typename: "NodeFunctionConnection", nodes: [nodeWithDefaults, nodeForParams] }
4362
} as Flow;
4463

4564
const inferred = getInferredTypesFromFlow(mockFlow, functions, dataTypes);
4665
const sId = sanitizeId(nodeId);
66+
const sIdParams = sanitizeId(nodeIdParams);
67+
68+
const directParams = inferred.parameters.get(sId) || [];
69+
const widenedParams = inferred.parameters.get(sIdParams) || [];
70+
71+
// Merge parameters: prefer widened types unless they failed inference (any/unknown)
72+
const parameters = directParams.map((p, i) => {
73+
const wide = widenedParams[i];
74+
if (wide && wide !== "any" && wide !== "unknown") {
75+
return wide;
76+
}
77+
return p;
78+
});
4779

4880
return {
49-
parameters: inferred.parameters.get(sId) || [],
81+
parameters,
5082
returnType: inferred.nodes.get(sId) || "any",
5183
};
5284
};

test/getTypesFromNode.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,5 +113,32 @@ describe('getTypesFromNode', () => {
113113
expect(result.returnType).toBe("string | number");
114114
expect(result.parameters[1]).toEqual('"id" | "name"');
115115
});
116+
117+
it('should return std::object::get with all values', () => {
118+
const node: NodeFunction = {
119+
functionDefinition: {
120+
identifier: "std::object::get"
121+
},
122+
parameters: {
123+
nodes: [{
124+
value: {
125+
__typename: "LiteralValue",
126+
value: { id: 1, name: "Test" }
127+
}
128+
}, {
129+
value: {
130+
__typename: "LiteralValue",
131+
value: "id"
132+
}
133+
}]
134+
}
135+
};
136+
const result = getTypesFromNode(node, FUNCTION_SIGNATURES, DATA_TYPES);
137+
138+
console.log(result)
139+
140+
expect(result.returnType).toBe("number");
141+
expect(result.parameters[1]).toEqual('"id" | "name"');
142+
});
116143
});
117144

0 commit comments

Comments
 (0)