@zzzen/pyright-internal 1.2.0-beta → 1.2.0-dev.20220710

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.
Files changed (130) hide show
  1. package/README.md +82 -1
  2. package/dist/analyzer/aliasDeclarationUtils.js +2 -2
  3. package/dist/analyzer/analyzerFileInfo.d.ts +2 -1
  4. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  5. package/dist/analyzer/analyzerNodeInfo.d.ts +4 -1
  6. package/dist/analyzer/analyzerNodeInfo.js +12 -1
  7. package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
  8. package/dist/analyzer/binder.d.ts +6 -1
  9. package/dist/analyzer/binder.js +134 -31
  10. package/dist/analyzer/binder.js.map +1 -1
  11. package/dist/analyzer/checker.d.ts +4 -1
  12. package/dist/analyzer/checker.js +129 -48
  13. package/dist/analyzer/checker.js.map +1 -1
  14. package/dist/analyzer/codeFlowEngine.js +6 -1
  15. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  16. package/dist/analyzer/constraintSolver.js +8 -5
  17. package/dist/analyzer/constraintSolver.js.map +1 -1
  18. package/dist/analyzer/declaration.d.ts +18 -6
  19. package/dist/analyzer/declaration.js +19 -9
  20. package/dist/analyzer/declaration.js.map +1 -1
  21. package/dist/analyzer/declarationUtils.d.ts +1 -1
  22. package/dist/analyzer/declarationUtils.js +19 -16
  23. package/dist/analyzer/declarationUtils.js.map +1 -1
  24. package/dist/analyzer/functionTransform.js +2 -1
  25. package/dist/analyzer/functionTransform.js.map +1 -1
  26. package/dist/analyzer/packageTypeVerifier.js +6 -6
  27. package/dist/analyzer/parseTreeUtils.d.ts +3 -3
  28. package/dist/analyzer/parseTreeUtils.js +28 -18
  29. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  30. package/dist/analyzer/parseTreeWalker.d.ts +4 -1
  31. package/dist/analyzer/parseTreeWalker.js +19 -1
  32. package/dist/analyzer/parseTreeWalker.js.map +1 -1
  33. package/dist/analyzer/patternMatching.js +1 -1
  34. package/dist/analyzer/patternMatching.js.map +1 -1
  35. package/dist/analyzer/program.d.ts +2 -2
  36. package/dist/analyzer/program.js +1 -1
  37. package/dist/analyzer/program.js.map +1 -1
  38. package/dist/analyzer/properties.js +2 -0
  39. package/dist/analyzer/properties.js.map +1 -1
  40. package/dist/analyzer/protocols.d.ts +0 -1
  41. package/dist/analyzer/protocols.js +1 -63
  42. package/dist/analyzer/protocols.js.map +1 -1
  43. package/dist/analyzer/service.d.ts +3 -2
  44. package/dist/analyzer/service.js +3 -2
  45. package/dist/analyzer/service.js.map +1 -1
  46. package/dist/analyzer/sourceFile.d.ts +6 -1
  47. package/dist/analyzer/sourceFile.js +17 -5
  48. package/dist/analyzer/sourceFile.js.map +1 -1
  49. package/dist/analyzer/tracePrinter.js +8 -4
  50. package/dist/analyzer/tracePrinter.js.map +1 -1
  51. package/dist/analyzer/typeDocStringUtils.js +1 -1
  52. package/dist/analyzer/typeEvaluator.js +692 -293
  53. package/dist/analyzer/typeEvaluator.js.map +1 -1
  54. package/dist/analyzer/typeEvaluatorTypes.d.ts +5 -3
  55. package/dist/analyzer/typeEvaluatorWithTracker.js +2 -0
  56. package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
  57. package/dist/analyzer/typeGuards.js +5 -0
  58. package/dist/analyzer/typeGuards.js.map +1 -1
  59. package/dist/analyzer/typePrinter.js +4 -1
  60. package/dist/analyzer/typePrinter.js.map +1 -1
  61. package/dist/analyzer/typeStubWriter.d.ts +4 -1
  62. package/dist/analyzer/typeStubWriter.js +36 -0
  63. package/dist/analyzer/typeStubWriter.js.map +1 -1
  64. package/dist/analyzer/typeUtils.d.ts +1 -1
  65. package/dist/analyzer/typeUtils.js +14 -9
  66. package/dist/analyzer/typeUtils.js.map +1 -1
  67. package/dist/analyzer/typedDicts.js +3 -1
  68. package/dist/analyzer/typedDicts.js.map +1 -1
  69. package/dist/analyzer/types.d.ts +13 -5
  70. package/dist/analyzer/types.js +34 -11
  71. package/dist/analyzer/types.js.map +1 -1
  72. package/dist/languageServerBase.d.ts +3 -2
  73. package/dist/languageServerBase.js +3 -2
  74. package/dist/languageServerBase.js.map +1 -1
  75. package/dist/languageService/autoImporter.js +1 -1
  76. package/dist/languageService/callHierarchyProvider.js +9 -9
  77. package/dist/languageService/completionProvider.js +19 -13
  78. package/dist/languageService/completionProvider.js.map +1 -1
  79. package/dist/languageService/definitionProvider.js +3 -3
  80. package/dist/languageService/documentSymbolCollector.js +1 -1
  81. package/dist/languageService/documentSymbolProvider.js +10 -7
  82. package/dist/languageService/documentSymbolProvider.js.map +1 -1
  83. package/dist/languageService/hoverProvider.js +19 -5
  84. package/dist/languageService/hoverProvider.js.map +1 -1
  85. package/dist/languageService/indentationUtils.js +3 -2
  86. package/dist/languageService/indentationUtils.js.map +1 -1
  87. package/dist/languageService/insertionPointUtils.d.ts +9 -0
  88. package/dist/languageService/insertionPointUtils.js +110 -0
  89. package/dist/languageService/insertionPointUtils.js.map +1 -0
  90. package/dist/languageService/referencesProvider.js +8 -5
  91. package/dist/languageService/referencesProvider.js.map +1 -1
  92. package/dist/languageService/signatureHelpProvider.js +4 -2
  93. package/dist/languageService/signatureHelpProvider.js.map +1 -1
  94. package/dist/languageService/tooltipUtils.js +1 -1
  95. package/dist/localization/localize.d.ts +27 -0
  96. package/dist/localization/localize.js +16 -0
  97. package/dist/localization/localize.js.map +1 -1
  98. package/dist/localization/package.nls.en-us.json +18 -2
  99. package/dist/parser/parseNodes.d.ts +41 -5
  100. package/dist/parser/parseNodes.js +83 -4
  101. package/dist/parser/parseNodes.js.map +1 -1
  102. package/dist/parser/parser.d.ts +5 -1
  103. package/dist/parser/parser.js +131 -13
  104. package/dist/parser/parser.js.map +1 -1
  105. package/dist/parser/tokenizer.d.ts +2 -1
  106. package/dist/parser/tokenizer.js +7 -5
  107. package/dist/parser/tokenizer.js.map +1 -1
  108. package/dist/parser/tokenizerTypes.d.ts +5 -3
  109. package/dist/parser/tokenizerTypes.js +6 -4
  110. package/dist/parser/tokenizerTypes.js.map +1 -1
  111. package/dist/tests/chainedSourceFiles.test.js +2 -1
  112. package/dist/tests/chainedSourceFiles.test.js.map +1 -1
  113. package/dist/tests/fourslash/import.multipart.fourslash.d.ts +1 -0
  114. package/dist/tests/fourslash/import.multipart.fourslash.js +18 -0
  115. package/dist/tests/fourslash/import.multipart.fourslash.js.map +1 -0
  116. package/dist/tests/fourslash/signature.simple.fourslash.js +16 -0
  117. package/dist/tests/fourslash/signature.simple.fourslash.js.map +1 -1
  118. package/dist/tests/insertionPointUtils.test.d.ts +1 -0
  119. package/dist/tests/insertionPointUtils.test.js +74 -0
  120. package/dist/tests/insertionPointUtils.test.js.map +1 -0
  121. package/dist/tests/testUtils.js +2 -1
  122. package/dist/tests/testUtils.js.map +1 -1
  123. package/dist/tests/typeEvaluator3.test.js +8 -0
  124. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  125. package/dist/tests/typeEvaluator4.test.js +10 -0
  126. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  127. package/dist/tests/typeEvaluator5.test.d.ts +1 -0
  128. package/dist/tests/typeEvaluator5.test.js +118 -0
  129. package/dist/tests/typeEvaluator5.test.js.map +1 -0
  130. package/package.json +3 -2
