Push pylance changes to pyright (#5542)

This commit is contained in:
Erik De Bonte 2023-07-19 12:46:11 -07:00 committed by GitHub
parent 455830ed42
commit b917b7a5e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 5367 additions and 4426 deletions

2672
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -23,20 +23,21 @@
"@types/glob": "^7.2.0",
"@types/node": "^17.0.45",
"@types/yargs": "^16.0.5",
"@typescript-eslint/eslint-plugin": "^5.60.1",
"@typescript-eslint/parser": "^5.60.1",
"@typescript-eslint/eslint-plugin": "^6.1.0",
"@typescript-eslint/parser": "^6.1.0",
"detect-indent": "^6.1.0",
"eslint": "^8.43.0",
"eslint": "^8.45.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-simple-import-sort": "^7.0.0",
"eslint-plugin-simple-import-sort": "^10.0.0",
"glob": "^7.2.3",
"jsonc-parser": "^3.2.0",
"lerna": "^6.6.2",
"npm-check-updates": "^16.10.13",
"p-queue": "^6.6.2",
"npm-check-updates": "^16.10.16",
"p-queue": "^7.3.4",
"prettier": "2.8.8",
"syncpack": "^9.8.6",
"syncpack": "^10.7.3",
"typescript": "~4.4.4",
"word-wrap": "1.2.4",
"yargs": "^16.2.0"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@
"@iarna/toml": "2.2.5",
"@yarnpkg/fslib": "2.10.3",
"@yarnpkg/libzip": "2.3.0",
"chalk": "^4.1.2",
"chalk": "^5.3.0",
"chokidar": "^3.5.3",
"command-line-args": "^5.2.1",
"jsonc-parser": "^3.2.0",
@ -34,13 +34,14 @@
"devDependencies": {
"@types/command-line-args": "^5.2.0",
"@types/fs-extra": "^11.0.1",
"@types/jest": "^27.5.2",
"@types/jest": "^29.5.3",
"@types/node": "^17.0.45",
"@types/tmp": "^0.2.3",
"jest": "^27.5.1",
"jest-junit": "^13.2.0",
"jest": "^29.6.1",
"jest-junit": "^16.0.0",
"shx": "^0.3.4",
"ts-jest": "^27.1.5",
"typescript": "~4.4.4"
"ts-jest": "^29.1.1",
"typescript": "~4.4.4",
"word-wrap": "1.2.4"
}
}

View File

