1414
1515import logging
1616from dataclasses import dataclass
17- from pathlib import Path
18- from typing import TYPE_CHECKING
17+ from typing import TYPE_CHECKING , ClassVar
1918
2019if TYPE_CHECKING :
20+ from pathlib import Path
21+
2122 from codeflash .languages .base import FunctionInfo
2223
2324logger = logging .getLogger (__name__ )
@@ -57,7 +58,7 @@ class ConcurrencyInfo:
5758 async_method_calls : list [str ] = None
5859 """List of async/concurrent method calls."""
5960
60- def __post_init__ (self ):
61+ def __post_init__ (self ) -> None :
6162 if self .async_method_calls is None :
6263 self .async_method_calls = []
6364
@@ -66,7 +67,7 @@ class JavaConcurrencyAnalyzer:
6667 """Analyzes Java code for concurrency patterns."""
6768
6869 # Concurrent patterns to detect
69- COMPLETABLE_FUTURE_PATTERNS = {
70+ COMPLETABLE_FUTURE_PATTERNS : ClassVar [ set [ str ]] = {
7071 "CompletableFuture" ,
7172 "supplyAsync" ,
7273 "runAsync" ,
@@ -78,7 +79,7 @@ class JavaConcurrencyAnalyzer:
7879 "anyOf" ,
7980 }
8081
81- EXECUTOR_PATTERNS = {
82+ EXECUTOR_PATTERNS : ClassVar [ set [ str ]] = {
8283 "ExecutorService" ,
8384 "Executors" ,
8485 "ThreadPoolExecutor" ,
@@ -91,14 +92,14 @@ class JavaConcurrencyAnalyzer:
9192 "newWorkStealingPool" ,
9293 }
9394
94- VIRTUAL_THREAD_PATTERNS = {
95+ VIRTUAL_THREAD_PATTERNS : ClassVar [ set [ str ]] = {
9596 "newVirtualThreadPerTaskExecutor" ,
9697 "Thread.startVirtualThread" ,
9798 "Thread.ofVirtual" ,
9899 "VirtualThreads" ,
99100 }
100101
101- CONCURRENT_COLLECTION_PATTERNS = {
102+ CONCURRENT_COLLECTION_PATTERNS : ClassVar [ set [ str ]] = {
102103 "ConcurrentHashMap" ,
103104 "ConcurrentLinkedQueue" ,
104105 "ConcurrentLinkedDeque" ,
@@ -111,7 +112,7 @@ class JavaConcurrencyAnalyzer:
111112 "ArrayBlockingQueue" ,
112113 }
113114
114- ATOMIC_PATTERNS = {
115+ ATOMIC_PATTERNS : ClassVar [ set [ str ]] = {
115116 "AtomicInteger" ,
116117 "AtomicLong" ,
117118 "AtomicBoolean" ,
@@ -121,7 +122,7 @@ class JavaConcurrencyAnalyzer:
121122 "AtomicReferenceArray" ,
122123 }
123124
124- def __init__ (self , analyzer = None ):
125+ def __init__ (self , analyzer = None ) -> None :
125126 """Initialize concurrency analyzer.
126127
127128 Args:
@@ -145,13 +146,13 @@ def analyze_function(self, func: FunctionInfo, source: str | None = None) -> Con
145146 try :
146147 source = func .file_path .read_text (encoding = "utf-8" )
147148 except Exception as e :
148- logger .warning ("Failed to read source for %s: %s" , func .name , e )
149+ logger .warning ("Failed to read source for %s: %s" , func .function_name , e )
149150 return ConcurrencyInfo (is_concurrent = False , patterns = [])
150151
151152 # Extract function source
152153 lines = source .splitlines ()
153- func_start = func .start_line - 1 # Convert to 0-indexed
154- func_end = func .end_line
154+ func_start = func .starting_line - 1 # Convert to 0-indexed
155+ func_end = func .ending_line
155156 func_source = "\n " .join (lines [func_start :func_end ])
156157
157158 # Detect patterns
0 commit comments