@@ -50,8 +50,8 @@ const importStatementUtils_1 = require("./importStatementUtils");
50
50
  const ParseTreeUtils = __importStar(require("./parseTreeUtils"));
51
51
  const parseTreeWalker_1 = require("./parseTreeWalker");
52
52
  const patternMatching_1 = require("./patternMatching");
53
- const protocols_1 = require("./protocols");
54
53
  const scopeUtils_1 = require("./scopeUtils");
54
+ const sourceFile_1 = require("./sourceFile");
55
55
  const sourceMapper_1 = require("./sourceMapper");
56
56
  const staticExpressions_1 = require("./staticExpressions");
57
57
  const SymbolNameUtils = __importStar(require("./symbolNameUtils"));
@@ -111,6 +111,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
111
111
  // A list of all nodes that are defined within the module that
112
112
  // have their own scopes.
113
113
  this._scopedNodes = [];
114
+ // A list of all visited type parameter lists.
115
+ this._typeParameterLists = [];
114
116
  this._fileInfo = AnalyzerNodeInfo.getFileInfo(_moduleNode);
115
117
  }
116
118
  check() {
@@ -156,6 +158,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
156
158
  }
157
159
  visitClass(node) {
158
160
  const classTypeResult = this._evaluator.getTypeOfClass(node);
161
+ if (node.typeParameters) {
162
+ this.walk(node.typeParameters);
163
+ }
159
164
  this.walk(node.suite);
160
165
  this.walkMultiple(node.decorators);
161
166
  this.walkMultiple(node.arguments);
@@ -211,6 +216,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
211
216
  }
