Skip to main content

brokk_bifrost_python/
knowledge.rs

1//! Analyzer-independent language rules.
2
3use brokk_bifrost_core::analyzer::CodeUnit;
4use brokk_bifrost_core::analyzer::Language;
5use brokk_bifrost_core::analyzer::ProjectFile;
6use brokk_bifrost_core::analyzer::language_knowledge::LanguageKnowledge;
7use brokk_bifrost_core::analyzer::language_knowledge::ParserFlavor;
8use brokk_bifrost_core::analyzer::project::Project;
9use brokk_bifrost_core::analyzer::structural::spec::StructuralSpec;
10
11/// Python syntax and static language rules.
12pub struct PythonKnowledge;
13
14impl LanguageKnowledge for PythonKnowledge {
15    fn unmarked_member_stores(
16        &self,
17    ) -> brokk_bifrost_core::analyzer::language_knowledge::UnmarkedMemberStores {
18        brokk_bifrost_core::analyzer::language_knowledge::UnmarkedMemberStores::Followable
19    }
20
21    fn declared_type_is_referent_immutable(&self, _canonical_type: &str) -> bool {
22        false
23    }
24
25    // Applicability decides whether a Python call returns or raises, not which
26    // declaration its callee reference names.
27    fn call_applicability_may_select_callee(&self) -> bool {
28        false
29    }
30
31    // Invocation validity does not choose a declaration's modeled result type.
32    // Native typing.overload selection is not modeled; decorated values retain
33    // their existing unknown-value evidence instead of overload alternatives.
34    fn callable_result_is_applicability_independent(&self) -> bool {
35        true
36    }
37
38    fn external_callee_expansion_requires_receiver_binding(&self) -> bool {
39        true
40    }
41
42    fn exact_external_call_keeps_import_boundary(&self) -> bool {
43        true
44    }
45
46    fn model_declarations_project_runtime_values(&self) -> bool {
47        true
48    }
49
50    fn model_declarations_supply_runtime_bases(&self) -> bool {
51        true
52    }
53
54    fn intrinsic_owners_use_source_member_rules(&self) -> bool {
55        true
56    }
57
58    fn qualified_type_lookups_use_value_namespace(&self) -> bool {
59        true
60    }
61
62    fn callable_expression_type_gap_is_value_only(&self) -> bool {
63        true
64    }
65
66    fn owned_members_are_not_lexically_scoped(&self) -> bool {
67        true
68    }
69
70    fn reassignments_are_one_declaration(&self) -> bool {
71        true
72    }
73
74    fn keyed_property_reads_container_element(&self) -> bool {
75        true
76    }
77
78    fn language(&self) -> Language {
79        Language::Python
80    }
81
82    fn path_synthetic_module_unit(
83        &self,
84        project: &dyn Project,
85        file: &ProjectFile,
86    ) -> Option<CodeUnit> {
87        use crate::declarations::module_code_unit;
88        module_code_unit(project, file)
89    }
90
91    fn parser_language(&self, _flavor: ParserFlavor) -> tree_sitter::Language {
92        tree_sitter_python::LANGUAGE.into()
93    }
94
95    fn structural_spec(&self) -> &'static dyn StructuralSpec {
96        &crate::structural::PYTHON_STRUCTURAL_SPEC
97    }
98
99    fn highlight_query(&self) -> Option<&'static str> {
100        Some(tree_sitter_python::HIGHLIGHTS_QUERY)
101    }
102}