Skip to content

Commit d0bc751

Browse files
authored
Removed recent check for illegal identifiers used in alias for dataclass_transform field. This isn't an illegal condition, so the resulting error was a false positive. Instead, changed completion provider to not suggest the illegal identifier as a valid keyword argument. This addresses #9386, #9220, #9278. (#9390)
1 parent ae9160e commit d0bc751

20 files changed

+6
-36
lines changed

packages/pyright-internal/src/analyzer/dataClasses.ts

-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import {
2525
ParseNodeType,
2626
TypeAnnotationNode,
2727
} from '../parser/parseNodes';
28-
import { Tokenizer } from '../parser/tokenizer';
2928
import * as AnalyzerNodeInfo from './analyzerNodeInfo';
3029
import { getFileInfo } from './analyzerNodeInfo';
3130
import { ConstraintSolution } from './constraintSolution';
@@ -333,14 +332,6 @@ export function synthesizeDataClassMethods(
333332
isLiteralType(valueType)
334333
) {
335334
aliasName = valueType.priv.literalValue as string;
336-
337-
if (!Tokenizer.isPythonIdentifier(aliasName)) {
338-
evaluator.addDiagnostic(
339-
DiagnosticRule.reportGeneralTypeIssues,
340-
LocMessage.dataClassFieldInvalidAlias().format({ aliasName }),
341-
aliasArg.d.valueExpr
342-
);
343-
}
344335
}
345336
}
346337

