Skip to content

Commit d010cbc

Browse files
committed
ensure type hints are reachable
1 parent 20a5176 commit d010cbc

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

codeflash/code_utils/static_analysis.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import ast
44
from enum import Enum
55
from pathlib import Path
6-
from typing import TYPE_CHECKING, TypeVar
6+
from typing import TYPE_CHECKING, TypeVar, get_type_hints
77

88
from pydantic import BaseModel, ConfigDict, field_validator
99

@@ -159,3 +159,12 @@ def has_typed_parameters(node: ast.FunctionDef | ast.AsyncFunctionDef, parents:
159159
if kind in [FunctionKind.CLASS_METHOD, FunctionKind.INSTANCE_METHOD]:
160160
return all(arg.annotation for arg in node.args.args[1:])
161161
return False
162+
163+
164+
def type_hints_reachable(node: ast.AST) -> bool:
165+
try:
166+
get_type_hints(node)
167+
except Exception:
168+
return False
169+
else:
170+
return True

codeflash/verification/concolic_testing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from codeflash.cli_cmds.console import console, logger
1111
from codeflash.code_utils.compat import SAFE_SYS_EXECUTABLE
1212
from codeflash.code_utils.concolic_utils import clean_concolic_tests
13-
from codeflash.code_utils.static_analysis import has_typed_parameters
13+
from codeflash.code_utils.static_analysis import has_typed_parameters, type_hints_reachable
1414
from codeflash.discovery.discover_unit_tests import discover_unit_tests
1515
from codeflash.telemetry.posthog_cf import ph
1616
from codeflash.verification.verification_utils import TestConfig
@@ -32,6 +32,7 @@ def generate_concolic_tests(
3232
test_cfg.concolic_test_root_dir
3333
and isinstance(function_to_optimize_ast, (ast.FunctionDef, ast.AsyncFunctionDef))
3434
and has_typed_parameters(function_to_optimize_ast, function_to_optimize.parents)
35+
and type_hints_reachable(function_to_optimize_ast)
3536
):
3637
logger.info("Generating concolic opcode coverage tests for the original code…")
3738
console.rule()

tests/test_static_analysis.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
analyze_imported_modules,
88
function_kind,
99
has_typed_parameters,
10+
type_hints_reachable,
1011
)
1112
from codeflash.models.models import FunctionParent
1213

@@ -100,3 +101,17 @@ def a_function(self, a) -> None:
100101
parents6 = [FunctionParent(name="a_class", type="ClassDef")]
101102
assert function_kind(node6, parents6) == FunctionKind.CLASS_METHOD
102103
assert not has_typed_parameters(node6, parents6)
104+
105+
code7 = """
106+
import pandas as pd
107+
from typing import get_type_hints
108+
"""
109+
110+
assert type_hints_reachable(code7) is False
111+
112+
code = """
113+
import numpy as np
114+
def foo(x, y):
115+
return x + y
116+
"""
117+
assert type_hints_reachable(code) is False

0 commit comments

Comments
 (0)