Skip to content

Deduplicate repeated declarations on union/intersection properties#4600

Open
Andarist wants to merge 3 commits into
microsoft:mainfrom
Andarist:fix/duplicated-declarations
Open

Deduplicate repeated declarations on union/intersection properties#4600
Andarist wants to merge 3 commits into
microsoft:mainfrom
Andarist:fix/duplicated-declarations

Conversation

@Andarist

Copy link
Copy Markdown
Contributor

Copilot AI review requested due to automatic review settings July 10, 2026 22:33

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a detailed writeup about what happens in this repro can be found here: microsoft/TypeScript#63119

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses microsoft/TypeScript#63560 by deduplicating repeated Symbol.Declarations when constructing union/intersection properties, reducing declaration blow-ups (OOM/crash risk) and making symbol baselines deterministic.

Changes:

  • Deduplicate prop.Declarations while synthesizing union/intersection properties in the checker.
  • Add new compiler regression tests covering intersection-constructor reduction and a large union/intersection cross-product scenario.
  • Update numerous .symbols / .symbols.diff baselines to reflect the new (deduplicated) declaration lists.

Reviewed changes

Copilot reviewed 58 out of 60 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
internal/checker/checker.go Deduplicates declaration lists while building union/intersection properties.
testdata/tests/cases/compiler/intersectionConstructorReductionCrash.ts New regression test for intersection-constructor reduction crash scenario.
testdata/baselines/reference/compiler/intersectionConstructorReductionCrash.symbols Baseline updates for the new intersection-constructor regression test.
testdata/baselines/reference/compiler/intersectionConstructorReductionCrash.types Baseline updates for the new intersection-constructor regression test.
testdata/tests/cases/compiler/crossProductUnionIntersectionRepeatedPropDeclarationsNoOOM1.ts New regression test exercising large union/intersection cross-product behavior.
testdata/baselines/reference/compiler/crossProductUnionIntersectionRepeatedPropDeclarationsNoOOM1.symbols New symbols baseline for the cross-product regression test.
testdata/baselines/reference/compiler/crossProductUnionIntersectionRepeatedPropDeclarationsNoOOM1.types New types baseline for the cross-product regression test.
testdata/baselines/reference/compiler/crossProductUnionIntersectionRepeatedPropDeclarationsNoOOM1.errors.txt New error baseline for the cross-product regression test.
testdata/baselines/reference/submodule/conformance/typedefCrossModule2.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/typedefCrossModule2.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/objectLiteralNormalization.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/objectLiteralNormalization.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/mixinAccessModifiers.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/mixinAccessModifiers.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/intersectionOfUnionNarrowing.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/intersectionOfUnionNarrowing.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/bivariantInferences.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/conformance/bivariantInferences.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/unionOfClassCalls.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/unionOfClassCalls.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/unionOfArraysFilterCall.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/unionOfArraysFilterCall.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/unionCallMixedTypeParameterPresence.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/unionCallMixedTypeParameterPresence.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeVariableConstraintIntersections.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeVariableConstraintIntersections.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeParameterLeak.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeParameterLeak.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeParameterExtendingUnion2.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeParameterExtendingUnion2.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeParameterExtendingUnion1.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/typeParameterExtendingUnion1.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/sliceResultCast.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/sliceResultCast.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/silentNeverPropagation.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/silentNeverPropagation.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/recursiveArrayNotCircular.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/recursiveArrayNotCircular.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/neverAsDiscriminantType(strict=true).symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/neverAsDiscriminantType(strict=true).symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/neverAsDiscriminantType(strict=false).symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/neverAsDiscriminantType(strict=false).symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/discriminateWithOptionalProperty4(exactoptionalpropertytypes=true).symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/discriminateWithOptionalProperty4(exactoptionalpropertytypes=true).symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/discriminateWithOptionalProperty4(exactoptionalpropertytypes=false).symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/discriminateWithOptionalProperty4(exactoptionalpropertytypes=false).symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/controlFlowArrayErrors.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/controlFlowArrayErrors.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/contextualOverloadListFromArrayUnion.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/contextualOverloadListFromArrayUnion.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/callsOnComplexSignatures.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/callsOnComplexSignatures.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/bestChoiceType.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/bestChoiceType.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/arraySlice.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/arraySlice.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/arrayDestructuringInSwitch1.symbols.diff Baseline diffs updated to remove duplicate declaration entries.
testdata/baselines/reference/submodule/compiler/arrayDestructuringInSwitch1.symbols Baseline updated to remove duplicate declaration entries.
testdata/baselines/reference/compiler/nestedSpreadsAndWidening.symbols Baseline updated to reflect deduplicated declarations.
testdata/baselines/reference/compiler/multipleModuleExportsAssignments.symbols Baseline updated to reflect deduplicated declarations.

Comment on lines +21507 to +21509
for _, declaration := range prop.Declarations {
declarations = core.AppendIfUnique(declarations, declaration)
}
Comment on lines +421 to +431
export function createShapeAtNearestAdjacentEmptyPosition<
N extends ShapeWithDimensions<TLShape>,
>({
newShape: newShapePartial,
}: {
newShape: ShapePartialWithDimensions<N>;
}): {
newShape: N;
} {
newShapePartial.props?.w;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Quadratic duplicate declaration accumulation in intersection constructor properties can crash with RangeError

2 participants