@@ -1030,7 +1030,7 @@ func (r *resolutionState) tryLoadModuleUsingPathsIfEligible() *resolved {
1030
1030
return continueSearching ()
1031
1031
}
1032
1032
baseDirectory := getPathsBasePath (r .compilerOptions , r .resolver .host .GetCurrentDirectory ())
1033
- pathPatterns := tryParsePatterns ( r . compilerOptions . Paths )
1033
+ pathPatterns := r . resolver . getParsedPatternsForPaths ( )
1034
1034
return r .tryLoadModuleUsingPaths (
1035
1035
r .extensions ,
1036
1036
r .name ,
@@ -1044,7 +1044,7 @@ func (r *resolutionState) tryLoadModuleUsingPathsIfEligible() *resolved {
1044
1044
)
1045
1045
}
1046
1046
1047
- func (r * resolutionState ) tryLoadModuleUsingPaths (extensions extensions , moduleName string , containingDirectory string , paths * collections.OrderedMap [string , []string ], pathPatterns parsedPatterns , loader resolutionKindSpecificLoader , onlyRecordFailures bool ) * resolved {
1047
+ func (r * resolutionState ) tryLoadModuleUsingPaths (extensions extensions , moduleName string , containingDirectory string , paths * collections.OrderedMap [string , []string ], pathPatterns * parsedPatterns , loader resolutionKindSpecificLoader , onlyRecordFailures bool ) * resolved {
1048
1048
if matchedPattern := matchPatternOrExact (pathPatterns , moduleName ); matchedPattern .IsValid () {
1049
1049
matchedStar := matchedPattern .MatchedText (moduleName )
1050
1050
if r .resolver .traceEnabled () {
@@ -1697,16 +1697,38 @@ func getPathsBasePath(options *core.CompilerOptions, currentDirectory string) st
1697
1697
}
1698
1698
1699
1699
type parsedPatterns struct {
1700
- matchableStringSet collections. OrderedSet [string ]
1700
+ matchableStringSet core. Set [string ]
1701
1701
patterns []core.Pattern
1702
1702
}
1703
1703
1704
- func tryParsePatterns (paths * collections.OrderedMap [string , []string ]) parsedPatterns {
1705
- // !!! TS has a weakmap cache
1706
- // We could store a cache on Resolver, but maybe we can wait and profile
1707
- matchableStringSet := collections.OrderedSet [string ]{}
1708
- patterns := make ([]core.Pattern , 0 , paths .Size ())
1709
- for path := range paths .Keys () {
1704
+ func (r * Resolver ) getParsedPatternsForPaths () * parsedPatterns {
1705
+ r .parsedPatternsForPathsOnce .Do (func () {
1706
+ r .parsedPatternsForPaths = tryParsePatterns (r .compilerOptions .Paths )
1707
+ })
1708
+ return r .parsedPatternsForPaths
1709
+ }
1710
+
1711
+ func tryParsePatterns (pathMappings * collections.OrderedMap [string , []string ]) * parsedPatterns {
1712
+ paths := pathMappings .Keys ()
1713
+
1714
+ numPatterns := 0
1715
+ for path := range paths {
1716
+ if pattern := core .TryParsePattern (path ); pattern .IsValid () && pattern .StarIndex == - 1 {
1717
+ numPatterns ++
1718
+ }
1719
+ }
1720
+ numMatchables := pathMappings .Size () - numPatterns
1721
+
1722
+ var patterns []core.Pattern
1723
+ var matchableStringSet core.Set [string ]
1724
+ if numPatterns != 0 {
1725
+ patterns = make ([]core.Pattern , 0 , numPatterns )
1726
+ }
1727
+ if numMatchables != 0 {
1728
+ matchableStringSet = * core.NewSetWithSizeHint [string ](numMatchables )
1729
+ }
1730
+
1731
+ for path := range paths {
1710
1732
if pattern := core .TryParsePattern (path ); pattern .IsValid () {
1711
1733
if pattern .StarIndex == - 1 {
1712
1734
matchableStringSet .Add (path )
@@ -1715,13 +1737,13 @@ func tryParsePatterns(paths *collections.OrderedMap[string, []string]) parsedPat
1715
1737
}
1716
1738
}
1717
1739
}
1718
- return parsedPatterns {
1740
+ return & parsedPatterns {
1719
1741
matchableStringSet : matchableStringSet ,
1720
1742
patterns : patterns ,
1721
1743
}
1722
1744
}
1723
1745
1724
- func matchPatternOrExact (patterns parsedPatterns , candidate string ) core.Pattern {
1746
+ func matchPatternOrExact (patterns * parsedPatterns , candidate string ) core.Pattern {
1725
1747
if patterns .matchableStringSet .Has (candidate ) {
1726
1748
return core.Pattern {
1727
1749
Text : candidate ,
0 commit comments