packages/pyright-internal/src/languageService/completionProvider.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ import {
111111
TypeAnnotationNode,
112112
} from '../parser/parseNodes';
113113
import { ParseFileResults } from '../parser/parser';
114+
import { Tokenizer } from '../parser/tokenizer';
114115
import {
115116
FStringStartToken,
116117
OperatorToken,
@@ -2893,7 +2894,10 @@ export class CompletionProvider {
28932894
paramInfo.kind !== ParamKind.Positional &&
28942895
paramInfo.kind !== ParamKind.ExpandedArgs
28952896
) {
2896-
if (!SymbolNameUtils.isPrivateOrProtectedName(paramInfo.param.name)) {
2897+
if (
2898+
!SymbolNameUtils.isPrivateOrProtectedName(paramInfo.param.name) &&
2899+
Tokenizer.isPythonIdentifier(paramInfo.param.name)
2900+
) {
28972901
names.add(paramInfo.param.name);
28982902
}
28992903
}

packages/pyright-internal/src/localization/localize.ts

-2
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,6 @@ export namespace Localizer {
370370
);
371371
export const dataClassFieldInheritedDefault = () =>
372372
new ParameterizedString<{ fieldName: string }>(getRawString('Diagnostic.dataClassFieldInheritedDefault'));
373-
export const dataClassFieldInvalidAlias = () =>
374-
new ParameterizedString<{ aliasName: string }>(getRawString('Diagnostic.dataClassFieldInvalidAlias'));
375373
export const dataClassFieldWithDefault = () => getRawString('Diagnostic.dataClassFieldWithDefault');
376374
export const dataClassFieldWithoutAnnotation = () => getRawString('Diagnostic.dataClassFieldWithoutAnnotation');
377375
export const dataClassFieldWithPrivateName = () => getRawString('Diagnostic.dataClassFieldWithPrivateName');

packages/pyright-internal/src/localization/package.nls.cs.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "Argument typu {argType} není platný převaděč pro pole {fieldName} typu {fieldType}",
105105
"dataClassConverterOverloads": "Žádná přetížení {funcName} nejsou platné převaděče pro pole {fieldName} typu {fieldType}",
106106
"dataClassFieldInheritedDefault": "{fieldName} přepíše pole se stejným názvem, ale chybí mu výchozí hodnota.",
107-
"dataClassFieldInvalidAlias": "Název aliasu {aliasName} není platný identifikátor.",
108107
"dataClassFieldWithDefault": "Pole bez výchozích hodnot se nemůžou zobrazit po polích s výchozími hodnotami",
109108
"dataClassFieldWithPrivateName": "Pole datové třídy nemůže používat privátní název",
110109
"dataClassFieldWithoutAnnotation": "Pole dataclass bez poznámky typu způsobí výjimku modulu runtime",

packages/pyright-internal/src/localization/package.nls.de.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "Das Argument vom Typ \"{argType}\" ist kein gültiger Konverter für das Feld \"{fieldName}\" vom Typ \"{fieldType}\"",
105105
"dataClassConverterOverloads": "Keine Überladungen von \"{funcName}\" sind gültige Konverter für das Feld \"{fieldName}\" vom Typ \"{fieldType}\"",
106106
"dataClassFieldInheritedDefault": "„{fieldName}“ überschreibt ein Feld mit demselben Namen, aber es fehlt ein Standardwert",
107-
"dataClassFieldInvalidAlias": "Der Aliasname „{aliasName}“ ist kein gültiger Bezeichner.",
108107
"dataClassFieldWithDefault": "Felder ohne Standardwerte dürfen nicht nach Feldern mit Standardwerten angezeigt werden.",
109108
"dataClassFieldWithPrivateName": "Das Feld \"Dataclass\" kann keinen privaten Namen verwenden.",
110109
"dataClassFieldWithoutAnnotation": "Datenklassenfeld ohne Typanmerkung verursacht eine Laufzeitausnahme",

packages/pyright-internal/src/localization/package.nls.en-us.json

-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@
218218
"dataClassConverterFunction": "Argument of type \"{argType}\" is not a valid converter for field \"{fieldName}\" of type \"{fieldType}\"",
219219
"dataClassConverterOverloads": "No overloads of \"{funcName}\" are valid converters for field \"{fieldName}\" of type \"{fieldType}\"",
220220
"dataClassFieldInheritedDefault": "\"{fieldName}\" overrides a field of the same name but is missing a default value",
221-
"dataClassFieldInvalidAlias": "Alias name \"{aliasName}\" is not a valid identifier",
222221
"dataClassFieldWithDefault": "Fields without default values cannot appear after fields with default values",
223222
"dataClassFieldWithPrivateName": "Dataclass field cannot use private name",
224223
"dataClassFieldWithoutAnnotation": "Dataclass field without type annotation will cause runtime exception",

packages/pyright-internal/src/localization/package.nls.es.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "Argumento de tipo \"{argType}\" no es un convertidor válido para el campo \"{fieldName}\" de tipo \"{fieldType}\"",
105105
"dataClassConverterOverloads": "No hay sobrecargas de \"{funcName}\" que sean convertidores válidos para el campo \"{fieldName}\" de tipo \"{fieldType}\"",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\" invalida un campo con el mismo nombre, pero falta un valor predeterminado",
107-
"dataClassFieldInvalidAlias": "El nombre de alias \"{aliasName}\" no es un identificador válido",
108107
"dataClassFieldWithDefault": "Los campos sin valores predeterminados no pueden aparecer después de los campos con valores predeterminados",
109108
"dataClassFieldWithPrivateName": "El campo Dataclass no puede utilizar un nombre privado",
110109
"dataClassFieldWithoutAnnotation": "El campo Dataclass sin anotación de tipo provocará una excepción en tiempo de ejecución",

packages/pyright-internal/src/localization/package.nls.fr.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "L’argument de type « {argType} » n’est pas un convertisseur valide pour le champ « {fieldName} » de type « {fieldType} »",
105105
"dataClassConverterOverloads": "Aucune surcharge de « {funcName} » n’est valide pour le champ « {fieldName} » de type « {fieldType} »",
106106
"dataClassFieldInheritedDefault": "« {fieldName} » remplace un champ du même nom mais n’a pas de valeur par défaut",
107-
"dataClassFieldInvalidAlias": "Le nom d’alias « {aliasName} » n’est pas un identificateur valide",
108107
"dataClassFieldWithDefault": "Les champs sans valeurs par défaut ne peuvent pas apparaître après les champs avec des valeurs par défaut",
109108
"dataClassFieldWithPrivateName": "Le champ Dataclass ne peut pas utiliser de nom privé",
110109
"dataClassFieldWithoutAnnotation": "Le champ Dataclass sans annotation de type provoquera une exception d'exécution",

packages/pyright-internal/src/localization/package.nls.it.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "L'argomento di tipo \"{argType}\" non è un convertitore valido per il campo \"{fieldName}\" di tipo \"{fieldType}\"",
105105
"dataClassConverterOverloads": "Nessun overload di \"{funcName}\" è un convertitore valido per il campo \"{fieldName}\" di tipo \"{fieldType}\"",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\" esegue l'override di un campo con lo stesso nome, ma manca un valore predefinito",
107-
"dataClassFieldInvalidAlias": "Il nome alias \"{aliasName}\" non è un identificatore valido",
108107
"dataClassFieldWithDefault": "I campi senza valori predefiniti non possono essere visualizzati dopo i campi con valori predefiniti",
109108
"dataClassFieldWithPrivateName": "Il campo dataclass non può usare un nome privato",
110109
"dataClassFieldWithoutAnnotation": "Il campo dataclass senza annotazione del tipo causerà un'eccezione di runtime",

packages/pyright-internal/src/localization/package.nls.ja.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "\"{argType}\" の引数は、型 \"{fieldType}\" のフィールド \"{fieldName}\" の有効なコンバーターではありません",
105105
"dataClassConverterOverloads": "{funcName}\" のオーバーロードは、型 \"{fieldType}\" のフィールド \"{fieldName}\" に対して有効なコンバーターではありません",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\" は同じ名前のフィールドをオーバーライドしますが、既定値がありません",
107-
"dataClassFieldInvalidAlias": "エイリアス名 \"{aliasName}\" は有効な識別子ではありません",
108107
"dataClassFieldWithDefault": "既定値のないフィールドは、既定値を持つフィールドの後に表示できません",
109108
"dataClassFieldWithPrivateName": "データクラス フィールドはプライベート名を使用できません",
110109
"dataClassFieldWithoutAnnotation": "型注釈のないデータクラス フィールドが原因でランタイム例外が発生する",

packages/pyright-internal/src/localization/package.nls.ko.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "\"{argType}\" 형식의 인수는 \"{fieldType}\" 형식의 \"{fieldName}\" 필드에 유효한 변환기가 아닙니다.",
105105
"dataClassConverterOverloads": "\"{funcName}\"의 오버로드는 \"{fieldType}\" 형식의 \"{fieldName}\" 필드에 유효한 변환기가 아닙니다.",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\"이(가) 같은 이름의 필드를 재정의하지만 기본값이 없음",
107-
"dataClassFieldInvalidAlias": "별칭 이름 \"{aliasName}\"은(는) 유효한 식별자가 아닙니다.",
108107
"dataClassFieldWithDefault": "기본값이 없는 필드는 기본값이 있는 필드 뒤에 나타날 수 없습니다.",
109108
"dataClassFieldWithPrivateName": "데이터 클래스 필드는 프라이빗 이름을 사용할 수 없습니다.",
110109
"dataClassFieldWithoutAnnotation": "형식 주석이 없는 데이터 클래스 필드를 사용하면 런타임 예외가 발생합니다.",

packages/pyright-internal/src/localization/package.nls.pl.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "Argument typu „{argType}” nie jest prawidłowym konwerterem pola „{fieldName}” typu „{fieldType}”",
105105
"dataClassConverterOverloads": "Żadne przeciążenia „{funcName}” nie są prawidłowymi konwerterami dla pola „{fieldName}” typu „{fieldType}”",
106106
"dataClassFieldInheritedDefault": "Pole „{fieldName}” zastępuje pole o tej samej nazwie, ale brakuje wartości domyślnej",
107-
"dataClassFieldInvalidAlias": "Nazwa aliasu „{aliasName}” nie jest prawidłowym identyfikatorem",
108107
"dataClassFieldWithDefault": "Pola bez wartości domyślnych nie mogą występować po polach z wartościami domyślnymi",
109108
"dataClassFieldWithPrivateName": "Pole klasy danych nie może używać nazwy prywatnej",
110109
"dataClassFieldWithoutAnnotation": "Pole klasy danych bez adnotacji typu spowoduje wyjątek środowiska uruchomieniowego",

packages/pyright-internal/src/localization/package.nls.pt-br.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "O argumento do tipo \"{argType}\" não é um conversor válido para o campo \"{fieldName}\" do tipo \"{fieldType}\"",
105105
"dataClassConverterOverloads": "Nenhuma sobrecarga de \"{funcName}\" são conversores válidos para o campo \"{fieldName}\" do tipo \"{fieldType}\"",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\" substitui um campo com o mesmo nome, mas não possui um valor padrão",
107-
"dataClassFieldInvalidAlias": "O nome de alias \"{aliasName}\" não é um identificador válido",
108107
"dataClassFieldWithDefault": "Campos sem valores padrão não podem aparecer após campos com valores padrão",
109108
"dataClassFieldWithPrivateName": "O campo Dataclass não pode usar o nome privado",
110109
"dataClassFieldWithoutAnnotation": "O campo Dataclass sem anotação de tipo causará uma exceção de runtime",

packages/pyright-internal/src/localization/package.nls.qps-ploc.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "[FxD8r][นั้Ærgµmëñt øf tÿpë \"{ærgTÿpë}\" ïs ñøt æ vælïð çøñvërtër før fïëlð \"{fïëlðÑæmë}\" øf tÿpë \"{fïëlðTÿpë}\"Ấğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृนั้ढूँ]",
105105
"dataClassConverterOverloads": "[ZJ0SE][นั้Ñø øvërløæðs øf \"{fµñçÑæmë}\" ærë vælïð çøñvërtërs før fïëlð \"{fïëlðÑæmë}\" øf tÿpë \"{fïëlðTÿpë}\"Ấğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्นั้ढूँ]",
106106
"dataClassFieldInheritedDefault": "[BKxvn][นั้\"{fïëlðÑæmë}\" øvërrïðës æ fïëlð øf thë sæmë ñæmë þµt ïs mïssïñg æ ðëfæµlt vælµëẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृまẤğ倪İนั้ढूँ]",
107-
"dataClassFieldInvalidAlias": "[Yie5U][นั้Ælïæs ñæmë \"{ælïæsÑæmë}\" ïs ñøt æ vælïð ïðëñtïfïërẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰนั้ढूँ]",
108107
"dataClassFieldWithDefault": "[iJuju][นั้Fïëlðs wïthøµt ðëfæµlt vælµës çæññøt æppëær æftër fïëlðs wïth ðëfæµlt vælµësẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृまẤğนั้ढूँ]",
109108
"dataClassFieldWithPrivateName": "[miQYb][นั้Ðætæçlæss fïëlð çæññøt µsë prïvætë ñæmëẤğ倪İЂҰक्र्तिृまẤğนั้ढूँ]",
110109
"dataClassFieldWithoutAnnotation": "[zq5t5][นั้Ðætæçlæss fïëlð wïthøµt tÿpë æññøtætïøñ wïll çæµsë rµñtïmë ëxçëptïøñẤğ倪İЂҰक्र्तिृまẤğ倪İЂҰक्र्तिृนั้ढूँ]",

packages/pyright-internal/src/localization/package.nls.ru.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "Аргумент типа \"{argType}\" не является допустимым преобразователем для поля \"{fieldName}\" типа \"{fieldType}\"",
105105
"dataClassConverterOverloads": "Ни одна перегрузка \"{funcName}\" не является допустимым преобразователем поля \"{fieldName}\" типа \"{fieldType}\"",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\" переопределяет поле с тем же именем, но в нем отсутствует значение по умолчанию",
107-
"dataClassFieldInvalidAlias": "Псевдоним \"{aliasName}\" не является допустимым идентификатором",
108107
"dataClassFieldWithDefault": "Поля без значений по умолчанию не могут отображаться после полей со значениями по умолчанию.",
109108
"dataClassFieldWithPrivateName": "Поле класса данных не может использовать закрытое имя",
110109
"dataClassFieldWithoutAnnotation": "Поле dataclass без заметки с типом вызовет исключение среды выполнения",

packages/pyright-internal/src/localization/package.nls.tr.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "\"{argType}\" türündeki bağımsız değişken, \"{fieldName}\" türündeki \"{fieldType}\" alanı için geçerli bir dönüştürücü değil",
105105
"dataClassConverterOverloads": "\"{funcName}\" işlevinin aşırı yüklemelerinden hiçbiri \"{fieldType}\" türündeki \"{fieldName}\" alanı için geçerli dönüştürücüler değil",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\", aynı ada sahip bir alanı geçersiz kılıyor ancak varsayılan değeri yok",
107-
"dataClassFieldInvalidAlias": "\"{aliasName}\" diğer adı geçerli bir tanımlayıcı değil",
108107
"dataClassFieldWithDefault": "Varsayılan değerleri olmayan alanlar, varsayılan değerleri olan alanlardan sonra gelemez",
109108
"dataClassFieldWithPrivateName": "Veri sınıfı alanı özel ad kullanamıyor",
110109
"dataClassFieldWithoutAnnotation": "Tür ek açıklaması olmayan veri sınıfı alanı çalışma zamanı özel durumuna neden olur",

packages/pyright-internal/src/localization/package.nls.zh-cn.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "类型“{argType}”的参数不是类型为“{fieldType}”的字段“{fieldName}”的有效转换器",
105105
"dataClassConverterOverloads": "“{funcName}”的重载不是类型为“{fieldType}”的字段“{fieldName}”的有效转换器",
106106
"dataClassFieldInheritedDefault": "“{fieldName}”替代同名字段,但缺少默认值",
107-
"dataClassFieldInvalidAlias": "别名“{aliasName}”不是有效的标识符",
108107
"dataClassFieldWithDefault": "没有默认值的字段不能出现在具有默认值的字段之后",
109108
"dataClassFieldWithPrivateName": "数据类字段不能使用专用名称",
110109
"dataClassFieldWithoutAnnotation": "不带类型批注的数据类字段将导致运行时异常",

packages/pyright-internal/src/localization/package.nls.zh-tw.json

-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
"dataClassConverterFunction": "類型 \"{argType}\" 的引數不是類型 \"{fieldType}\" 欄位 \"{fieldName}\" 的有效轉換程式",
105105
"dataClassConverterOverloads": "\"{funcName}\" 沒有任何多載是類型 \"{fieldType}\" 欄位 \"{fieldName}\" 的有效轉換程式",
106106
"dataClassFieldInheritedDefault": "\"{fieldName}\" 覆寫相同名稱的欄位,但缺少預設值",
107-
"dataClassFieldInvalidAlias": "別名名稱 \"{aliasName}\" 並非有效的識別碼",
108107
"dataClassFieldWithDefault": "沒有預設值的欄位無法出現在具有預設值的欄位後面",
109108
"dataClassFieldWithPrivateName": "Dataclass 欄位不能使用私人名稱",
110109
"dataClassFieldWithoutAnnotation": "沒有型別註釋的 Dataclass 欄位會造成執行階段例外狀況",

packages/pyright-internal/src/tests/samples/dataclassTransform3.py

-8
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,3 @@ class Customer3(ModelBaseFrozen):
123123

124124
# This should generate an error because Customer3 is frozen.
125125
c3_1.id = 4
126-
127-
128-
class Customer4(ModelBase):
129-
# This should generate an error because alias must be a valid identifier.
130-
name1: str = model_field(alias="other name")
131-
132-
# This should generate an error because alias must be a valid identifier.
133-
name2: str = model_field(alias="+test")

packages/pyright-internal/src/tests/typeEvaluator5.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ test('DataclassTransform2', () => {
439439
test('DataclassTransform3', () => {
440440
const analysisResults = TestUtils.typeAnalyzeSampleFiles(['dataclassTransform3.py']);
441441

442-
TestUtils.validateResults(analysisResults, 8);
442+
TestUtils.validateResults(analysisResults, 6);
443443
});
444444

445445
test('DataclassTransform4', () => {

0 commit comments

Comments
 (0)