From 44faa39e70e82c469f155a27850a405f49c469af Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 16 May 2025 13:48:50 -0700 Subject: [PATCH 1/3] Check patterns for validity before matching against them --- internal/core/pattern.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/core/pattern.go b/internal/core/pattern.go index 883dbe6628..1d2a88e67c 100644 --- a/internal/core/pattern.go +++ b/internal/core/pattern.go @@ -43,6 +43,9 @@ func FindBestPatternMatch[T any](values []T, getPattern func(v T) Pattern, candi longestMatchPrefixLength := -1 for _, value := range values { pattern := getPattern(value) + if !pattern.IsValid() { + continue + } if (pattern.StarIndex == -1 || pattern.StarIndex > longestMatchPrefixLength) && pattern.Matches(candidate) { bestPattern = value longestMatchPrefixLength = pattern.StarIndex From eee63079b48e266d18ab571493ea2a8bbe6a2392 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 16 May 2025 14:40:12 -0700 Subject: [PATCH 2/3] Move validity check to binder --- internal/binder/binder.go | 2 +- internal/core/pattern.go | 3 --- .../invalidGlobalAugmentation.errors.txt | 19 +++++++++++++++++++ .../compiler/invalidGlobalAugmentation.ts | 13 +++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 testdata/baselines/reference/compiler/invalidGlobalAugmentation.errors.txt create mode 100644 testdata/tests/cases/compiler/invalidGlobalAugmentation.ts diff --git a/internal/binder/binder.go b/internal/binder/binder.go index e767cb20d9..ad96cb53de 100644 --- a/internal/binder/binder.go +++ b/internal/binder/binder.go @@ -806,7 +806,7 @@ func (b *Binder) bindModuleDeclaration(node *ast.Node) { } } symbol := b.declareSymbolAndAddToSymbolTable(node, ast.SymbolFlagsValueModule, ast.SymbolFlagsValueModuleExcludes) - if pattern.StarIndex >= 0 { + if pattern.IsValid() && pattern.StarIndex >= 0 { b.file.PatternAmbientModules = append(b.file.PatternAmbientModules, &ast.PatternAmbientModule{Pattern: pattern, Symbol: symbol}) } } diff --git a/internal/core/pattern.go b/internal/core/pattern.go index 1d2a88e67c..883dbe6628 100644 --- a/internal/core/pattern.go +++ b/internal/core/pattern.go @@ -43,9 +43,6 @@ func FindBestPatternMatch[T any](values []T, getPattern func(v T) Pattern, candi longestMatchPrefixLength := -1 for _, value := range values { pattern := getPattern(value) - if !pattern.IsValid() { - continue - } if (pattern.StarIndex == -1 || pattern.StarIndex > longestMatchPrefixLength) && pattern.Matches(candidate) { bestPattern = value longestMatchPrefixLength = pattern.StarIndex diff --git a/testdata/baselines/reference/compiler/invalidGlobalAugmentation.errors.txt b/testdata/baselines/reference/compiler/invalidGlobalAugmentation.errors.txt new file mode 100644 index 0000000000..6b5c497a6e --- /dev/null +++ b/testdata/baselines/reference/compiler/invalidGlobalAugmentation.errors.txt @@ -0,0 +1,19 @@ +globals.ts(1,9): error TS2669: Augmentations for the global scope can only be directly nested in external modules or ambient module declarations. +react-native.ts(2,16): error TS2664: Invalid module name in augmentation, module 'react-native' cannot be found. + + +==== globals.ts (1 errors) ==== + declare global { + ~~~~~~ +!!! error TS2669: Augmentations for the global scope can only be directly nested in external modules or ambient module declarations. + const __FOO__: any; + } + +==== react-native.ts (1 errors) ==== + export {} + declare module "react-native" { + ~~~~~~~~~~~~~~ +!!! error TS2664: Invalid module name in augmentation, module 'react-native' cannot be found. + const __FOO__: any; + } + \ No newline at end of file diff --git a/testdata/tests/cases/compiler/invalidGlobalAugmentation.ts b/testdata/tests/cases/compiler/invalidGlobalAugmentation.ts new file mode 100644 index 0000000000..c12d229740 --- /dev/null +++ b/testdata/tests/cases/compiler/invalidGlobalAugmentation.ts @@ -0,0 +1,13 @@ +// @noTypesAndSymbols: true +// @noEmit: true + +// @Filename: globals.ts +declare global { + const __FOO__: any; +} + +// @Filename: react-native.ts +export {} +declare module "react-native" { + const __FOO__: any; +} From 08b75b3cb2e80047d8e49a71391ee321053bfb10 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 21 May 2025 11:11:54 -0700 Subject: [PATCH 3/3] Only create and track possible patterns when dealing with string literals. --- internal/binder/binder.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/binder/binder.go b/internal/binder/binder.go index ad96cb53de..5f18fa716a 100644 --- a/internal/binder/binder.go +++ b/internal/binder/binder.go @@ -797,18 +797,18 @@ func (b *Binder) bindModuleDeclaration(node *ast.Node) { if ast.IsModuleAugmentationExternal(node) { b.declareModuleSymbol(node) } else { - var pattern core.Pattern name := node.AsModuleDeclaration().Name() + symbol := b.declareSymbolAndAddToSymbolTable(node, ast.SymbolFlagsValueModule, ast.SymbolFlagsValueModuleExcludes) + if ast.IsStringLiteral(name) { - pattern = core.TryParsePattern(name.AsStringLiteral().Text) + pattern := core.TryParsePattern(name.AsStringLiteral().Text) if !pattern.IsValid() { + // An invalid pattern - must have multiple wildcards. b.errorOnFirstToken(name, diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, name.AsStringLiteral().Text) + } else if pattern.StarIndex >= 0 { + b.file.PatternAmbientModules = append(b.file.PatternAmbientModules, &ast.PatternAmbientModule{Pattern: pattern, Symbol: symbol}) } } - symbol := b.declareSymbolAndAddToSymbolTable(node, ast.SymbolFlagsValueModule, ast.SymbolFlagsValueModuleExcludes) - if pattern.IsValid() && pattern.StarIndex >= 0 { - b.file.PatternAmbientModules = append(b.file.PatternAmbientModules, &ast.PatternAmbientModule{Pattern: pattern, Symbol: symbol}) - } } } else { state := b.declareModuleSymbol(node)