212
217
  visitFunction(node) {
213
218
  var _a;
219
+ if (node.typeParameters) {
220
+ this.walk(node.typeParameters);
221
+ }
214
222
  const functionTypeResult = this._evaluator.getTypeOfFunction(node);
215
223
  const containingClassNode = ParseTreeUtils.getEnclosingClass(node, /* stopAtFunction */ true);
216
224
  if (functionTypeResult) {
@@ -320,7 +328,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
320
328
  if (annotationNode && index < functionTypeResult.functionType.details.parameters.length) {
321
329
  const paramType = functionTypeResult.functionType.details.parameters[index].type;
322
330
  if ((0, types_1.isTypeVar)(paramType) &&
323
- paramType.details.variance === 1 /* Covariant */ &&
331
+ paramType.details.declaredVariance === 3 /* Covariant */ &&
324
332
  !paramType.details.isSynthesized &&
325
333
  functionTypeResult.functionType.details.name !== '__init__') {
326
334
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.paramTypeCovariant(), annotationNode);
@@ -854,6 +862,13 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
854
862
  }
855
863
  return false;
856
864
  }
865
+ visitTypeParameterList(node) {
866
+ this._typeParameterLists.push(node);
867
+ return true;
868
+ }
869
+ visitTypeParameter(node) {
870
+ return false;
871
+ }
857
872
  visitTypeAnnotation(node) {
858
873
  this._evaluator.getType(node.typeAnnotation);
859
874
  return true;
@@ -1313,7 +1328,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1313
1328
  return undefined;
1314
1329
  }
1315
1330
  for (const decl of decls) {
1316
- if (decl.type === 3 /* Function */) {
1331
+ if (decl.type === 5 /* Function */) {
1317
1332
  const functionType = this._evaluator.getTypeOfFunction(decl.node);
1318
1333
  if ((functionType === null || functionType === void 0 ? void 0 : functionType.functionType) === overloadType) {
1319
1334
  return decl.node;
@@ -1542,12 +1557,26 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1542
1557
  });
1543
1558
  }
1544
1559
  }
1560
+ // Report unaccessed type parameters.
1561
+ const accessedSymbolSet = this._fileInfo.accessedSymbolSet;
1562
+ for (const paramList of this._typeParameterLists) {
1563
+ for (const param of paramList.parameters) {
1564
+ const symbol = AnalyzerNodeInfo.getTypeParameterSymbol(param.name);
1565
+ (0, debug_1.assert)(symbol);
1566
+ if (!accessedSymbolSet.has(symbol.id)) {
1567
+ const decls = symbol.getDeclarations();
1568
+ decls.forEach((decl) => {
1569
+ this._conditionallyReportUnusedDeclaration(decl, /* isPrivate */ false);
1570
+ });
1571
+ }
1572
+ }
1573
+ }
1545
1574
  }
