Skip to content

Commit fcf38ee

Browse files
S2638: Avoid NPE on separator parameters (SonarSource#636)
1 parent da04c8a commit fcf38ee

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

python-checks/src/main/java/org/sonar/python/checks/ChangeMethodContractCheck.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.sonar.plugins.python.api.symbols.Symbol;
3636
import org.sonar.plugins.python.api.tree.AnyParameter;
3737
import org.sonar.plugins.python.api.tree.FunctionDef;
38+
import org.sonar.plugins.python.api.tree.Name;
3839
import org.sonar.plugins.python.api.tree.Parameter;
3940
import org.sonar.python.semantic.FunctionSymbolImpl;
4041
import org.sonar.python.tree.TreeUtils;
@@ -131,8 +132,9 @@ private static void reportOnExtraParameters(SubscriptionContext ctx, int indexFi
131132
List<Parameter> parameters = TreeUtils.nonTupleParameters(functionDef);
132133
for (int i = indexFirstExtraParams; i < parameters.size(); i++) {
133134
Parameter parameter = parameters.get(i);
134-
if (parameter.defaultValue() == null) {
135-
PreciseIssue preciseIssue = ctx.addIssue(parameter, "Remove parameter " + parameter.name().name() + " or provide default value.");
135+
Name name = parameter.name();
136+
if (parameter.defaultValue() == null && name != null) {
137+
PreciseIssue preciseIssue = ctx.addIssue(parameter, "Remove parameter " + name.name() + " or provide default value.");
136138
addDefinitionSecondaryLocation(preciseIssue, definitionLocation);
137139
}
138140
}

python-checks/src/test/resources/checks/changeMethodContract.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,11 @@ class Intermediate(ParentClass): ...
7070
class TransitivelyOverriding(Intermediate):
7171
def my_method(self): ... # Noncompliant
7272
def compliant(self, param1): ...
73+
74+
class KeywordOnlyParameters(ParentClass):
75+
def my_method(self, param1, *, param2): ... # Noncompliant
76+
# ^^^^^^
77+
78+
class PositionalOnlyParameters(ParentClass):
79+
def my_method(self, param1, /, param2): ... # Noncompliant
80+
# ^^^^^^

0 commit comments

Comments
 (0)