11package ast
22
33import (
4- "fmt"
54 "iter"
65 "maps"
7- "os"
86 "strings"
97 "sync/atomic"
108
@@ -199,16 +197,18 @@ func (c *CombinedSymbolTable) Each(fn func(name string, symbol *Symbol)) {
199197
200198// Find implements SymbolTable.
201199func (c * CombinedSymbolTable ) Find (predicate func (* Symbol ) bool ) * Symbol {
202- if c .firstTable .Find (predicate ) != nil {
203- return c .firstTable .Find (predicate )
200+ ret := c .firstTable .Find (predicate )
201+ if ret != nil {
202+ return ret
204203 }
205204 return c .secondTable .Find (predicate )
206205}
207206
208207// Get implements SymbolTable.
209208func (c * CombinedSymbolTable ) Get (name string ) * Symbol {
210- if c .firstTable .Get (name ) != nil {
211- return c .firstTable .Get (name )
209+ ret := c .firstTable .Get (name )
210+ if ret != nil {
211+ return ret
212212 }
213213 return c .secondTable .Get (name )
214214}
@@ -225,29 +225,46 @@ func (c *CombinedSymbolTable) Get2(name string) (*Symbol, bool) {
225225func (c * CombinedSymbolTable ) Iter () iter.Seq2 [string , * Symbol ] {
226226 seen := make (map [string ]struct {})
227227 return func (yield func (string , * Symbol ) bool ) {
228- c .firstTable .Iter ()( func ( name string , symbol * Symbol ) bool {
228+ for name , symbol := range c .firstTable .Iter () {
229229 if _ , ok := seen [name ]; ! ok {
230230 seen [name ] = struct {}{}
231- return yield (name , symbol )
231+ if ! yield (name , symbol ) {
232+ break
233+ }
232234 }
233- return true
234- })
235- c .secondTable .Iter ()(func (name string , symbol * Symbol ) bool {
235+ }
236+ for name , symbol := range c .secondTable .Iter () {
236237 if _ , ok := seen [name ]; ! ok {
237238 seen [name ] = struct {}{}
238- return yield (name , symbol )
239+ if ! yield (name , symbol ) {
240+ return
241+ }
239242 }
240- return true
241- })
243+ }
242244 }
243245}
244246
245247// Keys implements SymbolTable.
246248func (c * CombinedSymbolTable ) Keys () iter.Seq [string ] {
247249 return func (yield func (string ) bool ) {
248- c .Iter ()(func (name string , symbol * Symbol ) bool {
249- return yield (name )
250- })
250+ seen := make (map [string ]struct {})
251+ for name := range c .firstTable .Keys () {
252+ if _ , ok := seen [name ]; ! ok {
253+ seen [name ] = struct {}{}
254+ if ! yield (name ) {
255+ break
256+ }
257+ }
258+ }
259+
260+ for name := range c .secondTable .Keys () {
261+ if _ , ok := seen [name ]; ! ok {
262+ seen [name ] = struct {}{}
263+ if ! yield (name ) {
264+ return
265+ }
266+ }
267+ }
251268 }
252269}
253270
@@ -336,6 +353,7 @@ var TypesNodeIgnorableNames = collections.NewSetFromItems(
336353 "PerformanceEntry" ,
337354 "PerformanceMark" ,
338355 "PerformanceMeasure" ,
356+ "QueuingStrategy" ,
339357 "ReadableByteStreamController" ,
340358 "ReadableStream" ,
341359 "ReadableStreamBYOBReader" ,
@@ -366,13 +384,15 @@ type DenoForkContext struct {
366384 nodeGlobals SymbolTable
367385 combinedGlobals SymbolTable
368386 mergeSymbol func (target * Symbol , source * Symbol , unidirectional bool ) * Symbol
387+ getMergedSymbol func (source * Symbol ) * Symbol
369388 isNodeSourceFile func (path tspath.Path ) bool
370389}
371390
372391func NewDenoForkContext (
373392 globals SymbolTable ,
374393 nodeGlobals SymbolTable ,
375394 mergeSymbol func (target * Symbol , source * Symbol , unidirectional bool ) * Symbol ,
395+ getMergedSymbol func (source * Symbol ) * Symbol ,
376396 isNodeSourceFile func (path tspath.Path ) bool ,
377397) * DenoForkContext {
378398 return & DenoForkContext {
@@ -383,6 +403,7 @@ func NewDenoForkContext(
383403 secondTable : globals ,
384404 },
385405 mergeSymbol : mergeSymbol ,
406+ getMergedSymbol : getMergedSymbol ,
386407 isNodeSourceFile : isNodeSourceFile ,
387408 }
388409}
@@ -396,7 +417,6 @@ func (c *DenoForkContext) GetGlobalsForName(name string) SymbolTable {
396417}
397418
398419func isTypesNodePkgPath (path tspath.Path ) bool {
399- fmt .Fprintf (os .Stderr , "isTypesNodePkgPath %s\n " , path )
400420 return strings .HasSuffix (string (path ), ".d.ts" ) && strings .Contains (string (path ), "/@types/node/" )
401421}
402422
@@ -414,14 +434,6 @@ func symbolHasAnyTypesNodePkgDecl(symbol *Symbol, hasNodeSourceFile func(*Node)
414434}
415435
416436func (c * DenoForkContext ) MergeGlobalSymbolTable (node * Node , source SymbolTable , unidirectional bool ) {
417- name := ""
418- if node != nil {
419- decl := node .Name ()
420- if decl != nil {
421- name = decl .Text ()
422- }
423- }
424- fmt .Fprintf (os .Stderr , "MergeGlobalSymbolTable %s\n " , name )
425437 sourceFile := GetSourceFileOfNode (node )
426438 isNodeFile := c .HasNodeSourceFile (node )
427439 isTypesNodeSourceFile := isNodeFile && isTypesNodePkgPath (sourceFile .Path ())
@@ -435,17 +447,18 @@ func (c *DenoForkContext) MergeGlobalSymbolTable(node *Node, source SymbolTable,
435447 }
436448 targetSymbol := target .Get (id )
437449 if isTypesNodeSourceFile {
438- fmt .Fprintf (os .Stderr , "isTypesNodeSourceFile %s\n " , id )
439450 }
440451 if isTypesNodeSourceFile && targetSymbol != nil && TypesNodeIgnorableNames .Has (id ) && ! symbolHasAnyTypesNodePkgDecl (targetSymbol , c .HasNodeSourceFile ) {
441- fmt .Fprintf (os .Stderr , "ignoring %s\n " , id )
442452 continue
443453 }
444- sym := sourceSymbol
454+ var merged * Symbol
445455 if targetSymbol != nil {
446- sym = c .mergeSymbol (targetSymbol , sourceSymbol , unidirectional )
456+ merged = c .mergeSymbol (targetSymbol , sourceSymbol , unidirectional )
457+ } else {
458+ merged = c .getMergedSymbol (sourceSymbol )
447459 }
448- target .Set (id , sym )
460+
461+ target .Set (id , merged )
449462 }
450463}
451464
0 commit comments