@zzzen/pyright-internal 1.2.0-dev.20230101 → 1.2.0-dev.20230108

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 (81) hide show
  1. package/dist/analyzer/checker.js +17 -11
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/codeFlowEngine.js +19 -4
  4. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  5. package/dist/analyzer/importResolver.d.ts +2 -1
  6. package/dist/analyzer/importResolver.js +18 -3
  7. package/dist/analyzer/importResolver.js.map +1 -1
  8. package/dist/analyzer/patternMatching.js +2 -2
  9. package/dist/analyzer/patternMatching.js.map +1 -1
  10. package/dist/analyzer/program.d.ts +1 -0
  11. package/dist/analyzer/program.js +41 -20
  12. package/dist/analyzer/program.js.map +1 -1
  13. package/dist/analyzer/regions.js +14 -5
  14. package/dist/analyzer/regions.js.map +1 -1
  15. package/dist/analyzer/sourceFile.d.ts +1 -1
  16. package/dist/analyzer/sourceMapper.d.ts +2 -2
  17. package/dist/analyzer/sourceMapper.js +14 -5
  18. package/dist/analyzer/sourceMapper.js.map +1 -1
  19. package/dist/analyzer/typeCacheUtils.d.ts +1 -3
  20. package/dist/analyzer/typeCacheUtils.js +4 -8
  21. package/dist/analyzer/typeCacheUtils.js.map +1 -1
  22. package/dist/analyzer/typeDocStringUtils.d.ts +2 -1
  23. package/dist/analyzer/typeDocStringUtils.js +18 -7
  24. package/dist/analyzer/typeDocStringUtils.js.map +1 -1
  25. package/dist/analyzer/typeEvaluator.js +116 -110
  26. package/dist/analyzer/typeEvaluator.js.map +1 -1
  27. package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -1
  28. package/dist/analyzer/typeGuards.d.ts +5 -1
  29. package/dist/analyzer/typeGuards.js +180 -43
  30. package/dist/analyzer/typeGuards.js.map +1 -1
  31. package/dist/analyzer/typeUtils.d.ts +1 -0
  32. package/dist/analyzer/typeUtils.js +5 -1
  33. package/dist/analyzer/typeUtils.js.map +1 -1
  34. package/dist/commands/quickActionCommand.js +1 -1
  35. package/dist/commands/quickActionCommand.js.map +1 -1
  36. package/dist/common/collectionUtils.d.ts +1 -0
  37. package/dist/common/collectionUtils.js +9 -1
  38. package/dist/common/collectionUtils.js.map +1 -1
  39. package/dist/common/textEditUtils.d.ts +3 -2
  40. package/dist/common/textEditUtils.js +11 -10
  41. package/dist/common/textEditUtils.js.map +1 -1
  42. package/dist/languageServerBase.d.ts +1 -1
  43. package/dist/languageService/completionProvider.d.ts +3 -0
  44. package/dist/languageService/completionProvider.js +212 -159
  45. package/dist/languageService/completionProvider.js.map +1 -1
  46. package/dist/languageService/hoverProvider.d.ts +0 -1
  47. package/dist/languageService/hoverProvider.js +7 -20
  48. package/dist/languageService/hoverProvider.js.map +1 -1
  49. package/dist/languageService/indentationUtils.js +1 -1
  50. package/dist/languageService/indentationUtils.js.map +1 -1
  51. package/dist/languageService/tooltipUtils.d.ts +5 -1
  52. package/dist/languageService/tooltipUtils.js +28 -4
  53. package/dist/languageService/tooltipUtils.js.map +1 -1
  54. package/dist/tests/completions.test.d.ts +1 -0
  55. package/dist/tests/completions.test.js +331 -0
  56. package/dist/tests/completions.test.js.map +1 -0
  57. package/dist/tests/filesystem.test.js +11 -0
  58. package/dist/tests/filesystem.test.js.map +1 -1
  59. package/dist/tests/harness/fourslash/testState.js +1 -1
  60. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  61. package/dist/tests/harness/vfs/filesystem.d.ts +2 -2
  62. package/dist/tests/harness/vfs/filesystem.js +5 -1
  63. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  64. package/dist/tests/hoverProvider.test.d.ts +1 -0
  65. package/dist/tests/hoverProvider.test.js +247 -0
  66. package/dist/tests/hoverProvider.test.js.map +1 -0
  67. package/dist/tests/indentationUtils.ptvs.test.js +1 -1
  68. package/dist/tests/indentationUtils.test.js +4 -4
  69. package/dist/tests/typeEvaluator1.test.js +16 -0
  70. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  71. package/dist/tests/typeEvaluator2.test.js +5 -1
  72. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  73. package/dist/tests/typeEvaluator3.test.js +4 -0
  74. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  75. package/dist/tests/typeEvaluator4.test.js +4 -0
  76. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  77. package/dist/tests/typeEvaluator5.test.js +6 -0
  78. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  79. package/dist/workspaceMap.js +1 -3
  80. package/dist/workspaceMap.js.map +1 -1
  81. package/package.json +6 -6
