7
7
def chunk_code (code : str , language : str ) -> ParsedBody :
8
8
parser = ParserFactory .get_parser (language )
9
9
tree = parser .parse (code .encode ("utf8" ))
10
-
10
+ code_bytes = code . encode ( "utf8" )
11
11
body : ParsedBody = {
12
+ "imports" : [],
13
+ "global_variables" : [],
14
+ "type_definitions" : [],
12
15
"functions" : {},
16
+ "async_functions" : {},
13
17
"classes" : {},
14
18
"hooks" : {},
15
19
"components" : {},
20
+ "jsx_elements" : [],
16
21
"other_blocks" : [],
17
22
}
18
- # code_bytes = code.encode("utf8")
19
23
20
24
def process_node (node ):
21
- result = parse_code (code , language )
25
+ result = parse_code (node , code_bytes )
22
26
if result :
23
- # Assuming parse_code is modified to return line numbers
24
27
start_line = result .get ("start_line" , 0 )
25
28
end_line = result .get ("end_line" , 0 )
26
29
27
- if result ["type" ] == "function" :
30
+ if result ["type" ] == "import_statement" :
31
+ body ["imports" ].append (
32
+ {
33
+ "code" : result ["code" ],
34
+ "start_line" : start_line ,
35
+ "end_line" : end_line ,
36
+ }
37
+ )
38
+ elif (
39
+ result ["type" ] == "variable_declaration"
40
+ and node .parent .type == "program"
41
+ ):
42
+ body ["global_variables" ].append (
43
+ {
44
+ "code" : result ["code" ],
45
+ "start_line" : start_line ,
46
+ "end_line" : end_line ,
47
+ }
48
+ )
49
+ elif result ["type" ] in ["type_alias" , "interface_declaration" ]:
50
+ body ["type_definitions" ].append (
51
+ {
52
+ "name" : result ["name" ],
53
+ "code" : result ["code" ],
54
+ "start_line" : start_line ,
55
+ "end_line" : end_line ,
56
+ }
57
+ )
58
+ elif result ["type" ] == "function" :
28
59
if is_react_hook (result ["name" ]):
29
60
body ["hooks" ][result ["name" ]] = {
30
61
"code" : result ["code" ],
31
62
"start_line" : start_line ,
32
63
"end_line" : end_line ,
33
64
}
34
65
elif is_react_component (result ["code" ]):
35
- body ["components" ][result ["name" ]] = result ["code" ]
66
+ body ["components" ][result ["name" ]] = {
67
+ "code" : result ["code" ],
68
+ "start_line" : start_line ,
69
+ "end_line" : end_line ,
70
+ }
71
+ elif "async" in result ["code" ].split ()[0 ]:
72
+ body ["async_functions" ][result ["name" ]] = {
73
+ "code" : result ["code" ],
74
+ "start_line" : start_line ,
75
+ "end_line" : end_line ,
76
+ }
36
77
else :
37
- body ["functions" ][result ["name" ]] = result ["code" ]
78
+ body ["functions" ][result ["name" ]] = {
79
+ "code" : result ["code" ],
80
+ "start_line" : start_line ,
81
+ "end_line" : end_line ,
82
+ }
38
83
elif result ["type" ] == "class" :
39
84
if is_react_component (result ["code" ]):
40
- body ["components" ][result ["name" ]] = result ["code" ]
85
+ body ["components" ][result ["name" ]] = {
86
+ "code" : result ["code" ],
87
+ "start_line" : start_line ,
88
+ "end_line" : end_line ,
89
+ }
41
90
else :
42
- body ["classes" ][result ["name" ]] = result ["code" ]
43
- elif result ["type" ] == "component" :
44
- body ["components" ][result ["name" ]] = result ["code" ]
45
- elif result ["type" ] == "impl" :
46
- body ["classes" ][result ["name" ]] = result ["code" ]
91
+ body ["classes" ][result ["name" ]] = {
92
+ "code" : result ["code" ],
93
+ "start_line" : start_line ,
94
+ "end_line" : end_line ,
95
+ }
96
+ elif result ["type" ] == "jsx_element" :
97
+ body ["jsx_elements" ].append (
98
+ {
99
+ "code" : result ["code" ],
100
+ "start_line" : start_line ,
101
+ "end_line" : end_line ,
102
+ }
103
+ )
47
104
else :
48
105
for child in node .children :
49
106
process_node (child )
@@ -55,8 +112,14 @@ def process_node(node):
55
112
for section in body .values ():
56
113
if isinstance (section , dict ):
57
114
for code_block in section .values ():
58
- start = code .index (code_block )
59
- collected_ranges .append ((start , start + len (code_block )))
115
+ collected_ranges .append (
116
+ (code_block ["start_line" ], code_block ["end_line" ])
117
+ )
118
+ elif isinstance (section , list ):
119
+ for code_block in section :
120
+ collected_ranges .append (
121
+ (code_block ["start_line" ], code_block ["end_line" ])
122
+ )
60
123
61
124
collected_ranges .sort ()
62
125
last_end = 0
@@ -76,5 +139,10 @@ def is_react_hook(name: str) -> bool:
76
139
77
140
def is_react_component (code : str ) -> bool :
78
141
return (
79
- "React" in code or "jsx" in code .lower () or "tsx" in code .lower () or "<" in code
142
+ "React" in code
143
+ or "jsx" in code .lower ()
144
+ or "tsx" in code .lower ()
145
+ or "<" in code
146
+ or "props" in code
147
+ or "render" in code
80
148
)
0 commit comments