Skip to content

Commit

Permalink
Improved error reporting for PEP 728 features when `enableExperimenta…
Browse files Browse the repository at this point in the history
…lFeatures` is not true. This addresses #9928.
  • Loading branch information
erictraut committed Feb 17, 2025
1 parent 4d486fe commit ccb873d
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 35 deletions.
55 changes: 27 additions & 28 deletions packages/pyright-internal/src/analyzer/typeEvaluator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17489,21 +17489,20 @@ export function createTypeEvaluator(
);
} else if (arg.d.name.d.value === 'total' && !constArgValue) {
classType.shared.flags |= ClassTypeFlags.CanOmitDictValues;
} else if (arg.d.name.d.value === 'closed') {
} else if (
arg.d.name.d.value === 'closed' &&
AnalyzerNodeInfo.getFileInfo(node).diagnosticRuleSet.enableExperimentalFeatures
) {
if (constArgValue) {
// This is an experimental feature because PEP 728 hasn't been accepted yet.
if (AnalyzerNodeInfo.getFileInfo(node).diagnosticRuleSet.enableExperimentalFeatures) {
classType.shared.flags |=
ClassTypeFlags.TypedDictMarkedClosed |
ClassTypeFlags.TypedDictEffectivelyClosed;
classType.shared.flags |=
ClassTypeFlags.TypedDictMarkedClosed | ClassTypeFlags.TypedDictEffectivelyClosed;

if (classType.shared.typedDictExtraItemsExpr) {
addDiagnostic(
DiagnosticRule.reportGeneralTypeIssues,
LocMessage.typedDictExtraItemsClosed(),
classType.shared.typedDictExtraItemsExpr
);
}
if (classType.shared.typedDictExtraItemsExpr) {
addDiagnostic(
DiagnosticRule.reportGeneralTypeIssues,
LocMessage.typedDictExtraItemsClosed(),
classType.shared.typedDictExtraItemsExpr
);
}
}

Expand All @@ -17517,21 +17516,21 @@ export function createTypeEvaluator(

sawClosedOrExtraItems = true;
}
} else if (arg.d.name.d.value === 'extra_items') {
// This is an experimental feature because PEP 728 hasn't been accepted yet.
if (AnalyzerNodeInfo.getFileInfo(node).diagnosticRuleSet.enableExperimentalFeatures) {
// Record a reference to the expression but don't evaluate it yet.
// It may refer to the class itself.
classType.shared.typedDictExtraItemsExpr = arg.d.valueExpr;
classType.shared.flags |= ClassTypeFlags.TypedDictEffectivelyClosed;

if (ClassType.isTypedDictMarkedClosed(classType)) {
addDiagnostic(
DiagnosticRule.reportGeneralTypeIssues,
LocMessage.typedDictExtraItemsClosed(),
classType.shared.typedDictExtraItemsExpr
);
}
} else if (
arg.d.name.d.value === 'extra_items' &&
AnalyzerNodeInfo.getFileInfo(node).diagnosticRuleSet.enableExperimentalFeatures
) {
// Record a reference to the expression but don't evaluate it yet.
// It may refer to the class itself.
classType.shared.typedDictExtraItemsExpr = arg.d.valueExpr;
classType.shared.flags |= ClassTypeFlags.TypedDictEffectivelyClosed;

if (ClassType.isTypedDictMarkedClosed(classType)) {
addDiagnostic(
DiagnosticRule.reportGeneralTypeIssues,
LocMessage.typedDictExtraItemsClosed(),
classType.shared.typedDictExtraItemsExpr
);
}

if (sawClosedOrExtraItems) {
Expand Down
17 changes: 10 additions & 7 deletions packages/pyright-internal/src/analyzer/typedDicts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,13 @@ export function createTypedDictType(
);
} else if (arg.name.d.value === 'total' && arg.valueExpression.d.constType === KeywordType.False) {
classType.shared.flags |= ClassTypeFlags.CanOmitDictValues;
} else if (arg.name.d.value === 'closed') {
} else if (
arg.name.d.value === 'closed' &&
AnalyzerNodeInfo.getFileInfo(errorNode).diagnosticRuleSet.enableExperimentalFeatures
) {
if (arg.valueExpression.d.constType === KeywordType.True) {
// This is an experimental feature because PEP 728 hasn't been accepted yet.
if (AnalyzerNodeInfo.getFileInfo(errorNode).diagnosticRuleSet.enableExperimentalFeatures) {
classType.shared.flags |=
ClassTypeFlags.TypedDictMarkedClosed | ClassTypeFlags.TypedDictEffectivelyClosed;
}
classType.shared.flags |=
ClassTypeFlags.TypedDictMarkedClosed | ClassTypeFlags.TypedDictEffectivelyClosed;
}

if (sawClosedOrExtraItems) {
Expand All @@ -225,7 +225,10 @@ export function createTypedDictType(

sawClosedOrExtraItems = true;
}
} else if (arg.name?.d.value === 'extra_items') {
} else if (
arg.name?.d.value === 'extra_items' &&
AnalyzerNodeInfo.getFileInfo(errorNode).diagnosticRuleSet.enableExperimentalFeatures
) {
classType.shared.typedDictExtraItemsExpr = arg.valueExpression;
classType.shared.flags |= ClassTypeFlags.TypedDictEffectivelyClosed;

Expand Down

0 comments on commit ccb873d

Please sign in to comment.