Skip to content

Commit

Permalink
Gate get_origin_node_ids to only return ids with nodes that exist
Browse files Browse the repository at this point in the history
  • Loading branch information
muglug committed Apr 3, 2024
1 parent aa89368 commit 95e7a95
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 54 deletions.
15 changes: 8 additions & 7 deletions src/code_info/data_flow/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@ impl DataFlowGraph {

pub fn add_node(&mut self, node: DataFlowNode) {
match &node.kind {
DataFlowNodeKind::Vertex {
is_specialized, ..
} => {
DataFlowNodeKind::Vertex { is_specialized, .. } => {
if let GraphKind::WholeProgram(_) = &self.kind {
if *is_specialized {
let (unspecialized_id, specialization_key) = node.id.unspecialize();
Expand Down Expand Up @@ -184,10 +182,12 @@ impl DataFlowGraph {
}
}

if !visited_child_ids.contains(from_id) {
new_parent_nodes.insert(from_id.clone());
} else {
has_visited_a_parent_already = true;
if self.get_node(from_id).is_some() {
if !visited_child_ids.contains(from_id) {
new_parent_nodes.insert(from_id.clone());
} else {
has_visited_a_parent_already = true;
}
}
}
}
Expand All @@ -212,6 +212,7 @@ impl DataFlowGraph {
origin_nodes
}

#[inline]
pub fn get_node(&self, id: &DataFlowNodeId) -> Option<&DataFlowNode> {
if let Some(node) = self.vertices.get(id) {
Some(node)
Expand Down
77 changes: 36 additions & 41 deletions src/file_scanner_analyzer/unused_symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ pub(crate) fn find_unused_definitions(
}

let referenced_symbols_and_members = referenced_symbols_and_members
.into_iter()
.map(|(k, _)| k)
.into_keys()
.collect::<FxHashSet<_>>();

let referenced_overridden_class_members = analysis_result
Expand All @@ -65,8 +64,7 @@ pub(crate) fn find_unused_definitions(
}

let referenced_overridden_class_members = referenced_overridden_class_members
.into_iter()
.map(|(k, _)| k)
.into_keys()
.collect::<FxHashSet<_>>();

'outer1: for (functionlike_name, functionlike_info) in &codebase.functionlike_infos {
Expand All @@ -86,7 +84,7 @@ pub(crate) fn find_unused_definitions(
}
}

if !referenced_symbols_and_members.contains(&functionlike_name) {
if !referenced_symbols_and_members.contains(functionlike_name) {
if functionlike_info
.suppressed_issues
.iter()
Expand Down Expand Up @@ -136,7 +134,7 @@ pub(crate) fn find_unused_definitions(
.push(issue);
}
} else if functionlike_info.is_production_code
&& !referenced_symbols_and_members_in_production.contains(&functionlike_name)
&& !referenced_symbols_and_members_in_production.contains(functionlike_name)
&& config.allow_issue_kind_in_file(&IssueKind::OnlyUsedInTests, file_path)
{
let issue = Issue::new(
Expand Down Expand Up @@ -243,7 +241,7 @@ pub(crate) fn find_unused_definitions(
IssueKind::OnlyUsedInTests,
format!(
"Production-code class {} is only used in tests — if this is deliberate add the <<Hakana\\TestOnly>> attribute",
interner.lookup(&classlike_name)
interner.lookup(classlike_name)
),
*pos,
&Some(FunctionLikeIdentifier::Function(*classlike_name)),
Expand Down Expand Up @@ -362,48 +360,45 @@ pub(crate) fn find_unused_definitions(
.or_default()
.push(issue);
}
} else {
if !classlike_only_used_in_tests
&& classlike_info.is_production_code
&& config
.allow_issue_kind_in_file(&IssueKind::OnlyUsedInTests, file_path)
&& !classlike_info
.suppressed_issues
.iter()
.any(|(issue, _)| matches!(issue, IssueKind::OnlyUsedInTests))
&& !referenced_symbols_and_members_in_production
.contains(&(*classlike_name, *method_name_ptr))
&& !referenced_overridden_class_members_in_production.contains(&pair)
&& !is_method_referenced_somewhere_else(
classlike_name,
method_name_ptr,
codebase,
classlike_info,
&referenced_symbols_and_members_in_production,
)
{
let issue = Issue::new(
} else if !classlike_only_used_in_tests
&& classlike_info.is_production_code
&& config.allow_issue_kind_in_file(&IssueKind::OnlyUsedInTests, file_path)
&& !classlike_info
.suppressed_issues
.iter()
.any(|(issue, _)| matches!(issue, IssueKind::OnlyUsedInTests))
&& !referenced_symbols_and_members_in_production
.contains(&(*classlike_name, *method_name_ptr))
&& !referenced_overridden_class_members_in_production.contains(&pair)
&& !is_method_referenced_somewhere_else(
classlike_name,
method_name_ptr,
codebase,
classlike_info,
&referenced_symbols_and_members_in_production,
)
{
let issue = Issue::new(
IssueKind::OnlyUsedInTests,
format!(
"Production-code method {}::{} is only used in tests — if this is deliberate add the <<Hakana\\TestOnly>> attribute",
interner.lookup(&classlike_name),
interner.lookup(&method_name_ptr)
interner.lookup(classlike_name),
interner.lookup(method_name_ptr)
),
*pos,
&Some(FunctionLikeIdentifier::Method(*classlike_name, *method_name_ptr)),
);

if config.can_add_issue(&issue) {
*analysis_result
.issue_counts
.entry(issue.kind.clone())
.or_insert(0) += 1;
analysis_result
.emitted_definition_issues
.entry(pos.file_path)
.or_default()
.push(issue);
}
if config.can_add_issue(&issue) {
*analysis_result
.issue_counts
.entry(issue.kind.clone())
.or_insert(0) += 1;
analysis_result
.emitted_definition_issues
.entry(pos.file_path)
.or_default()
.push(issue);
}
}
}
Expand Down
10 changes: 4 additions & 6 deletions src/ttype/type_comparator/atomic_type_comparator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -733,12 +733,10 @@ pub fn is_contained_by(
{
if let Some(input_class_name) = input_class_name {
return input_class_name == container_enum_name;
} else {
if let Some(classlike_info) =
codebase.classlike_infos.get(container_enum_name)
{
return classlike_info.constants.contains_key(input_member_name);
}
} else if let Some(classlike_info) =
codebase.classlike_infos.get(container_enum_name)
{
return classlike_info.constants.contains_key(input_member_name);
}
} else {
return false;
Expand Down

0 comments on commit 95e7a95

Please sign in to comment.