Skip to content

Commit 7f4bee5

Browse files
committed
feat(analyzer): add return, method, and iterator issue categories
This commit further expands the issue categorization system to provide users with more fine-grained control over the analysis. Three new categories have been introduced: - **`return_issues`**: Groups all diagnostics related to function and method return values. - **`method_issues`**: Groups all diagnostics related to method access, visibility, and usage. - **`iterator_issues`**: Groups all diagnostics related to iterating over expressions, such as in `foreach` loops. These new categories can be disabled in `mago.toml`, allowing users to tailor the analysis more precisely to their project's needs. Signed-off-by: azjezz <[email protected]>
1 parent 14ba4bc commit 7f4bee5

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed

crates/analyzer/src/code.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,96 @@ impl IssueCode {
964964
"undefined-string-array-index",
965965
]
966966
}
967+
968+
pub const fn get_return_issue_codes() -> [Self; 9] {
969+
[
970+
Self::FalsableReturnStatement,
971+
Self::HiddenGeneratorReturn,
972+
Self::InvalidGeneratorReturnType,
973+
Self::InvalidReturnStatement,
974+
Self::LessSpecificNestedReturnStatement,
975+
Self::LessSpecificReturnStatement,
976+
Self::MixedReturnStatement,
977+
Self::NeverReturn,
978+
Self::NullableReturnStatement,
979+
]
980+
}
981+
982+
pub const fn get_return_issue_code_values() -> [&'static str; 9] {
983+
[
984+
"falsable-return-statement",
985+
"hidden-generator-return",
986+
"invalid-generator-return-type",
987+
"invalid-return-statement",
988+
"less-specific-nested-return-statement",
989+
"less-specific-return-statement",
990+
"mixed-return-statement",
991+
"never-return",
992+
"nullable-return-statement",
993+
]
994+
}
995+
996+
pub const fn get_method_issue_codes() -> [Self; 11] {
997+
[
998+
Self::AmbiguousObjectMethodAccess,
999+
Self::DeprecatedMethod,
1000+
Self::InvalidMethodAccess,
1001+
Self::InvalidStaticMethodAccess,
1002+
Self::InvalidStaticMethodCall,
1003+
Self::MethodAccessOnNull,
1004+
Self::MixedMethodAccess,
1005+
Self::NonExistentMethod,
1006+
Self::PossibleMethodAccessOnNull,
1007+
Self::UnimplementedAbstractMethod,
1008+
Self::UnusedMethodCall,
1009+
]
1010+
}
1011+
1012+
pub const fn get_method_issue_code_values() -> [&'static str; 11] {
1013+
[
1014+
"ambiguous-object-method-access",
1015+
"deprecated-method",
1016+
"invalid-method-access",
1017+
"invalid-static-method-access",
1018+
"invalid-static-method-call",
1019+
"method-access-on-null",
1020+
"mixed-method-access",
1021+
"non-existent-method",
1022+
"possible-method-access-on-null",
1023+
"unimplemented-abstract-method",
1024+
"unused-method-call",
1025+
]
1026+
}
1027+
1028+
pub const fn get_iterator_issue_codes() -> [Self; 10] {
1029+
[
1030+
Self::FalseIterator,
1031+
Self::InvalidIterator,
1032+
Self::NonIterableObjectIteration,
1033+
Self::NullIterator,
1034+
Self::PossiblyFalseIterator,
1035+
Self::PossiblyInvalidIterator,
1036+
Self::PossiblyNullIterator,
1037+
Self::UnknownIteratorType,
1038+
Self::UnknownYieldFromIteratorType,
1039+
Self::YieldFromNonIterable,
1040+
]
1041+
}
1042+
1043+
pub const fn get_iterator_issue_code_values() -> [&'static str; 10] {
1044+
[
1045+
"false-iterator",
1046+
"invalid-iterator",
1047+
"non-iterable-object-iteration",
1048+
"null-iterator",
1049+
"possibly-false-iterator",
1050+
"possibly-invalid-iterator",
1051+
"possibly-null-iterator",
1052+
"unknown-iterator-type",
1053+
"unknown-yield-from-iterator-type",
1054+
"yield-from-non-iterable",
1055+
]
1056+
}
9671057
}
9681058