@@ -15,6 +15,7 @@ export interface CompletionItemData {
15
15
  autoImportText?: string;
16
16
  symbolLabel?: string;
17
17
  funcParensDisabled?: boolean;
18
+ modulePath?: string;
18
19
  }
19
20
  export interface MemberAccessInfo {
20
21
  lastKnownModule?: string;
@@ -129,12 +130,14 @@ export declare class CompletionProvider {
129
130
  private _addSymbols;
130
131
  private _addSymbolsForSymbolTable;
131
132
  private _addSymbol;
133
+ private _getTypeDetail;
132
134
  private _getAutoImportText;
133
135
  private _addNameToCompletions;
134
136
  private _getRecentListIndex;
135
137
  private _makeSortText;
136
138
  private _formatInteger;
137
139
  private _convertDeclarationTypeToItemKind;
140
+ private _convertTypeToItemKind;
138
141
  private _getImportModuleCompletions;
139
142
  private _getExtraCommitCharsForKind;
140
143
  private _addExtraCommitChar;
@@ -41,6 +41,7 @@ const sourceMapper_1 = require("../analyzer/sourceMapper");
41
41
  const SymbolNameUtils = __importStar(require("../analyzer/symbolNameUtils"));
42
42
  const symbolUtils_1 = require("../analyzer/symbolUtils");
43
43
  const typedDicts_1 = require("../analyzer/typedDicts");
44
+ const typeDocStringUtils_1 = require("../analyzer/typeDocStringUtils");
44
45
  const typePrinter_1 = require("../analyzer/typePrinter");
45
46
  const types_1 = require("../analyzer/types");
46
47
  const typeUtils_1 = require("../analyzer/typeUtils");
@@ -52,6 +53,7 @@ const lspUtils_1 = require("../common/lspUtils");
52
53
  const positionUtils_1 = require("../common/positionUtils");
53
54
  const pythonVersion_1 = require("../common/pythonVersion");
54
55
  const StringUtils = __importStar(require("../common/stringUtils"));
56
+ const textEditUtils_1 = require("../common/textEditUtils");
55
57
  const textRange_1 = require("../common/textRange");
56
58
  const textRange_2 = require("../common/textRange");
57
59
  const timing_1 = require("../common/timing");
@@ -360,22 +362,44 @@ class CompletionProvider {
360
362
  // Prevent the MRU list from growing indefinitely.
361
363
  CompletionProvider._mostRecentCompletions.pop();
362
364
  }
363
- if (completionItemData.symbolLabel) {
364
- this._itemToResolve = completionItem;
365
- if (!completionItemData.autoImportText) {
366
- // Rerun the completion lookup. It will fill in additional information
367
- // about the item to be resolved. We'll ignore the rest of the returned
368
- // list. This is a bit wasteful, but all of that information should be
369
- // cached, so it's not as bad as it might seem.
370
- this.getCompletionsForPosition();
365
+ if (!completionItemData.symbolLabel) {
366
+ return;
367
+ }
368
+ if (completionItemData.modulePath) {
369
+ const documentation = (0, typeDocStringUtils_1.getModuleDocStringFromPaths)([completionItemData.modulePath], this._sourceMapper);
370
+ if (!documentation) {
371
+ return;
371
372
  }
372
- else if (!completionItem.additionalTextEdits) {
373
- const completionMap = new CompletionMap();
374
- const completionResults = { completionMap };
375
- this._addAutoImportCompletions(completionItemData.symbolLabel,
376
- /* similarityLimit */ 1,
377
- /* lazyEdit */ false, completionResults);
373
+ if (this._options.format === vscode_languageserver_1.MarkupKind.Markdown) {
374
+ const markdownString = (0, docStringConversion_1.convertDocStringToMarkdown)(documentation);
375
+ completionItem.documentation = {
376
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
377
+ value: markdownString,
378
+ };
379
+ }
380
+ else if (this._options.format === vscode_languageserver_1.MarkupKind.PlainText) {
381
+ const plainTextString = (0, docStringConversion_1.convertDocStringToPlainText)(documentation);
382
+ completionItem.documentation = {
383
+ kind: vscode_languageserver_1.MarkupKind.PlainText,
384
+ value: plainTextString,
385
+ };
378
386
  }
387
+ return;
388
+ }
389
+ this._itemToResolve = completionItem;
390
+ if (!completionItemData.autoImportText) {
391
+ // Rerun the completion lookup. It will fill in additional information
392
+ // about the item to be resolved. We'll ignore the rest of the returned
393
+ // list. This is a bit wasteful, but all of that information should be
394
+ // cached, so it's not as bad as it might seem.
395
+ this.getCompletionsForPosition();
396
+ }
397
+ else if (!completionItem.additionalTextEdits) {
398
+ const completionMap = new CompletionMap();
399
+ const completionResults = { completionMap };
400
+ this._addAutoImportCompletions(completionItemData.symbolLabel,
401
+ /* similarityLimit */ 1,
402
+ /* lazyEdit */ false, completionResults);
379
403
  }
380
404
  }
381
405
  // This method will return false if it wants
@@ -1678,7 +1702,9 @@ class CompletionProvider {
1678
1702
  // Add the implicit imports.
1679
1703
  importInfo.implicitImports.forEach((implImport) => {
1680
1704
  if (!importFromNode.imports.find((imp) => imp.name.value === implImport.name)) {
1681
- this._addNameToCompletions(implImport.name, vscode_languageserver_1.CompletionItemKind.Module, priorWord, completionMap);
1705
+ this._addNameToCompletions(implImport.name, vscode_languageserver_1.CompletionItemKind.Module, priorWord, completionMap, {
1706
+ modulePath: implImport.path,
1707
+ });
1682
1708
  }
1683
1709
  });
1684
1710
  return { completionMap };
@@ -1795,7 +1821,7 @@ class CompletionProvider {
1795
1821
  });
1796
1822
  }
1797
1823
  _addSymbol(name, symbol, priorWord, completionMap, detail) {
1798
- var _a, _b;
1824
+ var _a, _b, _c, _d;
1799
1825
  let primaryDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(symbol);
1800
1826
  if (!primaryDecl) {
1801
1827
  const declarations = symbol.getDeclarations();
@@ -1803,132 +1829,83 @@ class CompletionProvider {
1803
1829
  primaryDecl = declarations[declarations.length - 1];
1804
1830
  }
1805
1831
  }
1806
- if (primaryDecl) {
1807
- let itemKind = vscode_languageserver_1.CompletionItemKind.Variable;
1808
- primaryDecl = this._evaluator.resolveAliasDeclaration(primaryDecl, /* resolveLocalNames */ true);
1809
- if (primaryDecl) {
1810
- itemKind = this._convertDeclarationTypeToItemKind(primaryDecl);
1811
- // Handle enum members specially. Enum members normally look like
1812
- // variables, but the are declared using assignment expressions
1813
- // within an enum class.
1814
- if (primaryDecl.type === 1 /* Variable */ &&
1815
- detail.boundObjectOrClass &&
1816
- (0, types_1.isInstantiableClass)(detail.boundObjectOrClass) &&
1817
- types_1.ClassType.isEnumClass(detail.boundObjectOrClass) &&
1818
- ((_a = primaryDecl.node.parent) === null || _a === void 0 ? void 0 : _a.nodeType) === 3 /* Assignment */) {
1819
- itemKind = vscode_languageserver_1.CompletionItemKind.EnumMember;
1820
- }
1821
- // Are we resolving a completion item? If so, see if this symbol
1822
- // is the one that we're trying to match.
1823
- if (this._itemToResolve) {
1824
- const completionItemData = (0, lspUtils_1.fromLSPAny)(this._itemToResolve.data);
1825
- if (completionItemData.symbolLabel === name && !completionItemData.autoImportText) {
1826
- // This call can be expensive to perform on every completion item
1827
- // that we return, so we do it lazily in the "resolve" callback.
1828
- const type = this._evaluator.getEffectiveTypeOfSymbol(symbol);
1829
- if (type) {
1830
- let typeDetail;
1831
- let documentation;
1832
- switch (primaryDecl.type) {
1833
- case 0 /* Intrinsic */:
1834
- case 1 /* Variable */:
1835
- case 2 /* Parameter */:
1836
- case 3 /* TypeParameter */: {
1837
- let expandTypeAlias = false;
1838
- if (type && types_1.TypeBase.isInstantiable(type)) {
1839
- const typeAliasInfo = (0, types_1.getTypeAliasInfo)(type);
1840
- if (typeAliasInfo) {
1841
- if (typeAliasInfo.name === name) {
1842
- expandTypeAlias = true;
1843
- }
1844
- }
1845
- }
1846
- typeDetail = name + ': ' + this._evaluator.printType(type, { expandTypeAlias });
1847
- break;
1848
- }
1849
- case 5 /* Function */: {
1850
- const functionType = detail.boundObjectOrClass && ((0, types_1.isFunction)(type) || (0, types_1.isOverloadedFunction)(type))
1851
- ? this._evaluator.bindFunctionToClassOrObject(detail.boundObjectOrClass, type)
1852
- : type;
1853
- if (functionType) {
1854
- if ((0, typeUtils_1.isProperty)(functionType) &&
1855
- detail.boundObjectOrClass &&
1856
- (0, types_1.isClassInstance)(detail.boundObjectOrClass)) {
1857
- const propertyType = this._evaluator.getGetterTypeFromProperty(functionType,
1858
- /* inferTypeIfNeeded */ true) || types_1.UnknownType.create();
1859
- typeDetail =
1860
- name + ': ' + this._evaluator.printType(propertyType) + ' (property)';
1861
- }
1862
- else if ((0, types_1.isOverloadedFunction)(functionType)) {
1863
- // 35 is completion tooltip's default width size
1864
- typeDetail = (0, tooltipUtils_1.getOverloadedFunctionTooltip)(functionType, this._evaluator,
1865
- /* columnThreshold */ 35);
1866
- }
1867
- else if ((0, types_1.isFunction)(functionType)) {
1868
- typeDetail = name + this._evaluator.printType(functionType);
1869
- }
1870
- else {
1871
- typeDetail = name + ': ' + this._evaluator.printType(functionType);
1872
- }
1873
- }
1874
- break;
1875
- }
1876
- case 6 /* Class */:
1877
- case 7 /* SpecialBuiltInClass */: {
1878
- typeDetail = 'class ' + name + '()';
1879
- break;
1880
- }
1881
- case 8 /* Alias */: {
1882
- typeDetail = name;
1883
- if (primaryDecl.path) {
1884
- const lookupResults = this._importLookup(primaryDecl.path);
1885
- if (lookupResults) {
1886
- documentation = lookupResults.docString;
1887
- }
1888
- }
1889
- break;
1890
- }
1891
- default: {
1892
- typeDetail = name;
1893
- break;
1894
- }
1895
- }
1896
- documentation = (0, tooltipUtils_1.getDocumentationPartsForTypeAndDecl)(this._sourceMapper, type, primaryDecl, this._evaluator, symbol, detail.boundObjectOrClass);
1897
- if (this._options.format === vscode_languageserver_1.MarkupKind.Markdown) {
1898
- let markdownString = '```python\n' + typeDetail + '\n```\n';
1899
- if (documentation) {
1900
- markdownString += '---\n';
1901
- markdownString += (0, docStringConversion_1.convertDocStringToMarkdown)(documentation);
1902
- }
1903
- markdownString = markdownString.trimEnd();
1904
- this._itemToResolve.documentation = {
1905
- kind: vscode_languageserver_1.MarkupKind.Markdown,
1906
- value: markdownString,
1907
- };
1908
- }
1909
- else if (this._options.format === vscode_languageserver_1.MarkupKind.PlainText) {
1910
- let plainTextString = typeDetail + '\n';
1911
- if (documentation) {
1912
- plainTextString += '\n';
1913
- plainTextString += (0, docStringConversion_1.convertDocStringToPlainText)(documentation);
1914
- }
1915
- plainTextString = plainTextString.trimEnd();
1916
- this._itemToResolve.documentation = {
1917
- kind: vscode_languageserver_1.MarkupKind.PlainText,
1918
- value: plainTextString,
1919
- };
1920
- }
1921
- else {
1922
- (0, debug_1.fail)(`Unsupported markup type: ${this._options.format}`);
1923
- }
1924
- }
1925
- }
1832
+ primaryDecl = primaryDecl
1833
+ ? (_a = this._evaluator.resolveAliasDeclaration(primaryDecl, /* resolveLocalNames */ true)) !== null && _a !== void 0 ? _a : primaryDecl
1834
+ : undefined;
1835
+ const autoImportText = detail.autoImportSource
1836
+ ? this._getAutoImportText(name, detail.autoImportSource, detail.autoImportAlias)
1837
+ : undefined;
1838
+ // Are we resolving a completion item? If so, see if this symbol
1839
+ // is the one that we're trying to match.
1840
+ if (this._itemToResolve) {
1841
+ const completionItemData = (0, lspUtils_1.fromLSPAny)(this._itemToResolve.data);
1842
+ if (completionItemData.symbolLabel !== name) {
1843
+ // It's not what we are looking for.
1844
+ return;
1845
+ }
1846
+ if (completionItemData.autoImportText) {
1847
+ if (completionItemData.autoImportText === (autoImportText === null || autoImportText === void 0 ? void 0 : autoImportText.importText) &&
1848
+ ((_b = detail.edits) === null || _b === void 0 ? void 0 : _b.additionalTextEdits)) {
1849
+ this._itemToResolve.additionalTextEdits = (0, textEditUtils_1.convertEditActionsToTextEdits)(detail.edits.additionalTextEdits);
1850
+ }
1851
+ return;
1852
+ }
1853
+ // This call can be expensive to perform on every completion item
1854
+ // that we return, so we do it lazily in the "resolve" callback.
1855
+ const type = this._evaluator.getEffectiveTypeOfSymbol(symbol);
1856
+ if (!type) {
1857
+ // Can't resolve. so bail out.
1858
+ return;
1859
+ }
1860
+ const typeDetail = this._getTypeDetail(primaryDecl, type, name, detail);
1861
+ const documentation = (0, tooltipUtils_1.getDocumentationPartsForTypeAndDecl)(this._sourceMapper, type, primaryDecl, this._evaluator, {
1862
+ name,
1863
+ symbol,
1864
+ boundObjectOrClass: detail.boundObjectOrClass,
1865
+ });
1866
+ if (this._options.format === vscode_languageserver_1.MarkupKind.Markdown) {
1867
+ let markdownString = '```python\n' + typeDetail + '\n```\n';
1868
+ if (documentation) {
1869
+ markdownString += '---\n';
1870
+ markdownString += (0, docStringConversion_1.convertDocStringToMarkdown)(documentation);
1871
+ }
1872
+ markdownString = markdownString.trimEnd();
1873
+ this._itemToResolve.documentation = {
1874
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
1875
+ value: markdownString,
1876
+ };
1877
+ }
1878
+ else if (this._options.format === vscode_languageserver_1.MarkupKind.PlainText) {
1879
+ let plainTextString = typeDetail + '\n';
1880
+ if (documentation) {
1881
+ plainTextString += '\n';
1882
+ plainTextString += (0, docStringConversion_1.convertDocStringToPlainText)(documentation);
1926
1883
  }
1884
+ plainTextString = plainTextString.trimEnd();
1885
+ this._itemToResolve.documentation = {
1886
+ kind: vscode_languageserver_1.MarkupKind.PlainText,
1887
+ value: plainTextString,
1888
+ };
1889
+ }
1890
+ else {
1891
+ (0, debug_1.fail)(`Unsupported markup type: ${this._options.format}`);
1927
1892
  }
1928
- const autoImportText = detail.autoImportSource
1929
- ? this._getAutoImportText(name, detail.autoImportSource, detail.autoImportAlias)
1930
- : undefined;
1931
- this._addNameToCompletions((_b = detail.autoImportAlias) !== null && _b !== void 0 ? _b : name, itemKind, priorWord, completionMap, {
1893
+ // Bail out. We don't need to add items to completion.
1894
+ return;
1895
+ }
1896
+ if (primaryDecl) {
1897
+ let itemKind = this._convertDeclarationTypeToItemKind(primaryDecl);
1898
+ // Handle enum members specially. Enum members normally look like
1899
+ // variables, but the are declared using assignment expressions
1900
+ // within an enum class.
1901
+ if (primaryDecl.type === 1 /* Variable */ &&
1902
+ detail.boundObjectOrClass &&
1903
+ (0, types_1.isInstantiableClass)(detail.boundObjectOrClass) &&
1904
+ types_1.ClassType.isEnumClass(detail.boundObjectOrClass) &&
1905
+ ((_c = primaryDecl.node.parent) === null || _c === void 0 ? void 0 : _c.nodeType) === 3 /* Assignment */) {
1906
+ itemKind = vscode_languageserver_1.CompletionItemKind.EnumMember;
1907
+ }
1908
+ this._addNameToCompletions((_d = detail.autoImportAlias) !== null && _d !== void 0 ? _d : name, itemKind, priorWord, completionMap, {
1932
1909
  autoImportText,
1933
1910
  extraCommitChars: detail.extraCommitChars,
1934
1911
  funcParensDisabled: detail.funcParensDisabled,
@@ -1939,7 +1916,7 @@ class CompletionProvider {
1939
1916
  // Does the symbol have no declaration but instead has a synthesized type?
1940
1917
  const synthesizedType = symbol.getSynthesizedType();
1941
1918
  if (synthesizedType) {
1942
- const itemKind = vscode_languageserver_1.CompletionItemKind.Variable;
1919
+ const itemKind = this._convertTypeToItemKind(synthesizedType);
1943
1920
  this._addNameToCompletions(name, itemKind, priorWord, completionMap, {
1944
1921
  extraCommitChars: detail.extraCommitChars,
1945
1922
  funcParensDisabled: detail.funcParensDisabled,
@@ -1948,6 +1925,72 @@ class CompletionProvider {
1948
1925
  }
1949
1926
  }
1950
1927
  }
1928
+ _getTypeDetail(primaryDecl, type, name, detail) {
1929
+ if (!primaryDecl) {
1930
+ if ((0, types_1.isModule)(type)) {
1931
+ // Special casing import modules.
1932
+ // submodule imported through `import` statement doesn't have
1933
+ // corresponding decls. so use given name as it is.
1934
+ //
1935
+ // ex) import X.Y
1936
+ // X.[Y]
1937
+ return name;
1938
+ }
1939
+ return;
1940
+ }
1941
+ switch (primaryDecl.type) {
1942
+ case 0 /* Intrinsic */:
1943
+ case 1 /* Variable */:
1944
+ case 2 /* Parameter */:
1945
+ case 3 /* TypeParameter */: {
1946
+ let expandTypeAlias = false;
1947
+ if (type && types_1.TypeBase.isInstantiable(type)) {
1948
+ const typeAliasInfo = (0, types_1.getTypeAliasInfo)(type);
1949
+ if (typeAliasInfo) {
1950
+ if (typeAliasInfo.name === name) {
1951
+ expandTypeAlias = true;
1952
+ }
1953
+ }
1954
+ }
1955
+ return name + ': ' + this._evaluator.printType(type, { expandTypeAlias });
1956
+ }
1957
+ case 5 /* Function */: {
1958
+ const functionType = detail.boundObjectOrClass && ((0, types_1.isFunction)(type) || (0, types_1.isOverloadedFunction)(type))
1959
+ ? this._evaluator.bindFunctionToClassOrObject(detail.boundObjectOrClass, type)
1960
+ : type;
1961
+ if (!functionType) {
1962
+ return undefined;
1963
+ }
1964
+ if ((0, typeUtils_1.isProperty)(functionType) &&
1965
+ detail.boundObjectOrClass &&
1966
+ (0, types_1.isClassInstance)(detail.boundObjectOrClass)) {
1967
+ const propertyType = this._evaluator.getGetterTypeFromProperty(functionType,
1968
+ /* inferTypeIfNeeded */ true) || types_1.UnknownType.create();
1969
+ return name + ': ' + this._evaluator.printType(propertyType) + ' (property)';
1970
+ }
1971
+ if ((0, types_1.isOverloadedFunction)(functionType)) {
1972
+ // 35 is completion tooltip's default width size
1973
+ return (0, tooltipUtils_1.getOverloadedFunctionTooltip)(functionType, this._evaluator, /* columnThreshold */ 35);
1974
+ }
1975
+ else if ((0, types_1.isFunction)(functionType)) {
1976
+ return name + this._evaluator.printType(functionType);
1977
+ }
1978
+ else {
1979
+ return name + ': ' + this._evaluator.printType(functionType);
1980
+ }
1981
+ }
1982
+ case 6 /* Class */:
1983
+ case 7 /* SpecialBuiltInClass */: {
1984
+ return 'class ' + name + '()';
1985
+ }
1986
+ case 8 /* Alias */: {
1987
+ return name;
1988
+ }
1989
+ default: {
1990
+ return name;
1991
+ }
1992
+ }
1993
+ }
1951
1994
  _getAutoImportText(importName, importFrom, importAlias) {
1952
1995
  const autoImportText = (0, tooltipUtils_1.getAutoImportText)(importName, importFrom, importAlias);
1953
1996
  let importText = '';
@@ -1988,6 +2031,9 @@ class CompletionProvider {
1988
2031
  if (detail === null || detail === void 0 ? void 0 : detail.funcParensDisabled) {
1989
2032
  completionItemData.funcParensDisabled = true;
1990
2033
  }
2034
+ if (detail === null || detail === void 0 ? void 0 : detail.modulePath) {
2035
+ completionItemData.modulePath = detail.modulePath;
2036
+ }
1991
2037
  completionItem.data = (0, lspUtils_1.toLSPAny)(completionItemData);
1992
2038
  if ((detail === null || detail === void 0 ? void 0 : detail.sortText) || (detail === null || detail === void 0 ? void 0 : detail.itemDetail)) {
1993
2039
  completionItem.sortText = detail.sortText;
@@ -2077,16 +2123,8 @@ class CompletionProvider {
2077
2123
  completionItem.textEdit = detail.edits.textEdit;
2078
2124
  }
2079
2125
  if ((_d = detail === null || detail === void 0 ? void 0 : detail.edits) === null || _d === void 0 ? void 0 : _d.additionalTextEdits) {
2080
- completionItem.additionalTextEdits = detail.edits.additionalTextEdits.map((te) => {
2081
- const textEdit = {
2082
- range: {
2083
- start: { line: te.range.start.line, character: te.range.start.character },
2084
- end: { line: te.range.end.line, character: te.range.end.character },
2085
- },
2086
- newText: te.replacementText,
2087
- };
2088
- return textEdit;
2089
- });
2126
+ completionItem.additionalTextEdits = (0, textEditUtils_1.convertEditActionsToTextEdits)(detail.edits.additionalTextEdits);
2127
+ // This is for auto import entries from indices which skip symbols.
2090
2128
  if (this._itemToResolve) {
2091
2129
  const data = (0, lspUtils_1.fromLSPAny)(this._itemToResolve.data);
2092
2130
  if (data.autoImportText === completionItemData.autoImportText) {
@@ -2173,6 +2211,24 @@ class CompletionProvider {
2173
2211
  return vscode_languageserver_1.CompletionItemKind.Module;
2174
2212
  }
2175
2213
  }
2214
+ _convertTypeToItemKind(type) {
2215
+ switch (type.category) {
2216
+ case 8 /* Module */:
2217
+ return vscode_languageserver_1.CompletionItemKind.Module;
2218
+ case 7 /* Class */:
2219
+ return vscode_languageserver_1.CompletionItemKind.Class;
2220
+ case 5 /* Function */:
2221
+ case 6 /* OverloadedFunction */:
2222
+ if ((0, typeUtils_1.isProperty)(type)) {
2223
+ return vscode_languageserver_1.CompletionItemKind.Property;
2224
+ }
2225
+ return vscode_languageserver_1.CompletionItemKind.Function;
2226
+ case 10 /* TypeVar */:
2227
+ return vscode_languageserver_1.CompletionItemKind.TypeParameter;
2228
+ default:
2229
+ return vscode_languageserver_1.CompletionItemKind.Variable;
2230
+ }
2231
+ }
2176
2232
  _getImportModuleCompletions(node) {
2177
2233
  const moduleDescriptor = {
2178
2234
  leadingDots: node.leadingDots,
@@ -2194,14 +2250,11 @@ class CompletionProvider {
2194
2250
  completionItem.sortText = this._makeSortText(SortCategory.Keyword, keyword);
2195
2251
  completionMap.set(completionItem);
2196
2252
  }
2197
- completions.forEach((completionName) => {
2198
- if (completionMap.has(completionName)) {
2199
- return;
2200
- }
2201
- const completionItem = vscode_languageserver_1.CompletionItem.create(completionName);
2202
- completionItem.kind = vscode_languageserver_1.CompletionItemKind.Module;
2203
- completionItem.sortText = this._makeSortText(SortCategory.ImportModuleName, completionName);
2204
- completionMap.set(completionItem);
2253
+ completions.forEach((modulePath, completionName) => {
2254
+ this._addNameToCompletions(completionName, vscode_languageserver_1.CompletionItemKind.Module, '', completionMap, {
2255
+ sortText: this._makeSortText(SortCategory.ImportModuleName, completionName),
2256
+ modulePath,
2257
+ });
2205
2258
  });
2206
2259
  return { completionMap };
2207
2260
  }