@zzzen/pyright-internal 1.2.0-dev.20220717 → 1.2.0-dev.20220807
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzer/analysis.js +1 -1
- package/dist/analyzer/analysis.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -0
- package/dist/analyzer/checker.js +57 -10
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +4 -5
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +9 -15
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/dataClasses.js +13 -4
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/enums.d.ts +13 -0
- package/dist/analyzer/enums.js +207 -0
- package/dist/analyzer/enums.js.map +1 -0
- package/dist/analyzer/importResolver.js +2 -2
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importStatementUtils.d.ts +8 -2
- package/dist/analyzer/importStatementUtils.js +75 -27
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +2 -0
- package/dist/analyzer/parseTreeUtils.js +76 -2
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +3 -3
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +2 -2
- package/dist/analyzer/program.js +10 -9
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/properties.js +1 -1
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/service.d.ts +3 -2
- package/dist/analyzer/service.js +40 -39
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +3 -1
- package/dist/analyzer/sourceFile.js +6 -0
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +631 -654
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +14 -12
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeEvaluatorWithTracker.js +1 -0
- package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
- package/dist/analyzer/typeGuards.d.ts +2 -0
- package/dist/analyzer/typeGuards.js +42 -14
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.js +8 -4
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +4 -4
- package/dist/analyzer/typeUtils.js +23 -38
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typedDicts.js +2 -2
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +7 -1
- package/dist/analyzer/types.js +70 -31
- package/dist/analyzer/types.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +2 -1
- package/dist/backgroundAnalysisBase.js +7 -0
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.js +1 -0
- package/dist/backgroundThreadBase.js.map +1 -1
- package/dist/commands/commandResult.js +1 -1
- package/dist/commands/commandResult.js.map +1 -1
- package/dist/common/chokidarFileWatcherProvider.d.ts +1 -2
- package/dist/common/chokidarFileWatcherProvider.js +0 -3
- package/dist/common/chokidarFileWatcherProvider.js.map +1 -1
- package/dist/common/configOptions.d.ts +1 -0
- package/dist/common/configOptions.js +4 -0
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/diagnosticRules.d.ts +1 -0
- package/dist/common/diagnosticRules.js +1 -0
- package/dist/common/diagnosticRules.js.map +1 -1
- package/dist/common/editAction.d.ts +6 -0
- package/dist/common/editAction.js +15 -0
- package/dist/common/editAction.js.map +1 -1
- package/dist/common/fileSystem.d.ts +4 -1
- package/dist/common/fileSystem.js +6 -4
- package/dist/common/fileSystem.js.map +1 -1
- package/dist/common/realFileSystem.d.ts +2 -2
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/textEditUtils.d.ts +22 -2
- package/dist/common/textEditUtils.js +138 -1
- package/dist/common/textEditUtils.js.map +1 -1
- package/dist/common/uriParser.d.ts +2 -0
- package/dist/common/uriParser.js +11 -0
- package/dist/common/uriParser.js.map +1 -1
- package/dist/common/workspaceEditUtils.d.ts +1 -0
- package/dist/common/workspaceEditUtils.js +10 -6
- package/dist/common/workspaceEditUtils.js.map +1 -1
- package/dist/languageServerBase.d.ts +15 -10
- package/dist/languageServerBase.js +47 -43
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/autoImporter.d.ts +23 -17
- package/dist/languageService/autoImporter.js +42 -30
- package/dist/languageService/autoImporter.js.map +1 -1
- package/dist/languageService/codeActionProvider.d.ts +2 -2
- package/dist/languageService/codeActionProvider.js +1 -1
- package/dist/languageService/codeActionProvider.js.map +1 -1
- package/dist/languageService/completionProvider.d.ts +2 -1
- package/dist/languageService/completionProvider.js +5 -2
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/importAdder.d.ts +2 -1
- package/dist/languageService/importAdder.js +9 -3
- package/dist/languageService/importAdder.js.map +1 -1
- package/dist/languageService/quickActions.js +1 -1
- package/dist/languageService/quickActions.js.map +1 -1
- package/dist/languageService/renameModuleProvider.d.ts +1 -4
- package/dist/languageService/renameModuleProvider.js +12 -48
- package/dist/languageService/renameModuleProvider.js.map +1 -1
- package/dist/localization/localize.d.ts +8 -0
- package/dist/localization/localize.js +2 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +2 -0
- package/dist/parser/parser.d.ts +1 -0
- package/dist/parser/parser.js +9 -2
- package/dist/parser/parser.js.map +1 -1
- package/dist/pyrightFileSystem.d.ts +19 -1
- package/dist/pyrightFileSystem.js +18 -1
- package/dist/pyrightFileSystem.js.map +1 -1
- package/dist/server.js +4 -4
- package/dist/server.js.map +1 -1
- package/dist/tests/chainedSourceFiles.test.js +2 -0
- package/dist/tests/chainedSourceFiles.test.js.map +1 -1
- package/dist/tests/checker.test.js +9 -0
- package/dist/tests/checker.test.js.map +1 -1
- package/dist/tests/fourslash/completions.commitChars.fourslash.js +12 -0
- package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +1 -1
- package/dist/tests/fourslash/hover.init.fourslash.js +2 -2
- package/dist/tests/fourslash/hover.init.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/fourSlashParser.js +5 -1
- package/dist/tests/harness/fourslash/fourSlashParser.js.map +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.js +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.js +8 -7
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/importAdder.test.js +17 -2
- package/dist/tests/importAdder.test.js.map +1 -1
- package/dist/tests/renameModuleTestUtils.js +5 -87
- package/dist/tests/renameModuleTestUtils.js.map +1 -1
- package/dist/tests/testState.test.js +1 -1
- package/dist/tests/testState.test.js.map +1 -1
- package/dist/tests/testStateUtils.d.ts +8 -0
- package/dist/tests/testStateUtils.js +110 -0
- package/dist/tests/testStateUtils.js.map +1 -0
- package/dist/tests/testUtils.js +1 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +5 -5
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +4 -0
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +12 -0
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +12 -0
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/workspaceMap.d.ts +1 -0
- package/dist/workspaceMap.js +11 -1
- package/dist/workspaceMap.js.map +1 -1
- package/package.json +3 -3
@@ -30,7 +30,7 @@ exports.analyzeProgram = exports.nullCallback = void 0;
|
|
30
30
|
const cancellationUtils_1 = require("../common/cancellationUtils");
|
31
31
|
const debug = __importStar(require("../common/debug"));
|
32
32
|
const timing_1 = require("../common/timing");
|
33
|
-
const nullCallback = (
|
33
|
+
const nullCallback = () => {
|
34
34
|
/* empty */
|
35
35
|
};
|
36
36
|
exports.nullCallback = nullCallback;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../src/analyzer/analysis.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;AAIH,mEAAuG;AAGvG,uDAAyC;AAEzC,6CAA4C;AAGrC,MAAM,YAAY,GAA6B,
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../src/analyzer/analysis.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;AAIH,mEAAuG;AAGvG,uDAAyC;AAEzC,6CAA4C;AAGrC,MAAM,YAAY,GAA6B,GAAG,EAAE;IACvD,WAAW;AACf,CAAC,CAAC;AAFW,QAAA,YAAY,gBAEvB;AAeF,SAAgB,cAAc,CAC1B,OAAgB,EAChB,OAAoC,EACpC,aAA4B,EAC5B,QAA8C,EAC9C,OAAyB,EACzB,KAAwB;IAExB,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,QAAQ,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,oBAAY,CAAC;IAEpC,IAAI;QACA,IAAA,gDAA4B,EAAC,KAAK,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAC;QAChC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAEpD,wCAAwC;QACxC,IAAI,mBAAmB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE;YAC3C,QAAQ,CAAC;gBACL,WAAW;gBACX,cAAc,EAAE,OAAO,CAAC,YAAY,EAAE;gBACtC,sBAAsB,EAAE,kBAAkB;gBAC1C,qBAAqB,EAAE,OAAO,CAAC,uBAAuB,EAAE;gBACxD,kBAAkB,EAAE,KAAK;gBACzB,wBAAwB,EAAE,KAAK;gBAC/B,WAAW;aACd,CAAC,CAAC;SACN;KACJ;IAAC,OAAO,CAAM,EAAE;QACb,IAAI,8CAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAClC,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,OAAO,CAAC,CAAC;QAEvD,QAAQ,CAAC;YACL,WAAW,EAAE,EAAE;YACf,cAAc,EAAE,CAAC;YACjB,sBAAsB,EAAE,CAAC;YACzB,qBAAqB,EAAE,IAAI;YAC3B,kBAAkB,EAAE,IAAI;YACxB,wBAAwB,EAAE,KAAK;YAC/B,WAAW,EAAE,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;SACvC,CAAC,CAAC;KACN;IAED,OAAO,aAAa,CAAC;AACzB,CAAC;AAxDD,wCAwDC"}
|
@@ -67,6 +67,7 @@ export declare class Checker extends ParseTreeWalker {
|
|
67
67
|
private _validateExhaustiveMatch;
|
68
68
|
private _suppressUnboundCheck;
|
69
69
|
private _validateIllegalDefaultParamInitializer;
|
70
|
+
private _validateContainmentTypes;
|
70
71
|
private _validateComparisonTypes;
|
71
72
|
private _isTypeComparable;
|
72
73
|
private _isTypeValidForUnusedValueTest;
|
package/dist/analyzer/checker.js
CHANGED
@@ -737,6 +737,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
737
737
|
this._validateComparisonTypes(node);
|
738
738
|
}
|
739
739
|
}
|
740
|
+
else if (node.operator === 41 /* In */ || node.operator === 42 /* NotIn */) {
|
741
|
+
// Don't apply this rule if it's within an assert.
|
742
|
+
if (!ParseTreeUtils.isWithinAssertExpression(node)) {
|
743
|
+
this._validateContainmentTypes(node);
|
744
|
+
}
|
745
|
+
}
|
740
746
|
this._evaluator.getType(node);
|
741
747
|
return true;
|
742
748
|
}
|
@@ -831,11 +837,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
831
837
|
return true;
|
832
838
|
}
|
833
839
|
visitDel(node) {
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
this.walk(expr);
|
838
|
-
});
|
840
|
+
node.expressions.forEach((expr) => {
|
841
|
+
this._evaluator.verifyDeleteExpression(expr);
|
842
|
+
this.walk(expr);
|
839
843
|
});
|
840
844
|
return false;
|
841
845
|
}
|
@@ -982,11 +986,46 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
982
986
|
}
|
983
987
|
}
|
984
988
|
}
|
989
|
+
_validateContainmentTypes(node) {
|
990
|
+
const leftType = this._evaluator.getType(node.leftExpression);
|
991
|
+
const containerType = this._evaluator.getType(node.rightExpression);
|
992
|
+
if (!leftType || !containerType) {
|
993
|
+
return;
|
994
|
+
}
|
995
|
+
if ((0, types_1.isNever)(leftType) || (0, types_1.isNever)(containerType)) {
|
996
|
+
return;
|
997
|
+
}
|
998
|
+
// Use the common narrowing logic for containment.
|
999
|
+
const elementType = (0, typeGuards_1.getElementTypeForContainerNarrowing)(containerType);
|
1000
|
+
if (!elementType) {
|
1001
|
+
return;
|
1002
|
+
}
|
1003
|
+
const narrowedType = (0, typeGuards_1.narrowTypeForContainerElementType)(this._evaluator, leftType, this._evaluator.makeTopLevelTypeVarsConcrete(elementType));
|
1004
|
+
if ((0, types_1.isNever)(narrowedType)) {
|
1005
|
+
const getMessage = () => {
|
1006
|
+
return node.operator === 41 /* In */
|
1007
|
+
? localize_1.Localizer.Diagnostic.containmentAlwaysFalse()
|
1008
|
+
: localize_1.Localizer.Diagnostic.containmentAlwaysTrue();
|
1009
|
+
};
|
1010
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnnecessaryContains, diagnosticRules_1.DiagnosticRule.reportUnnecessaryContains, getMessage().format({
|
1011
|
+
leftType: this._evaluator.printType(leftType, /* expandTypeAlias */ true),
|
1012
|
+
rightType: this._evaluator.printType(elementType, /* expandTypeAlias */ true),
|
1013
|
+
}), node);
|
1014
|
+
}
|
1015
|
+
}
|
985
1016
|
// Determines whether the types of the two operands for an == or != operation
|
986
1017
|
// have overlapping types.
|
987
1018
|
_validateComparisonTypes(node) {
|
1019
|
+
let rightExpression = node.rightExpression;
|
1020
|
+
// Check for chained comparisons.
|
1021
|
+
if (rightExpression.nodeType === 7 /* BinaryOperation */ &&
|
1022
|
+
!rightExpression.parenthesized &&
|
1023
|
+
ParseTreeUtils.operatorSupportsChaining(rightExpression.operator)) {
|
1024
|
+
// Use the left side of the right expression for comparison purposes.
|
1025
|
+
rightExpression = rightExpression.leftExpression;
|
1026
|
+
}
|
988
1027
|
const leftType = this._evaluator.getType(node.leftExpression);
|
989
|
-
const rightType = this._evaluator.getType(
|
1028
|
+
const rightType = this._evaluator.getType(rightExpression);
|
990
1029
|
if (!leftType || !rightType) {
|
991
1030
|
return;
|
992
1031
|
}
|
@@ -2235,7 +2274,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2235
2274
|
};
|
2236
2275
|
// If arg1IncludesSubclasses is true, it contains a Type[X] class rather than X. A Type[X]
|
2237
2276
|
// could be a subclass of X, so the "unnecessary isinstance check" may be legit.
|
2238
|
-
if (!arg1IncludesSubclasses && (0, types_1.isTypeSame)(filteredType, arg0Type,
|
2277
|
+
if (!arg1IncludesSubclasses && (0, types_1.isTypeSame)(filteredType, arg0Type, { ignorePseudoGeneric: true })) {
|
2239
2278
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnnecessaryIsInstance, diagnosticRules_1.DiagnosticRule.reportUnnecessaryIsInstance, isInstanceCheck
|
2240
2279
|
? localize_1.Localizer.Diagnostic.unnecessaryIsInstanceAlways().format({
|
2241
2280
|
testType: this._evaluator.printType(arg0Type, /* expandTypeAlias */ false),
|
@@ -2814,6 +2853,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2814
2853
|
if (this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable === 'none') {
|
2815
2854
|
return;
|
2816
2855
|
}
|
2856
|
+
// Protocol classes are exempted from this check.
|
2857
|
+
if (types_1.ClassType.isProtocolClass(classType)) {
|
2858
|
+
return;
|
2859
|
+
}
|
2817
2860
|
classType.details.fields.forEach((localSymbol, name) => {
|
2818
2861
|
// This applies only to instance members.
|
2819
2862
|
if (!localSymbol.isInstanceMember()) {
|
@@ -3478,6 +3521,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3478
3521
|
// Performs checks on a function that is located within a class
|
3479
3522
|
// and has been determined not to be a property accessor.
|
3480
3523
|
_validateMethod(node, functionType, classNode) {
|
3524
|
+
var _a, _b, _c, _d;
|
3481
3525
|
const classTypeInfo = this._evaluator.getTypeOfClass(classNode);
|
3482
3526
|
const classType = classTypeInfo === null || classTypeInfo === void 0 ? void 0 : classTypeInfo.classType;
|
3483
3527
|
if (node.name && classType) {
|
@@ -3490,7 +3534,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3490
3534
|
}
|
3491
3535
|
}
|
3492
3536
|
}
|
3493
|
-
if (node.name
|
3537
|
+
if (((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) === '__new__') {
|
3494
3538
|
// __new__ overrides should have a "cls" parameter.
|
3495
3539
|
if (node.parameters.length === 0 ||
|
3496
3540
|
!node.parameters[0].name ||
|
@@ -3501,7 +3545,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3501
3545
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
3502
3546
|
}
|
3503
3547
|
}
|
3504
|
-
else if (node.name
|
3548
|
+
else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '__init_subclass__') {
|
3505
3549
|
// __init_subclass__ overrides should have a "cls" parameter.
|
3506
3550
|
if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
|
3507
3551
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.initSubclassClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
|
@@ -3510,7 +3554,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3510
3554
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
3511
3555
|
}
|
3512
3556
|
}
|
3513
|
-
else if (node.name
|
3557
|
+
else if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.value) === '__class_getitem__') {
|
3514
3558
|
// __class_getitem__ overrides should have a "cls" parameter.
|
3515
3559
|
if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
|
3516
3560
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.classGetItemClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
|
@@ -3519,6 +3563,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3519
3563
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
3520
3564
|
}
|
3521
3565
|
}
|
3566
|
+
else if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.value) === '_generate_next_value_') {
|
3567
|
+
// Skip this check for _generate_next_value_.
|
3568
|
+
}
|
3522
3569
|
else if (types_1.FunctionType.isStaticMethod(functionType)) {
|
3523
3570
|
// Static methods should not have "self" or "cls" parameters.
|
3524
3571
|
if (node.parameters.length > 0 && node.parameters[0].name) {
|