@@ -110,10 +110,19 @@ public FunctionSymbolImpl(SymbolsProtos.FunctionSymbol functionSymbolProto, bool
110
110
ParameterState parameterState = new ParameterState ();
111
111
parameterState .positionalOnly = parameterSymbol .getKind () == SymbolsProtos .ParameterKind .POSITIONAL_ONLY ;
112
112
parameterState .keywordOnly = parameterSymbol .getKind () == SymbolsProtos .ParameterKind .KEYWORD_ONLY ;
113
- boolean isVariadic = (parameterSymbol .getKind () == SymbolsProtos .ParameterKind .VAR_KEYWORD ) || parameterSymbol .getKind () == SymbolsProtos .ParameterKind .VAR_POSITIONAL ;
114
- hasVariadicParameter |= isVariadic ;
115
- ParameterImpl parameter = new ParameterImpl (
116
- parameterSymbol .getName (), anyType (), null , parameterSymbol .getHasDefault (), isVariadic , parameterState , null , parameterSymbol .getTypeAnnotation ());
113
+ boolean isKeywordVariadic = parameterSymbol .getKind () == SymbolsProtos .ParameterKind .VAR_KEYWORD ;
114
+ boolean isPositionalVariadic = parameterSymbol .getKind () == SymbolsProtos .ParameterKind .VAR_POSITIONAL ;
115
+ hasVariadicParameter |= isKeywordVariadic || isPositionalVariadic ;
116
+ InferredType declaredType ;
117
+ if (isPositionalVariadic ) {
118
+ declaredType = InferredTypes .TUPLE ;
119
+ } else if (isKeywordVariadic ) {
120
+ declaredType = InferredTypes .DICT ;
121
+ } else {
122
+ declaredType = anyType ();
123
+ }
124
+ ParameterImpl parameter = new ParameterImpl (parameterSymbol .getName (), declaredType , null , parameterSymbol .getHasDefault (), parameterState ,
125
+ isKeywordVariadic , isPositionalVariadic , parameterSymbol .getTypeAnnotation (), null );
117
126
parameters .add (parameter );
118
127
}
119
128
functionDefinitionLocation = null ;
@@ -209,7 +218,7 @@ private void createParameterNames(List<AnyParameter> parameterTrees, @Nullable S
209
218
if (anyParameter .is (Tree .Kind .PARAMETER )) {
210
219
addParameter ((org .sonar .plugins .python .api .tree .Parameter ) anyParameter , fileId , parameterState );
211
220
} else {
212
- parameters .add (new ParameterImpl (null , InferredTypes .anyType (), null , false , false , parameterState , locationInFile (anyParameter , fileId ), null ));
221
+ parameters .add (new ParameterImpl (null , InferredTypes .anyType (), null , false , parameterState , false , false , null , locationInFile (anyParameter , fileId )));
213
222
}
214
223
}
215
224
}
@@ -218,9 +227,9 @@ private void addParameter(org.sonar.plugins.python.api.tree.Parameter parameter,
218
227
Name parameterName = parameter .name ();
219
228
Token starToken = parameter .starToken ();
220
229
if (parameterName != null ) {
221
- InferredType declaredType = getParameterType (parameter , starToken );
222
- this .parameters .add (new ParameterImpl (parameterName .name (), declaredType , annotatedTypeName (parameter .typeAnnotation ()), parameter .defaultValue () != null ,
223
- starToken != null , parameterState , locationInFile (parameter , fileId ), null ));
230
+ ParameterType parameterType = getParameterType (parameter );
231
+ this .parameters .add (new ParameterImpl (parameterName .name (), parameterType . inferredType , annotatedTypeName (parameter .typeAnnotation ()), parameter .defaultValue () != null ,
232
+ parameterState , parameterType . isKeywordVariadic , parameterType . isPositionalVariadic , null , locationInFile (parameter , fileId )));
224
233
if (starToken != null ) {
225
234
hasVariadicParameter = true ;
226
235
parameterState .keywordOnly = true ;
@@ -237,24 +246,31 @@ private void addParameter(org.sonar.plugins.python.api.tree.Parameter parameter,
237
246
}
238
247
}
239
248
240
- private InferredType getParameterType (org .sonar .plugins .python .api .tree .Parameter parameter , @ Nullable Token starToken ) {
249
+ private ParameterType getParameterType (org .sonar .plugins .python .api .tree .Parameter parameter ) {
250
+ InferredType inferredType = InferredTypes .anyType ();
251
+ boolean isPositionalVariadic = false ;
252
+ boolean isKeywordVariadic = false ;
253
+ Token starToken = parameter .starToken ();
241
254
if (starToken != null ) {
242
255
// https://docs.python.org/3/reference/compound_stmts.html#function-definitions
256
+ hasVariadicParameter = true ;
243
257
if ("*" .equals (starToken .value ())) {
244
258
// if the form “*identifier” is present, it is initialized to a tuple receiving any excess positional parameters
245
- return InferredTypes .TUPLE ;
259
+ isPositionalVariadic = true ;
260
+ inferredType = InferredTypes .TUPLE ;
246
261
}
247
262
if ("**" .equals (starToken .value ())) {
248
263
// If the form “**identifier” is present, it is initialized to a new ordered mapping receiving any excess keyword arguments
249
- return InferredTypes .DICT ;
264
+ isKeywordVariadic = true ;
265
+ inferredType = InferredTypes .DICT ;
266
+ }
267
+ } else {
268
+ TypeAnnotation typeAnnotation = parameter .typeAnnotation ();
269
+ if (typeAnnotation != null ) {
270
+ inferredType = isStub ? fromTypeshedTypeAnnotation (typeAnnotation ) : fromTypeAnnotation (typeAnnotation );
250
271
}
251
272
}
252
- InferredType declaredType = InferredTypes .anyType ();
253
- TypeAnnotation typeAnnotation = parameter .typeAnnotation ();
254
- if (typeAnnotation != null ) {
255
- declaredType = isStub ? fromTypeshedTypeAnnotation (typeAnnotation ) : fromTypeAnnotation (typeAnnotation );
256
- }
257
- return declaredType ;
273
+ return new ParameterType (inferredType , isKeywordVariadic , isPositionalVariadic );
258
274
}
259
275
260
276
@ Override
@@ -309,6 +325,18 @@ public InferredType declaredReturnType() {
309
325
}
310
326
return declaredReturnType ;
311
327
}
328
+
329
+ static class ParameterType {
330
+ InferredType inferredType ;
331
+ boolean isPositionalVariadic ;
332
+ boolean isKeywordVariadic ;
333
+
334
+ public ParameterType (InferredType inferredType , boolean isKeywordVariadic , boolean isPositionalVariadic ) {
335
+ this .inferredType = inferredType ;
336
+ this .isKeywordVariadic = isKeywordVariadic ;
337
+ this .isPositionalVariadic = isPositionalVariadic ;
338
+ }
339
+ }
312
340
313
341
public void setAnnotatedReturnTypeName (@ Nullable TypeAnnotation returnTypeAnnotation ) {
314
342
annotatedReturnTypeName = annotatedTypeName (returnTypeAnnotation );
@@ -354,18 +382,20 @@ public static class ParameterImpl implements Parameter {
354
382
private SymbolsProtos .Type protobufType ;
355
383
private final String annotatedTypeName ;
356
384
private final boolean hasDefaultValue ;
357
- private final boolean isVariadic ;
385
+ private final boolean isKeywordVariadic ;
386
+ private final boolean isPositionalVariadic ;
358
387
private final boolean isKeywordOnly ;
359
388
private final boolean isPositionalOnly ;
360
389
private final LocationInFile location ;
361
390
private boolean hasReadDeclaredType = false ;
362
391
363
392
ParameterImpl (@ Nullable String name , InferredType declaredType , @ Nullable String annotatedTypeName , boolean hasDefaultValue ,
364
- boolean isVariadic , ParameterState parameterState , @ Nullable LocationInFile location , @ Nullable SymbolsProtos . Type protobufType ) {
393
+ ParameterState parameterState , boolean isKeywordVariadic , boolean isPositionalVariadic , @ Nullable SymbolsProtos . Type protobufType , @ Nullable LocationInFile location ) {
365
394
this .name = name ;
366
395
this .declaredType = declaredType ;
367
396
this .hasDefaultValue = hasDefaultValue ;
368
- this .isVariadic = isVariadic ;
397
+ this .isKeywordVariadic = isKeywordVariadic ;
398
+ this .isPositionalVariadic = isPositionalVariadic ;
369
399
this .isKeywordOnly = parameterState .keywordOnly ;
370
400
this .isPositionalOnly = parameterState .positionalOnly ;
371
401
this .location = location ;
@@ -376,7 +406,8 @@ public static class ParameterImpl implements Parameter {
376
406
public ParameterImpl (FunctionDescriptor .Parameter parameterDescriptor ) {
377
407
this .name = parameterDescriptor .name ();
378
408
this .hasDefaultValue = parameterDescriptor .hasDefaultValue ();
379
- this .isVariadic = parameterDescriptor .isVariadic ();
409
+ this .isPositionalVariadic = parameterDescriptor .isPositionalVariadic ();
410
+ this .isKeywordVariadic = parameterDescriptor .isKeywordVariadic ();
380
411
this .isKeywordOnly = parameterDescriptor .isKeywordOnly ();
381
412
this .isPositionalOnly = parameterDescriptor .isPositionalOnly ();
382
413
this .location = parameterDescriptor .location ();
@@ -414,7 +445,7 @@ public boolean hasDefaultValue() {
414
445
415
446
@ Override
416
447
public boolean isVariadic () {
417
- return isVariadic ;
448
+ return isKeywordVariadic || isPositionalVariadic ;
418
449
}
419
450
420
451
@ Override
@@ -427,6 +458,16 @@ public boolean isPositionalOnly() {
427
458
return isPositionalOnly ;
428
459
}
429
460
461
+ @ Override
462
+ public boolean isKeywordVariadic () {
463
+ return isKeywordVariadic ;
464
+ }
465
+
466
+ @ Override
467
+ public boolean isPositionalVariadic () {
468
+ return isPositionalVariadic ;
469
+ }
470
+
430
471
@ CheckForNull
431
472
@ Override
432
473
public LocationInFile location () {
0 commit comments