github.com/nuvolaris/goja@v0.0.0-20230825100449-967811910c6d/parser/scope.go (about) 1 package parser 2 3 import ( 4 "github.com/nuvolaris/goja/ast" 5 "github.com/nuvolaris/goja/unistring" 6 ) 7 8 type _scope struct { 9 outer *_scope 10 allowIn bool 11 allowLet bool 12 inIteration bool 13 inSwitch bool 14 inFuncParams bool 15 inFunction bool 16 inAsync bool 17 allowAwait bool 18 allowYield bool 19 declarationList []*ast.VariableDeclaration 20 21 labels []unistring.String 22 } 23 24 func (self *_parser) openScope() { 25 self.scope = &_scope{ 26 outer: self.scope, 27 allowIn: true, 28 } 29 } 30 31 func (self *_parser) closeScope() { 32 self.scope = self.scope.outer 33 } 34 35 func (self *_scope) declare(declaration *ast.VariableDeclaration) { 36 self.declarationList = append(self.declarationList, declaration) 37 } 38 39 func (self *_scope) hasLabel(name unistring.String) bool { 40 for _, label := range self.labels { 41 if label == name { 42 return true 43 } 44 } 45 if self.outer != nil && !self.inFunction { 46 // Crossing a function boundary to look for a label is verboten 47 return self.outer.hasLabel(name) 48 } 49 return false 50 }