Skip to content

Commit 35cec95

Browse files
committed
fix(claude): add utility methods to python generator
1 parent c0ef929 commit 35cec95

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

pkg/generator/python.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ func (g *PythonGenerator) generateClasses(m *manifest.Manifest) (string, error)
194194
func (g *PythonGenerator) generateClass(m *manifest.Manifest, class *manifest.Class) (string, error) {
195195
var sb strings.Builder
196196

197+
hasDtor := class.Destructor != ""
198+
197199
// Class declaration with docstring
198200
sb.WriteString(fmt.Sprintf("class %s:\n", class.Name))
199201
if class.Description != "" {
@@ -216,6 +218,14 @@ func (g *PythonGenerator) generateClass(m *manifest.Manifest, class *manifest.Cl
216218
sb.WriteString(" ...\n\n")
217219
}
218220

221+
// Generate destructor and context manager methods for classes with destructors
222+
if hasDtor {
223+
sb.WriteString(g.generateDestructorMethods(class))
224+
}
225+
226+
// Generate utility methods (get, release, reset, valid) for all classes
227+
sb.WriteString(g.generateUtilityMethods(class))
228+
219229
// Generate bindings (methods)
220230
for _, binding := range class.Bindings {
221231
methodCode, err := g.generateBinding(m, class, &binding)
@@ -229,6 +239,89 @@ func (g *PythonGenerator) generateClass(m *manifest.Manifest, class *manifest.Cl
229239
return sb.String(), nil
230240
}
231241

242+
func (g *PythonGenerator) generateDestructorMethods(class *manifest.Class) string {
243+
var sb strings.Builder
244+
245+
// __del__ method
246+
sb.WriteString(" def __del__(self) -> None:\n")
247+
sb.WriteString(" \"\"\"\n")
248+
sb.WriteString(" Destructor. Releases the underlying handle if owned.\n")
249+
sb.WriteString(" \"\"\"\n")
250+
sb.WriteString(" ...\n\n")
251+
252+
// close method
253+
sb.WriteString(" def close(self) -> None:\n")
254+
sb.WriteString(" \"\"\"\n")
255+
sb.WriteString(" Close/destroy the handle if owned.\n")
256+
sb.WriteString(" \"\"\"\n")
257+
sb.WriteString(" ...\n\n")
258+
259+
// __enter__ method for context manager
260+
sb.WriteString(fmt.Sprintf(" def __enter__(self) -> \"%s\":\n", class.Name))
261+
sb.WriteString(" \"\"\"\n")
262+
sb.WriteString(" Enter the runtime context for this object.\n\n")
263+
sb.WriteString(" Returns:\n")
264+
sb.WriteString(fmt.Sprintf(" %s: self\n", class.Name))
265+
sb.WriteString(" \"\"\"\n")
266+
sb.WriteString(" ...\n\n")
267+
268+
// __exit__ method for context manager
269+
sb.WriteString(" def __exit__(self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: object) -> None:\n")
270+
sb.WriteString(" \"\"\"\n")
271+
sb.WriteString(" Exit the runtime context and release resources.\n\n")
272+
sb.WriteString(" Args:\n")
273+
sb.WriteString(" exc_type (type[BaseException] | None): Exception type if an exception was raised\n")
274+
sb.WriteString(" exc_val (BaseException | None): Exception value if an exception was raised\n")
275+
sb.WriteString(" exc_tb (object): Traceback if an exception was raised\n")
276+
sb.WriteString(" \"\"\"\n")
277+
sb.WriteString(" ...\n\n")
278+
279+
return sb.String()
280+
}
281+
282+
func (g *PythonGenerator) generateUtilityMethods(class *manifest.Class) string {
283+
var sb strings.Builder
284+
285+
// Get the handle type mapped to Python
286+
handleType, _ := g.typeMapper.MapType(class.HandleType, TypeContextReturn, false)
287+
288+
// get() method
289+
sb.WriteString(fmt.Sprintf(" def get(self) -> %s:\n", handleType))
290+
sb.WriteString(" \"\"\"\n")
291+
sb.WriteString(" Get the raw handle value without transferring ownership.\n\n")
292+
sb.WriteString(" Returns:\n")
293+
sb.WriteString(fmt.Sprintf(" %s: The underlying handle value\n", handleType))
294+
sb.WriteString(" \"\"\"\n")
295+
sb.WriteString(" ...\n\n")
296+
297+
// release() method
298+
sb.WriteString(fmt.Sprintf(" def release(self) -> %s:\n", handleType))
299+
sb.WriteString(" \"\"\"\n")
300+
sb.WriteString(" Release ownership of the handle and return it.\n\n")
301+
sb.WriteString(" Returns:\n")
302+
sb.WriteString(fmt.Sprintf(" %s: The released handle value\n", handleType))
303+
sb.WriteString(" \"\"\"\n")
304+
sb.WriteString(" ...\n\n")
305+
306+
// reset() method
307+
sb.WriteString(" def reset(self) -> None:\n")
308+
sb.WriteString(" \"\"\"\n")
309+
sb.WriteString(" Reset the handle by closing it.\n")
310+
sb.WriteString(" \"\"\"\n")
311+
sb.WriteString(" ...\n\n")
312+
313+
// valid() method
314+
sb.WriteString(" def valid(self) -> bool:\n")
315+
sb.WriteString(" \"\"\"\n")
316+
sb.WriteString(" Check if the handle is valid.\n\n")
317+
sb.WriteString(" Returns:\n")
318+
sb.WriteString(" bool: True if the handle is valid, False otherwise\n")
319+
sb.WriteString(" \"\"\"\n")
320+
sb.WriteString(" ...\n\n")
321+
322+
return sb.String()
323+
}
324+
232325
func (g *PythonGenerator) generateConstructor(m *manifest.Manifest, class *manifest.Class, methodName string) (string, error) {
233326
// Find the method in the manifest
234327
var method *manifest.Method

0 commit comments

Comments
 (0)