55from dataclasses import dataclass
66from pathlib import Path
77
8+ from codegen .shared .enums .programming_language import ProgrammingLanguage
9+
810
911@dataclass
1012class DecoratedFunction :
@@ -15,6 +17,7 @@ class DecoratedFunction:
1517 lint_mode : bool
1618 lint_user_whitelist : list [str ]
1719 subdirectories : list [str ] | None = None
20+ language : ProgrammingLanguage | None = None
1821 filepath : Path | None = None
1922 parameters : list [tuple [str , str | None ]] = dataclasses .field (default_factory = list )
2023 arguments_type_schema : dict | None = None
@@ -98,6 +101,14 @@ def get_subdirectories(self, node: ast.Call) -> list[str] | None:
98101 return ast .literal_eval (node .args [1 ])
99102 return None
100103
104+ def get_language (self , node : ast .Call ) -> ProgrammingLanguage | None :
105+ keywords = {k .arg : k .value for k in node .keywords }
106+ if "language" in keywords :
107+ return ProgrammingLanguage (keywords ["language" ].attr )
108+ if len (node .args ) > 2 :
109+ return ast .literal_eval (node .args [2 ])
110+ return None
111+
101112 def get_function_body (self , node : ast .FunctionDef ) -> str :
102113 """Extract and unindent the function body."""
103114 # Get the start and end positions of the function body
@@ -202,10 +213,6 @@ def visit_FunctionDef(self, node):
202213 (isinstance (decorator .func , ast .Attribute ) and isinstance (decorator .func .value , ast .Attribute ) and self ._has_codegen_root (decorator .func .value ))
203214 )
204215 ):
205- # Get the function name from the decorator argument
206- func_name = self .get_function_name (decorator )
207- subdirectories = self .get_subdirectories (decorator )
208-
209216 # Get additional metadata for webhook
210217 lint_mode = decorator .func .attr == "webhook"
211218 lint_user_whitelist = []
@@ -214,17 +221,15 @@ def visit_FunctionDef(self, node):
214221 if keyword .arg == "users" and isinstance (keyword .value , ast .List ):
215222 lint_user_whitelist = [ast .literal_eval (elt ).lstrip ("@" ) for elt in keyword .value .elts ]
216223
217- # Get just the function body, unindented
218- body_source = self .get_function_body (node )
219- parameters = self .get_function_parameters (node )
220224 self .functions .append (
221225 DecoratedFunction (
222- name = func_name ,
223- subdirectories = subdirectories ,
224- source = body_source ,
226+ name = self .get_function_name (decorator ),
227+ subdirectories = self .get_subdirectories (decorator ),
228+ language = self .get_language (decorator ),
229+ source = self .get_function_body (node ),
225230 lint_mode = lint_mode ,
226231 lint_user_whitelist = lint_user_whitelist ,
227- parameters = parameters ,
232+ parameters = self . get_function_parameters ( node ) ,
228233 )
229234 )
230235
0 commit comments