@ -73,7 +73,7 @@ export function createConfigOptionsFrom(jsonObject: any): ConfigOptions {
const getFileSpec = (fileSpec: any): FileSpec => {
return {
wildcardRoot: fileSpec.wildcardRoot,
regExp: new RegExp(fileSpec.regExp.source),
regExp: new RegExp(fileSpec.regExp.source, fileSpec.regExp.flags),
hasDirectoryWildcard: fileSpec.hasDirectoryWildcard,
};
};

View File

@ -35,7 +35,7 @@ import { Position, rangesAreEqual } from '../common/textRange';
import { ReferencesProvider, ReferencesResult } from '../languageService/referencesProvider';
import { CallNode, MemberAccessNode, NameNode, ParseNode, ParseNodeType } from '../parser/parseNodes';
import { ParseResults } from '../parser/parser';
import { DocumentSymbolCollectorUseCase } from './documentSymbolCollector';
import { DocumentSymbolCollector, DocumentSymbolCollectorUseCase } from './documentSymbolCollector';
import { canNavigateToFile } from './navigationUtils';
export class CallHierarchyProvider {
@ -285,7 +285,8 @@ export class CallHierarchyProvider {
declaration,
parseResults,
this._evaluator,
this._token
this._token,
this._program
);
const incomingCalls = callFinder.findCalls();
@ -445,7 +446,8 @@ class FindIncomingCallTreeWalker extends ParseTreeWalker {
private _declaration: Declaration,
private _parseResults: ParseResults,
private _evaluator: TypeEvaluator,
private _cancellationToken: CancellationToken
private _cancellationToken: CancellationToken,
private _program: ProgramView
) {
super();
}
@ -468,14 +470,15 @@ class FindIncomingCallTreeWalker extends ParseTreeWalker {
// Don't bother doing any more work if the name doesn't match.
if (nameNode && nameNode.value === this._symbolName) {
const declarations = this._evaluator.getDeclarationsForNameNode(nameNode);
const declarations = DocumentSymbolCollector.getDeclarationsForNode(
this._program,
nameNode,
/* resolveLocalName */ true,
DocumentSymbolCollectorUseCase.Reference,
this._cancellationToken
);
if (declarations) {
const resolvedDecls = declarations
.map((decl) => {
return this._evaluator.resolveAliasDeclaration(decl, /* resolveLocalNames */ true);
})
.filter((decl) => decl !== undefined);
if (this._declaration.type === DeclarationType.Alias) {
const resolvedCurDecls = this._evaluator.resolveAliasDeclaration(
this._declaration,
@ -483,12 +486,12 @@ class FindIncomingCallTreeWalker extends ParseTreeWalker {
);
if (
resolvedCurDecls &&
resolvedDecls.some((decl) => DeclarationUtils.areDeclarationsSame(decl!, resolvedCurDecls))
declarations.some((decl) => DeclarationUtils.areDeclarationsSame(decl!, resolvedCurDecls))
) {
this._addIncomingCallForDeclaration(nameNode!);
}
} else if (
resolvedDecls.some((decl) => DeclarationUtils.areDeclarationsSame(decl!, this._declaration))
declarations.some((decl) => DeclarationUtils.areDeclarationsSame(decl!, this._declaration))
) {
this._addIncomingCallForDeclaration(nameNode!);
}

View File

@ -757,7 +757,14 @@ export class CompletionProvider {
subtype = this.evaluator.makeTopLevelTypeVarsConcrete(subtype);
if (isClass(subtype)) {
getMembersForClass(subtype, symbolTable, /* includeInstanceVars */ TypeBase.isInstance(subtype));
const instance = TypeBase.isInstance(subtype);
if (ClassType.isEnumClass(subtype) && instance) {
// We don't add members for instances of enum members.
// ex) 'MyEnum.member.' <= here
return;
}
getMembersForClass(subtype, symbolTable, instance);
} else if (isModule(subtype)) {
getMembersForModule(subtype, symbolTable);
} else if (isFunction(subtype) || isOverloadedFunction(subtype)) {

View File

@ -9,12 +9,19 @@
import { fail } from '../common/debug';
import enUsStrings = require('./package.nls.en-us.json');
import csStrings = require('./package.nls.cs.json');
import deStrings = require('./package.nls.de.json');
import enUsStrings = require('./package.nls.en-us.json');
import esStrings = require('./package.nls.es.json');
import frStrings = require('./package.nls.fr.json');
import itStrings = require('./package.nls.it.json');
import jaStrings = require('./package.nls.ja.json');
import koStrings = require('./package.nls.ko.json');
import plStrings = require('./package.nls.pl.json');
import ptBrStrings = require('./package.nls.pt-br.json');
import qpsPlocStrings = require('./package.nls.qps-ploc.json');
import ruStrings = require('./package.nls.ru.json');
import trStrings = require('./package.nls.tr.json');
import zhCnStrings = require('./package.nls.zh-cn.json');
import zhTwStrings = require('./package.nls.zh-tw.json');
@ -36,12 +43,20 @@ export class ParameterizedString<T extends {}> {
const defaultLocale = 'en-us';
const stringMapsByLocale: Map<string, any> = new Map([
['cs', csStrings],
['de', deStrings],
['en-us', enUsStrings],
['en', enUsStrings],
['es', esStrings],
['fr', frStrings],
['it', itStrings],
['ja', jaStrings],
['ko', koStrings],
['pl', plStrings],
['pt-br', ptBrStrings],
['qps-ploc', qpsPlocStrings],
['ru', ruStrings],
['tr', trStrings],
['zh-cn', zhCnStrings],
['zh-tw', zhTwStrings],
]);

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Názvy v pojmenované řazené kolekci členů nemůžou být prázdné.",
"namedTupleFirstArg": "Jako první argument byl očekáván název pojmenované třídy řazené kolekce členů",
"namedTupleMultipleInheritance": "Vícenásobná dědičnost s NamedTuple se nepodporuje",
"namedTupleNameKeyword": "Názvy polí nemůžou být klíčové slovo.",
"namedTupleNameType": "Očekávala se řazená kolekce členů se dvěma položkami určující název a typ položky",
"namedTupleNameUnique": "Názvy v pojmenované řazené kolekci členů musí být jedinečné",
"namedTupleNoTypes": "namedtuple neposkytuje žádné typy pro položky řazené kolekce členů; místo toho použijte NamedTuple",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Namen innerhalb eines benannten Tupels dürfen nicht leer sein.",
"namedTupleFirstArg": "Es wird ein benannter Tupelklassenname als erstes Argument erwartet.",
"namedTupleMultipleInheritance": "Mehrfachvererbung mit NamedTuple wird nicht unterstützt.",
"namedTupleNameKeyword": "Feldnamen dürfen kein Schlüsselwort sein.",
"namedTupleNameType": "Es wurde ein Tupel mit zwei Einträgen unter Angabe von Eintragsname und -typ erwartet.",
"namedTupleNameUnique": "Namen innerhalb eines benannten Tupels müssen eindeutig sein.",
"namedTupleNoTypes": "\"namedtuple\" stellt keine Typen für Tupeleinträge bereit; verwenden Sie stattdessen \"NamedTuple\".",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Los nombres de una tupla con nombre no pueden estar vacíos",
"namedTupleFirstArg": "Nombre de clase de tupla como primer argumento",
"namedTupleMultipleInheritance": "No se admite la herencia múltiple con NamedTuple",
"namedTupleNameKeyword": "Los nombres de campo no pueden ser una palabra clave",
"namedTupleNameType": "Tupla de dos entradas esperada que especifica el nombre y el tipo de entrada",
"namedTupleNameUnique": "Los nombres dentro de una tupla con nombre deben ser únicos",
"namedTupleNoTypes": "\"namedtuple\" no proporciona tipos para las entradas de tupla; utilice en su lugar \"NamedTuple\".",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Les noms dans un tuple nommé ne peuvent pas être vides",
"namedTupleFirstArg": "Nom de classe de tuple nommé attendu en tant que premier argument",
"namedTupleMultipleInheritance": "Lhéritage multiple avec NamedTuple nest pas pris en charge",
"namedTupleNameKeyword": "Les noms de champs ne peuvent pas être un mot-clé",
"namedTupleNameType": "Tuple à deux entrées attendu spécifiant le nom et le type de lentrée",
"namedTupleNameUnique": "Les noms dans un tuple nommé doivent être uniques",
"namedTupleNoTypes": "« namedtuple » ne fournit aucun type pour les entrées de tuple ; utilisez « NamedTuple » à la place",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "I nomi all'interno di una tupla denominata non possono essere vuoti",
"namedTupleFirstArg": "Previsto nome della classe di tupla denominata come primo argomento",
"namedTupleMultipleInheritance": "L'ereditarietà multipla con NamedTuple non è supportata",
"namedTupleNameKeyword": "I nomi dei campi non possono essere una parola chiave",
"namedTupleNameType": "Prevista tupla a due voci che specifica il nome e il tipo della voce",
"namedTupleNameUnique": "I nomi all'interno di una tupla denominata devono essere univoci",
"namedTupleNoTypes": "\"namedtuple\" non fornisce tipi per le voci di tupla; usare invece \"NamedTuple\"",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "名前付きタプル内の名前を空にすることはできません",
"namedTupleFirstArg": "最初の引数として名前付きタプル クラス名が必要です",
"namedTupleMultipleInheritance": "NamedTuple による複数の継承はサポートされていません",
"namedTupleNameKeyword": "フィールド名をキーワードにすることはできません",
"namedTupleNameType": "エントリ名と型を指定する 2 エントリタプルが必要です",
"namedTupleNameUnique": "名前付きタプル内の名前は一意である必要があります",
"namedTupleNoTypes": "\"namedtuple\" はタプル エントリに型を提供しません。代わりに \"NamedTuple\" を使用してください",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "명명된 튜플 내의 이름은 비워 둘 수 없습니다.",
"namedTupleFirstArg": "명명된 튜플 클래스 이름이 첫 번째 인수로 필요합니다.",
"namedTupleMultipleInheritance": "NamedTuple을 사용한 여러 상속은 지원되지 않습니다.",
"namedTupleNameKeyword": "필드 이름은 키워드일 수 없습니다.",
"namedTupleNameType": "항목 이름 및 형식을 지정하는 2개 항목 튜플이 필요합니다.",
"namedTupleNameUnique": "명명된 튜플 내의 이름은 고유해야 합니다.",
"namedTupleNoTypes": "\"namedtuple\"은 튜플 항목에 대한 형식을 제공하지 않습니다. 대신 \"NamedTuple\" 사용",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Nazwy w nazwanej krotce nie mogą być puste",
"namedTupleFirstArg": "Oczekiwano nazwanej nazwy klasy krotki jako pierwszego argumentu",
"namedTupleMultipleInheritance": "Wielokrotne dziedziczenie z kotki NamedTuple nie jest obsługiwane",
"namedTupleNameKeyword": "Nazwy pól nie mogą być słowem kluczowym",
"namedTupleNameType": "Oczekiwano krotki z dwoma wpisami określającej nazwę i typ wpisu",
"namedTupleNameUnique": "Nazwy w nazwanej krotce muszą być unikatowe",
"namedTupleNoTypes": "Krotka „namedtuple” nie zapewnia typów wpisów krotki; zamiast tego użyj „NamedTuple”.",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Nomes dentro de uma tupla nomeada não podem ficar vazios",
"namedTupleFirstArg": "Nome de classe de tupla nomeado esperado como primeiro argumento",
"namedTupleMultipleInheritance": "Não há suporte para herança múltipla com NamedTuple",
"namedTupleNameKeyword": "Os nomes dos campos não podem ser uma palavra-chave",
"namedTupleNameType": "Tupla de duas entradas esperada especificando o nome e o tipo de entrada",
"namedTupleNameUnique": "Os nomes dentro de uma tupla nomeada devem ser exclusivos",
"namedTupleNoTypes": "\"namedtuple\" não fornece tipos para entradas de tupla. Em vez disso, use \"NamedTuple\"",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "[vnXqF][นั้Ñæmës wïthïñ æ ñæmëð tµplë çæññøt þë ëmptÿẤğ倪İЂҰक्र्तिृまẤğ倪นั้ढूँ]",
"namedTupleFirstArg": "[L5ZXq][นั้Ëxpëçtëð ñæmëð tµplë çlæss ñæmë æs fïrst ærgµmëñtẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰนั้ढूँ]",
"namedTupleMultipleInheritance": "[KYJOA][นั้Mµltïplë ïñhërïtæñçë wïth ÑæmëðTµplë ïs ñøt sµppørtëðẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्นั้ढूँ]",
"namedTupleNameKeyword": "[g6NTa][นั้Fïëlð ñæmës çæññøt þë æ këÿwørðẤğ倪İЂҰक्र्तिृนั้ढूँ]",
"namedTupleNameType": "[AxfdS][นั้Ëxpëçtëð twø-ëñtrÿ tµplë spëçïfÿïñg ëñtrÿ ñæmë æñð tÿpëẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्นั้ढूँ]",
"namedTupleNameUnique": "[TQaej][นั้Ñæmës wïthïñ æ ñæmëð tµplë mµst þë µñïqµëẤğ倪İЂҰक्र्तिृまẤğนั้ढूँ]",
"namedTupleNoTypes": "[Fn6FF][นั้\"ñæmëðtµplë\" prøvïðës ñø tÿpës før tµplë ëñtrïës; µsë \"ÑæmëðTµplë\" ïñstëæðẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृまẤğนั้ढूँ]",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Имена в именованном кортеже не могут быть пустыми",
"namedTupleFirstArg": "В качестве первого аргумента ожидалось имя именованного класса кортежа",
"namedTupleMultipleInheritance": "Множественное наследование для NamedTuple не поддерживается",
"namedTupleNameKeyword": "Имена полей не могут быть ключевыми словами",
"namedTupleNameType": "Ожидается двухфакторный кортеж с указанием имени и типа записи",
"namedTupleNameUnique": "Имена внутри именованного кортежа должны быть уникальными",
"namedTupleNoTypes": "\"namedtuple\" не предоставляет типов для записей кортежа; используйте вместо него \"NamedTuple\"",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "Adlandırılmış demet içindeki adlar boş olamaz",
"namedTupleFirstArg": "İlk bağımsız değişken olarak adlandırılmış demet sınıf adı bekleniyordu",
"namedTupleMultipleInheritance": "NamedTuple bulunan birden çok devralma desteklenmiyor",
"namedTupleNameKeyword": "Alan adları anahtar sözcük olamaz",
"namedTupleNameType": "Girdi adını ve türünü belirten iki girdili demet bekleniyordu",
"namedTupleNameUnique": "Adlandırılmış demet içindeki adlar benzersiz olmalıdır",
"namedTupleNoTypes": "\"namedtuple\" demet girdileri için tür sağlamaz; bunun yerine \"NamedTuple\" kullanın",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "命名元组中的名称不能为空",
"namedTupleFirstArg": "应将命名元组类名称作为第一个参数",
"namedTupleMultipleInheritance": "不支持使用 NamedTuple 进行多个继承",
"namedTupleNameKeyword": "字段名称不能是关键字",
"namedTupleNameType": "应为指定条目名称和类型的双条目元组",
"namedTupleNameUnique": "命名元组中的名称必须唯一",
"namedTupleNoTypes": "“namedtuple”不提供元组条目的类型请改用“NamedTuple”",

View File

@ -279,6 +279,7 @@
"namedTupleEmptyName": "具名元組內的名稱不可為空白",
"namedTupleFirstArg": "預期為具名 Tuple 類別名稱作為第一個引數",
"namedTupleMultipleInheritance": "不支援使用 NamedTuple 的多重繼承",
"namedTupleNameKeyword": "欄位名稱不能是關鍵字",
"namedTupleNameType": "指定項目名稱和類型預期有兩個項目 Tuple",
"namedTupleNameUnique": "具名 Tuple 內的名稱必須是唯一的",
"namedTupleNoTypes": "\"namedtuple\" 未提供 Tuple 項目的類型; 請改為使用 \"NamedTuple\"",

View File

@ -1126,3 +1126,49 @@ test('Complex type arguments', async () => {
},
});
});
test('Enum member', async () => {
const code = `
// @filename: test.py
//// from enum import Enum
////
//// class MyEnum(Enum):
//// this = 1
//// that = 2
////
//// print(MyEnum.[|/*marker*/|])
`;
const state = parseAndGetTestState(code).state;
await state.verifyCompletion('included', 'markdown', {
['marker']: {
completions: [
{
label: 'this',
kind: CompletionItemKind.EnumMember,
documentation: '```python\nthis: Literal[MyEnum.this]\n```',
},
],
},
});
});
test('no member of Enum member', async () => {
const code = `
// @filename: test.py
//// from enum import Enum
////
//// class MyEnum(Enum):
//// this = 1
//// that = 2
////
//// print(MyEnum.this.[|/*marker*/|])
`;
const state = parseAndGetTestState(code).state;
await state.verifyCompletion('exact', 'markdown', {
['marker']: { completions: [] },
});
});

View File

@ -18,6 +18,8 @@ import { combinePaths, getBaseFileName, normalizePath, normalizeSlashes } from '
import { PythonVersion } from '../common/pythonVersion';
import { createFromRealFileSystem } from '../common/realFileSystem';
import { TestFileSystem } from './harness/vfs/filesystem';
import { createConfigOptionsFrom } from '../backgroundThreadBase';
import { TestAccessHost } from './harness/testAccessHost';
const options = { console: new NullConsole() };
@ -305,3 +307,16 @@ test('FindFilesInMemoryOnly', () => {
const fileList = service.test_getFileNamesFromFileSpecs();
assert(fileList.filter((f) => f === untitled));
});
test('verify config fileSpecs after cloning', () => {
const fs = new TestFileSystem(/* ignoreCase */ true);
const configFile = {
ignore: ['**/node_modules/**'],
};
const config = new ConfigOptions(process.cwd());
config.initializeFromJson(configFile, undefined, new NullConsole(), fs, new TestAccessHost());
const cloned = createConfigOptionsFrom(config);
assert.deepEqual(config.ignore, cloned.ignore);
});

View File

@ -0,0 +1,41 @@
/// <reference path="fourslash.ts" />
// @filename: callHierarchy.py
//// import abc
////
//// class Base(abc.ABC):
//// @abc.abstractmethod
//// def method(self):
//// pass
////
//// class Derived(Base):
//// def method(self):
//// pass
////
//// class BaseConsumer:
//// def [|consumer_base|](self, base: Base):
//// base./*marker1*/method()
////
//// class DerivedConsumer:
//// def [|consumer_derived|](self, derived: Derived):
//// derived./*marker2*/method()
{
const ranges = helper.getRanges();
const references = ranges.map((range) => {
return { path: range.fileName, range: helper.convertPositionRange(range) };
});
const itemList = [
{ filePath: references[0].path, range: references[0].range, name: 'consumer_base' },
{ filePath: references[1].path, range: references[1].range, name: 'consumer_derived' },
];
helper.verifyShowCallHierarchyGetIncomingCalls({
marker1: {
items: itemList,
},
marker2: {
items: itemList,
},
});
}