9691059
impl std::str::FromStr for IssueCode {

crates/analyzer/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,18 @@ impl<'a> Analyzer<'a> {
135135
collector.add_disabled_codes(IssueCode::get_array_issue_code_values());
136136
}
137137

138+
if !self.settings.return_issues {
139+
collector.add_disabled_codes(IssueCode::get_return_issue_code_values());
140+
}
141+
142+
if !self.settings.method_issues {
143+
collector.add_disabled_codes(IssueCode::get_method_issue_code_values());
144+
}
145+
146+
if !self.settings.iterator_issues {
147+
collector.add_disabled_codes(IssueCode::get_iterator_issue_code_values());
148+
}
149+
138150
let mut context = {
139151
Context::new(
140152
self.interner,

crates/analyzer/src/settings.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ pub struct Settings {
5757
/// Report all issues related to array operations and usage. Defaults to `true`.
5858
pub array_issues: bool,
5959

60+
/// Report issues related to the return type of functions and methods. Defaults to `true`.
61+
pub return_issues: bool,
62+
63+
/// Report issues related to methods and their usage. Defaults to `true`.
64+
pub method_issues: bool,
65+
66+
/// Report issues related to iterators and their usage. Defaults to `true`.
67+
pub iterator_issues: bool,
68+
6069
/// Find and report expressions whose results are not used (e.g., `$a + $b;`). Defaults to `false`.
6170
pub find_unused_expressions: bool,
6271

@@ -123,6 +132,9 @@ impl Settings {
123132
property_issues: true,
124133
generator_issues: true,
125134
array_issues: true,
135+
return_issues: true,
136+
method_issues: true,
137+
iterator_issues: true,
126138
find_unused_expressions: false,
127139
find_unused_definitions: false,
128140
analyze_dead_code: false,

src/config/analyzer.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ pub struct AnalyzeConfiguration {
6565
/// Report all issues related to array operations and usage.
6666
pub array_issues: bool,
6767

68+
/// Report issues related to the return type of functions and methods.
69+
pub return_issues: bool,
70+
71+
/// Report issues related to methods and their usage.
72+
pub method_issues: bool,
73+
74+
/// Report issues related to iterators and their usage.
75+
pub iterator_issues: bool,
76+
6877
/// Whether to find unused expressions.
6978
pub find_unused_expressions: bool,
7079

@@ -113,6 +122,9 @@ impl AnalyzeConfiguration {
113122
property_issues: self.property_issues,
114123
generator_issues: self.generator_issues,
115124
array_issues: self.array_issues,
125+
return_issues: self.return_issues,
126+
method_issues: self.method_issues,
127+
iterator_issues: self.iterator_issues,
116128
analyze_dead_code: self.analyze_dead_code,
117129
find_unused_definitions: self.find_unused_definitions,
118130
find_unused_expressions: self.find_unused_expressions,
@@ -152,6 +164,9 @@ impl ConfigurationEntry for AnalyzeConfiguration {
152164
.set_default("analyze.property_issues", defaults.property_issues)?
153165
.set_default("analyze.generator_issues", defaults.generator_issues)?
154166
.set_default("analyze.array_issues", defaults.array_issues)?
167+
.set_default("analyze.return_issues", defaults.return_issues)?
168+
.set_default("analyze.method_issues", defaults.method_issues)?
169+
.set_default("analyze.iterator_issues", defaults.iterator_issues)?
155170
.set_default("analyze.find_unused_definitions", defaults.find_unused_definitions)?
156171
.set_default("analyze.find_unused_expressions", defaults.find_unused_expressions)?
157172
.set_default("analyze.analyze_dead_code", defaults.analyze_dead_code)?
@@ -187,6 +202,9 @@ impl Default for AnalyzeConfiguration {
187202
property_issues: defaults.property_issues,
188203
generator_issues: defaults.generator_issues,
189204
array_issues: defaults.array_issues,
205+
return_issues: defaults.return_issues,
206+
method_issues: defaults.method_issues,
207+
iterator_issues: defaults.iterator_issues,
190208
find_unused_expressions: defaults.find_unused_expressions,
191209
find_unused_definitions: defaults.find_unused_definitions,
192210
analyze_dead_code: defaults.analyze_dead_code,

0 commit comments

Comments
 (0)