1546
1575
  _reportInvalidOverload(name, symbol) {
1547
1576
  const typedDecls = symbol.getTypedDeclarations();
1548
1577
  if (typedDecls.length >= 1) {
1549
1578
  const primaryDecl = typedDecls[0];
1550
- if (primaryDecl.type === 3 /* Function */) {
1579
+ if (primaryDecl.type === 5 /* Function */) {
1551
1580
  const type = this._evaluator.getEffectiveTypeOfSymbol(symbol);
1552
1581
  const functions = (0, types_1.isOverloadedFunction)(type) ? type.overloads : (0, types_1.isFunction)(type) ? [type] : [];
1553
1582
  const overloadedFunctions = functions.filter((func) => types_1.FunctionType.isOverloaded(func));
@@ -1697,10 +1726,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1697
1726
  let otherDecls = symbol.getDeclarations().filter((decl) => decl !== primaryDecl);
1698
1727
  // If it's a function, we can skip any other declarations
1699
1728
  // that are overloads or property setters/deleters.
1700
- if (primaryDecl.type === 3 /* Function */) {
1729
+ if (primaryDecl.type === 5 /* Function */) {
1701
1730
  const primaryDeclTypeInfo = this._evaluator.getTypeOfFunction(primaryDecl.node);
1702
1731
  otherDecls = otherDecls.filter((decl) => {
1703
- if (decl.type !== 3 /* Function */) {
1732
+ if (decl.type !== 5 /* Function */) {
1704
1733
  return true;
1705
1734
  }
1706
1735
  const funcTypeInfo = this._evaluator.getTypeOfFunction(decl.node);
@@ -1728,7 +1757,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1728
1757
  return;
1729
1758
  }
1730
1759
  let primaryDeclInfo;
1731
- if (primaryDecl.type === 3 /* Function */) {
1760
+ if (primaryDecl.type === 5 /* Function */) {
1732
1761
  if (primaryDecl.isMethod) {
1733
1762
  primaryDeclInfo = localize_1.Localizer.DiagnosticAddendum.seeMethodDeclaration();
1734
1763
  }
@@ -1736,7 +1765,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1736
1765
  primaryDeclInfo = localize_1.Localizer.DiagnosticAddendum.seeFunctionDeclaration();
1737
1766
  }
1738
1767
  }
1739
- else if (primaryDecl.type === 4 /* Class */) {
1768
+ else if (primaryDecl.type === 6 /* Class */) {
1740
1769
  primaryDeclInfo = localize_1.Localizer.DiagnosticAddendum.seeClassDeclaration();
1741
1770
  }
1742
1771
  else if (primaryDecl.type === 2 /* Parameter */) {
@@ -1745,13 +1774,16 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1745
1774
  else if (primaryDecl.type === 1 /* Variable */) {
1746
1775
  primaryDeclInfo = localize_1.Localizer.DiagnosticAddendum.seeVariableDeclaration();
1747
1776
  }
1777
+ else if (primaryDecl.type === 4 /* TypeAlias */) {
1778
+ primaryDeclInfo = localize_1.Localizer.DiagnosticAddendum.seeTypeAliasDeclaration();
1779
+ }
1748
1780
  else {
1749
1781
  primaryDeclInfo = localize_1.Localizer.DiagnosticAddendum.seeDeclaration();
1750
1782
  }
1751
1783
  const addPrimaryDeclInfo = (diag) => {
1752
1784
  if (diag) {
1753
1785
  let primaryDeclNode;
1754
- if (primaryDecl.type === 3 /* Function */ || primaryDecl.type === 4 /* Class */) {
1786
+ if (primaryDecl.type === 5 /* Function */ || primaryDecl.type === 6 /* Class */) {
1755
1787
  primaryDeclNode = primaryDecl.node.name;
1756
1788
  }
1757
1789
  else if (primaryDecl.type === 1 /* Variable */) {
@@ -1759,7 +1791,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1759
1791
  primaryDeclNode = primaryDecl.node;
1760
1792
  }
1761
1793
  }
1762
- else if (primaryDecl.type === 2 /* Parameter */) {
1794
+ else if (primaryDecl.type === 2 /* Parameter */ ||
1795
+ primaryDecl.type === 3 /* TypeParameter */) {
1763
1796
  if (primaryDecl.node.name) {
1764
1797
  primaryDeclNode = primaryDecl.node.name;
1765
1798
  }
@@ -1770,11 +1803,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1770
1803
  }
1771
1804
  };
1772
1805
  for (const otherDecl of otherDecls) {
1773
- if (otherDecl.type === 4 /* Class */) {
1774
- const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.obscuredClassDeclaration().format({ name }), otherDecl.node.name);
1775
- addPrimaryDeclInfo(diag);
1806
+ if (otherDecl.type === 6 /* Class */) {
1807
+ let duplicateIsOk = false;
1808
+ if (primaryDecl.type === 3 /* TypeParameter */) {
1809
+ // The error will be reported elsewhere if a type parameter is
1810
+ // involved, so don't report it here.
1811
+ duplicateIsOk = true;
1812
+ }
1813
+ if (!duplicateIsOk) {
1814
+ const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.obscuredClassDeclaration().format({ name }), otherDecl.node.name);
1815
+ addPrimaryDeclInfo(diag);
1816
+ }
1776
1817
  }
1777
- else if (otherDecl.type === 3 /* Function */) {
1818
+ else if (otherDecl.type === 5 /* Function */) {
1778
1819
  const primaryType = this._evaluator.getTypeForDeclaration(primaryDecl);
1779
1820
  let duplicateIsOk = false;
1780
1821
  // If the return type has not yet been inferred, do so now.
@@ -1797,6 +1838,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1797
1838
  if (!isInSameStatementList && primaryType && otherType && (0, types_1.isTypeSame)(primaryType, otherType)) {
1798
1839
  duplicateIsOk = true;
1799
1840
  }
1841
+ if (primaryDecl.type === 3 /* TypeParameter */) {
1842
+ // The error will be reported elsewhere if a type parameter is
1843
+ // involved, so don't report it here.
1844
+ duplicateIsOk = true;
1845
+ }
1800
1846
  if (!duplicateIsOk) {
1801
1847
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, otherDecl.isMethod
1802
1848
  ? localize_1.Localizer.Diagnostic.obscuredMethodDeclaration().format({ name })
@@ -1806,8 +1852,17 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1806
1852
  }
1807
1853
  else if (otherDecl.type === 2 /* Parameter */) {
1808
1854
  if (otherDecl.node.name) {
1809
- const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.obscuredParameterDeclaration().format({ name }), otherDecl.node.name);
1810
- addPrimaryDeclInfo(diag);
1855
+ let duplicateIsOk = false;
1856
+ if (primaryDecl.type === 3 /* TypeParameter */) {
1857
+ // The error will be reported elsewhere if a type parameter is
1858
+ // involved, so don't report it here.
1859
+ duplicateIsOk = true;
1860
+ }
1861
+ if (!duplicateIsOk) {
1862
+ const message = localize_1.Localizer.Diagnostic.obscuredParameterDeclaration();
1863
+ const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, message.format({ name }), otherDecl.node.name);
1864
+ addPrimaryDeclInfo(diag);
1865
+ }
1811
1866
  }
1812
1867
  }
1813
1868
  else if (otherDecl.type === 1 /* Variable */) {
@@ -1820,6 +1875,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1820
1875
  if (primaryType && otherType && (0, types_1.isTypeSame)(primaryType, otherType)) {
1821
1876
  duplicateIsOk = true;
1822
1877
  }
1878
+ if (primaryDecl.type === 3 /* TypeParameter */) {
1879
+ // The error will be reported elsewhere if a type parameter is
1880
+ // involved, so don't report it here.
1881
+ duplicateIsOk = true;
1882
+ }
1823
1883
  if (!duplicateIsOk) {
1824
1884
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.obscuredVariableDeclaration().format({ name }), otherDecl.node);
1825
1885
  addPrimaryDeclInfo(diag);
@@ -1827,11 +1887,17 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1827
1887
  }
1828
1888
  }
1829
1889
  }
1890
+ else if (otherDecl.type === 4 /* TypeAlias */) {
1891
+ const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.obscuredTypeAliasDeclaration().format({ name }), otherDecl.node.name);
1892
+ addPrimaryDeclInfo(diag);
1893
+ }
1830
1894
  }
1831
1895
  }
1832
1896
  _conditionallyReportUnusedSymbol(name, symbol, scopeType) {
1833
1897
  const accessedSymbolSet = this._fileInfo.accessedSymbolSet;
1834
- if (symbol.isIgnoredForProtocolMatch() || accessedSymbolSet.has(symbol.id)) {
1898
+ if (symbol.isIgnoredForProtocolMatch() ||
1899
+ accessedSymbolSet.has(symbol.id) ||
1900
+ this._fileInfo.ipythonMode === sourceFile_1.IPythonMode.CellDocs) {
1835
1901
  return;
1836
1902
  }
1837
1903
  // A name of "_" means "I know this symbol isn't used", so
@@ -1853,7 +1919,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1853
1919
  let message;
1854
1920
  let rule;
1855
1921
  switch (decl.type) {
1856
- case 6 /* Alias */:
1922
+ case 8 /* Alias */:
1857
1923
  diagnosticLevel = this._fileInfo.diagnosticRuleSet.reportUnusedImport;
1858
1924
  rule = diagnosticRules_1.DiagnosticRule.reportUnusedImport;
1859
1925
  if (decl.node.nodeType === 21 /* ImportAs */) {
@@ -1892,6 +1958,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1892
1958
  message = localize_1.Localizer.Diagnostic.unaccessedImport().format({ name: nameNode.value });
1893
1959
  }
1894
1960
  break;
1961
+ case 4 /* TypeAlias */:
1895
1962
  case 1 /* Variable */:
1896
1963
  case 2 /* Parameter */:
1897
1964
  if (!isPrivate) {
@@ -1913,7 +1980,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1913
1980
  }
1914
1981
  else if (decl.node.nodeType === 41 /* Parameter */) {
1915
1982
  nameNode = decl.node.name;
1916
- // Don't emit a diagnostic for unused parameters.
1983
+ // Don't emit a diagnostic for unused parameters or type parameters.
1917
1984
  diagnosticLevel = 'none';
1918
1985
  }
1919
1986
  if (nameNode) {
@@ -1921,7 +1988,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1921
1988
  message = localize_1.Localizer.Diagnostic.unaccessedVariable().format({ name: nameNode.value });
1922
1989
  }
1923
1990
  break;
1924
- case 4 /* Class */:
1991
+ case 6 /* Class */:
1925
1992
  if (!isPrivate) {
1926
1993
  return;
1927
1994
  }
@@ -1935,7 +2002,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1935
2002
  rule = diagnosticRules_1.DiagnosticRule.reportUnusedClass;
1936
2003
  message = localize_1.Localizer.Diagnostic.unaccessedClass().format({ name: nameNode.value });
1937
2004
  break;
1938
- case 3 /* Function */:
2005
+ case 5 /* Function */:
1939
2006
  if (!isPrivate) {
1940
2007
  return;
1941
2008
  }
@@ -1949,13 +2016,23 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1949
2016
  rule = diagnosticRules_1.DiagnosticRule.reportUnusedFunction;
1950
2017
  message = localize_1.Localizer.Diagnostic.unaccessedFunction().format({ name: nameNode.value });
1951
2018
  break;
1952
- default:
2019
+ case 3 /* TypeParameter */:
2020
+ // Never report a diagnostic for an unused TypeParameter.
2021
+ diagnosticLevel = 'none';
2022
+ nameNode = decl.node.name;
2023
+ break;
2024
+ case 0 /* Intrinsic */:
2025
+ case 7 /* SpecialBuiltInClass */:
1953
2026
  return;
2027
+ default:
2028
+ (0, debug_1.assertNever)(decl);
1954
2029
  }
1955
- if (nameNode && rule !== undefined && message) {
1956
- const action = rule === diagnosticRules_1.DiagnosticRule.reportUnusedImport ? { action: "pyright.unusedImport" /* unusedImport */ } : undefined;
2030
+ const action = rule === diagnosticRules_1.DiagnosticRule.reportUnusedImport ? { action: "pyright.unusedImport" /* unusedImport */ } : undefined;
2031
+ if (nameNode) {
1957
2032
  this._fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.Localizer.Diagnostic.unaccessedSymbol().format({ name: nameNode.value }), nameNode, action);
1958
- this._evaluator.addDiagnostic(diagnosticLevel, rule, message, nameNode);
2033
+ if (rule !== undefined && message) {
2034
+ this._evaluator.addDiagnostic(diagnosticLevel, rule, message, nameNode);
2035
+ }
1959
2036
  }
1960
2037
  }
1961
2038
  // Validates that a call to isinstance or issubclass are necessary. This is a
@@ -2288,7 +2365,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2288
2365
  if (!primaryDeclaration || primaryDeclaration.node === node) {
2289
2366
  return;
2290
2367
  }
2291
- if (primaryDeclaration.type === 6 /* Alias */) {
2368
+ if (primaryDeclaration.type === 8 /* Alias */) {
2292
2369
  // If this symbol is an import alias (i.e. it's a local name rather than the
2293
2370
  // original imported name), skip the private check.
2294
2371
  if (primaryDeclaration.usesLocalName) {
@@ -2474,7 +2551,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2474
2551
  }), returnAnnotation);
2475
2552
  }
2476
2553
  const diag = new diagnostic_1.DiagnosticAddendum();
2477
- if ((0, types_1.isTypeVar)(declaredReturnType) && declaredReturnType.details.variance === 2 /* Contravariant */) {
2554
+ if ((0, types_1.isTypeVar)(declaredReturnType) &&
2555
+ declaredReturnType.details.declaredVariance === 4 /* Contravariant */) {
2478
2556
  diag.addMessage(localize_1.Localizer.DiagnosticAddendum.typeVarIsContravariant().format({
2479
2557
  name: types_1.TypeVarType.getReadableName(declaredReturnType),
2480
2558
  }));
@@ -2604,7 +2682,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2604
2682
  }
2605
2683
  }
2606
2684
  }
2607
- else if (decls[0].type === 3 /* Function */) {
2685
+ else if (decls[0].type === 5 /* Function */) {
2608
2686
  if (ParseTreeUtils.isSuiteEmpty(decls[0].node.suite) && decls[0]) {
2609
2687
  if ((0, pathUtils_1.getFileExtension)(decls[0].path).toLowerCase() !== '.pyi') {
2610
2688
  if (!isSymbolImplemented(name)) {
@@ -2793,9 +2871,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2793
2871
  // the proper variance (invariant, covariant, contravariant). See PEP 544
2794
2872
  // for an explanation for why this is important to enforce.
2795
2873
  _validateProtocolTypeParamVariance(errorNode, classType) {
2796
- const origTypeParams = classType.details.typeParameters.filter((typeParam) => !(0, types_1.isParamSpec)(typeParam));
2797
- // If this isn't a generic protocol, there's nothing to do here.
2798
- if (origTypeParams.length === 0) {
2874
+ // If this protocol has no TypeVars with specified variance, there's nothing to do here.
2875
+ if (classType.details.typeParameters.length === 0) {
2799
2876
  return;
2800
2877
  }
2801
2878
  const objectType = this._evaluator.getBuiltInType(errorNode, 'object');
@@ -2803,13 +2880,17 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2803
2880
  return;
2804
2881
  }
2805
2882
  // Replace all of the type parameters with invariant TypeVars.
2806
- const updatedTypeParams = origTypeParams.map((typeParam) => (0, types_1.isVariadicTypeVar)(typeParam) ? typeParam : types_1.TypeVarType.cloneAsInvariant(typeParam));
2883
+ const updatedTypeParams = classType.details.typeParameters.map((typeParam) => types_1.TypeVarType.cloneAsInvariant(typeParam));
2807
2884
  const updatedClassType = types_1.ClassType.cloneWithNewTypeParameters(classType, updatedTypeParams);
2808
2885
  const objectObject = types_1.ClassType.cloneAsInstance(objectType);
2809
- const dummyTypeObject = types_1.ClassType.createInstantiable('__protocolVarianceDummy', '', '', '', 0, 0, undefined, undefined);
2886
+ const dummyTypeObject = types_1.ClassType.createInstantiable('__varianceDummy', '', '', '', 0, 0, undefined, undefined);
2810
2887
  updatedTypeParams.forEach((param, paramIndex) => {
2811
- // Skip variadics.
2812
- if (param.details.isVariadic) {
2888
+ // Skip variadics and ParamSpecs.
2889
+ if (param.details.isVariadic || param.details.isParamSpec) {
2890
+ return;
2891
+ }
2892
+ // Skip type variables with auto-variance.
2893
+ if (param.details.declaredVariance === 0 /* Auto */) {
2813
2894
  return;
2814
2895
  }
2815
2896
  // Replace all type arguments with a dummy type except for the
@@ -2829,29 +2910,29 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2829
2910
  /* isTypeArgumentExplicit */ true);
2830
2911
  const destType = types_1.ClassType.cloneForSpecialization(updatedClassType, destTypeArgs,
2831
2912
  /* isTypeArgumentExplicit */ true);
2832
- const isDestSubtypeOfSrc = (0, protocols_1.assignProtocolClassToSelf)(this._evaluator, srcType, destType);
2913
+ const isDestSubtypeOfSrc = this._evaluator.assignClassToSelf(srcType, destType);
2833
2914
  let expectedVariance;
2834
2915
  if (isDestSubtypeOfSrc) {
2835
- expectedVariance = 1 /* Covariant */;
2916
+ expectedVariance = 3 /* Covariant */;
2836
2917
  }
2837
2918
  else {
2838
- const isSrcSubtypeOfDest = (0, protocols_1.assignProtocolClassToSelf)(this._evaluator, destType, srcType);
2919
+ const isSrcSubtypeOfDest = this._evaluator.assignClassToSelf(destType, srcType);
2839
2920
  if (isSrcSubtypeOfDest) {
2840
- expectedVariance = 2 /* Contravariant */;
2921
+ expectedVariance = 4 /* Contravariant */;
2841
2922
  }
2842
2923
  else {
2843
- expectedVariance = 0 /* Invariant */;
2924
+ expectedVariance = 2 /* Invariant */;
2844
2925
  }
2845
2926
  }
2846
- if (expectedVariance !== origTypeParams[paramIndex].details.variance) {
2927
+ if (expectedVariance !== classType.details.typeParameters[paramIndex].details.declaredVariance) {
2847
2928
  let message;
2848
- if (expectedVariance === 1 /* Covariant */) {
2929
+ if (expectedVariance === 3 /* Covariant */) {
2849
2930
  message = localize_1.Localizer.Diagnostic.protocolVarianceCovariant().format({
2850
2931
  variable: param.details.name,
2851
2932
  class: classType.details.name,
2852
2933
  });
2853
2934
  }
2854
- else if (expectedVariance === 2 /* Contravariant */) {
2935
+ else if (expectedVariance === 4 /* Contravariant */) {
2855
2936
  message = localize_1.Localizer.Diagnostic.protocolVarianceContravariant().format({
2856
2937
  variable: param.details.name,
2857
2938
  class: classType.details.name,
@@ -3094,7 +3175,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3094
3175
  if (!this._evaluator.validateOverrideMethod(baseType, overrideFunction, diagAddendum,
3095
3176
  /* enforceParamNameMatch */ true)) {
3096
3177
  const decl = overrideFunction.details.declaration;
3097
- if (decl && decl.type === 3 /* Function */) {
3178
+ if (decl && decl.type === 5 /* Function */) {
3098
3179
  diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.baseClassMethodTypeIncompatible().format({
3099
3180
  classType: childClassType.details.name,
3100
3181
  name: memberName,
@@ -3223,7 +3304,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3223
3304
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.incompatibleMethodOverride().format({
3224
3305
  name: memberName,
3225
3306
  className: baseClassAndSymbol.classType.details.name,
3226
- }) + diagAddendum.getString(), decl.type === 3 /* Function */ ? decl.node.name : decl.node);
3307
+ }) + diagAddendum.getString(), decl.type === 5 /* Function */ ? decl.node.name : decl.node);
3227
3308
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
3228
3309
  if (diag && origDecl) {
3229
3310
  diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenMethod(), origDecl.path, origDecl.range);
@@ -3235,7 +3316,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3235
3316
  // Private names (starting with double underscore) are exempt from this check.
3236
3317
  if (!SymbolNameUtils.isPrivateName(memberName) && types_1.FunctionType.isFinal(baseType)) {
3237
3318
  const decl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideSymbol);
3238
- if (decl && decl.type === 3 /* Function */) {
3319
+ if (decl && decl.type === 5 /* Function */) {
3239
3320
  const diag = this._evaluator.addError(localize_1.Localizer.Diagnostic.finalMethodOverride().format({
3240
3321
  name: memberName,
3241
3322
  className: baseClassAndSymbol.classType.details.name,
@@ -3317,7 +3398,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3317
3398
  name: methodName,
3318
3399
  }));
3319
3400
  const decl = subclassMethodType.details.declaration;
3320
- if (decl && decl.type === 3 /* Function */) {
3401
+ if (decl && decl.type === 5 /* Function */) {
3321
3402
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.propertyOverridden().format({
3322
3403
  name: memberName,
3323
3404
  className: baseClassType.details.name,
@@ -3368,7 +3449,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3368
3449
  }
3369
3450
  // If the subclass is declaring an inner class, we'll consider that
3370
3451
  // to be a ClassVar.
3371
- if (overrideSymbol.getTypedDeclarations().every((decl) => decl.type === 4 /* Class */)) {
3452
+ if (overrideSymbol.getTypedDeclarations().every((decl) => decl.type === 6 /* Class */)) {
3372
3453
  isClassVar = true;
3373
3454
  }
3374
3455
  }