mirror of
https://github.com/microsoft/pyright.git
synced 2024-10-05 12:27:30 +03:00
Push pylance changes to pyright (#5542)
This commit is contained in:
parent
455830ed42
commit
b917b7a5e0
2672
package-lock.json
generated
2672
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@ -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"
|
||||
}
|
||||
}
|
||||
|
6924
packages/pyright-internal/package-lock.json
generated
6924
packages/pyright-internal/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
};
|
||||
};
|
||||
|
@ -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!);
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
@ -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],
|
||||
]);
|
||||
|
@ -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",
|
||||
|
@ -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\".",
|
||||
|
@ -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\".",
|
||||
|
@ -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": "L’héritage multiple avec NamedTuple n’est 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 l’entré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",
|
||||
|
@ -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\"",
|
||||
|
@ -279,6 +279,7 @@
|
||||
"namedTupleEmptyName": "名前付きタプル内の名前を空にすることはできません",
|
||||
"namedTupleFirstArg": "最初の引数として名前付きタプル クラス名が必要です",
|
||||
"namedTupleMultipleInheritance": "NamedTuple による複数の継承はサポートされていません",
|
||||
"namedTupleNameKeyword": "フィールド名をキーワードにすることはできません",
|
||||
"namedTupleNameType": "エントリ名と型を指定する 2 エントリタプルが必要です",
|
||||
"namedTupleNameUnique": "名前付きタプル内の名前は一意である必要があります",
|
||||
"namedTupleNoTypes": "\"namedtuple\" はタプル エントリに型を提供しません。代わりに \"NamedTuple\" を使用してください",
|
||||
|
@ -279,6 +279,7 @@
|
||||
"namedTupleEmptyName": "명명된 튜플 내의 이름은 비워 둘 수 없습니다.",
|
||||
"namedTupleFirstArg": "명명된 튜플 클래스 이름이 첫 번째 인수로 필요합니다.",
|
||||
"namedTupleMultipleInheritance": "NamedTuple을 사용한 여러 상속은 지원되지 않습니다.",
|
||||
"namedTupleNameKeyword": "필드 이름은 키워드일 수 없습니다.",
|
||||
"namedTupleNameType": "항목 이름 및 형식을 지정하는 2개 항목 튜플이 필요합니다.",
|
||||
"namedTupleNameUnique": "명명된 튜플 내의 이름은 고유해야 합니다.",
|
||||
"namedTupleNoTypes": "\"namedtuple\"은 튜플 항목에 대한 형식을 제공하지 않습니다. 대신 \"NamedTuple\" 사용",
|
||||
|
@ -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”.",
|
||||
|
@ -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\"",
|
||||
|
@ -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ëæðẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृまẤğนั้ढूँ]",
|
||||
|
@ -279,6 +279,7 @@
|
||||
"namedTupleEmptyName": "Имена в именованном кортеже не могут быть пустыми",
|
||||
"namedTupleFirstArg": "В качестве первого аргумента ожидалось имя именованного класса кортежа",
|
||||
"namedTupleMultipleInheritance": "Множественное наследование для NamedTuple не поддерживается",
|
||||
"namedTupleNameKeyword": "Имена полей не могут быть ключевыми словами",
|
||||
"namedTupleNameType": "Ожидается двухфакторный кортеж с указанием имени и типа записи",
|
||||
"namedTupleNameUnique": "Имена внутри именованного кортежа должны быть уникальными",
|
||||
"namedTupleNoTypes": "\"namedtuple\" не предоставляет типов для записей кортежа; используйте вместо него \"NamedTuple\"",
|
||||
|
@ -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",
|
||||
|
@ -279,6 +279,7 @@
|
||||
"namedTupleEmptyName": "命名元组中的名称不能为空",
|
||||
"namedTupleFirstArg": "应将命名元组类名称作为第一个参数",
|
||||
"namedTupleMultipleInheritance": "不支持使用 NamedTuple 进行多个继承",
|
||||
"namedTupleNameKeyword": "字段名称不能是关键字",
|
||||
"namedTupleNameType": "应为指定条目名称和类型的双条目元组",
|
||||
"namedTupleNameUnique": "命名元组中的名称必须唯一",
|
||||
"namedTupleNoTypes": "“namedtuple”不提供元组条目的类型;请改用“NamedTuple”",
|
||||
|
@ -279,6 +279,7 @@
|
||||
"namedTupleEmptyName": "具名元組內的名稱不可為空白",
|
||||
"namedTupleFirstArg": "預期為具名 Tuple 類別名稱作為第一個引數",
|
||||
"namedTupleMultipleInheritance": "不支援使用 NamedTuple 的多重繼承",
|
||||
"namedTupleNameKeyword": "欄位名稱不能是關鍵字",
|
||||
"namedTupleNameType": "指定項目名稱和類型預期有兩個項目 Tuple",
|
||||
"namedTupleNameUnique": "具名 Tuple 內的名稱必須是唯一的",
|
||||
"namedTupleNoTypes": "\"namedtuple\" 未提供 Tuple 項目的類型; 請改為使用 \"NamedTuple\"",
|
||||
|
@ -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: [] },
|
||||
});
|
||||
});
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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,
|
||||
},
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue
Block a user