@@ -1040,6 +1040,7 @@ func (p *Parser) parseAnyClass(expr bool) (classDecl *ClassDecl) {
10401040 if ! p .consume ("class declaration" , OpenBraceToken ) {
10411041 return
10421042 }
1043+ parent := p .enterScope (& classDecl .Scope , false )
10431044 for {
10441045 if p .tt == ErrorToken {
10451046 p .fail ("class declaration" )
@@ -1054,6 +1055,7 @@ func (p *Parser) parseAnyClass(expr bool) (classDecl *ClassDecl) {
10541055
10551056 classDecl .List = append (classDecl .List , p .parseClassElement ())
10561057 }
1058+ p .exitScope (parent )
10571059 return
10581060}
10591061
@@ -1116,10 +1118,15 @@ func (p *Parser) parseClassElement() ClassElement {
11161118 isField = true
11171119 } else {
11181120 if p .tt == PrivateIdentifierToken {
1119- method .Name .Literal = LiteralExpr {p .tt , p .data }
1121+ var ok bool
1122+ method .Name .Private , ok = p .scope .Declare (PrivateDecl , p .data )
1123+ if ! ok {
1124+ p .failMessage ("identifier %s has already been declared" , string (p .data ))
1125+ return ClassElement {}
1126+ }
11201127 p .next ()
11211128 } else {
1122- method .Name = p .parsePropertyName ("method or field definition" )
1129+ method .Name . PropertyName = p .parsePropertyName ("method or field definition" )
11231130 }
11241131 if (data == nil || method .Static ) && p .tt != OpenParenToken {
11251132 isField = true
@@ -1404,7 +1411,7 @@ func (p *Parser) parseObjectLiteral() (object ObjectExpr) {
14041411 method .Get = false
14051412 method .Set = false
14061413 } else if ! method .Name .IsSet () { // did not parse async [LT]
1407- method .Name = p .parsePropertyName ("object literal" )
1414+ method .Name . PropertyName = p .parsePropertyName ("object literal" )
14081415 if ! method .Name .IsSet () {
14091416 return
14101417 }
@@ -1426,7 +1433,7 @@ func (p *Parser) parseObjectLiteral() (object ObjectExpr) {
14261433 } else if p .tt == ColonToken {
14271434 // PropertyName : AssignmentExpression
14281435 p .next ()
1429- property .Name = & method .Name
1436+ property .Name = & method .Name . PropertyName
14301437 property .Value = p .parseAssignExprOrParam ()
14311438 } else if method .Name .IsComputed () || ! p .isIdentifierReference (method .Name .Literal .TokenType ) {
14321439 p .fail ("object literal" , ColonToken , OpenParenToken )
@@ -1435,7 +1442,7 @@ func (p *Parser) parseObjectLiteral() (object ObjectExpr) {
14351442 // IdentifierReference (= AssignmentExpression)?
14361443 name := method .Name .Literal .Data
14371444 method .Name .Literal .Data = parse .Copy (method .Name .Literal .Data ) // copy so that renaming doesn't rename the key
1438- property .Name = & method .Name // set key explicitly so after renaming the original is still known
1445+ property .Name = & method .Name . PropertyName // set key explicitly so after renaming the original is still known
14391446 if p .assumeArrowFunc {
14401447 var ok bool
14411448 property .Value , ok = p .scope .Declare (ArgumentDecl , name )
@@ -1853,7 +1860,7 @@ func (p *Parser) parseExpression(prec OpPrec) IExpr {
18531860 p .fail ("expression" )
18541861 return nil
18551862 }
1856- left = & LiteralExpr { p . tt , p .data }
1863+ left = p . scope . Use ( p .data )
18571864 p .next ()
18581865 if p .tt != InToken {
18591866 p .fail ("relational expression" , InToken )
@@ -1953,10 +1960,11 @@ func (p *Parser) parseExpressionSuffix(left IExpr, prec, precLeft OpPrec) IExpr
19531960 if precLeft < OpMember {
19541961 exprPrec = OpCall
19551962 }
1956- if p .tt != PrivateIdentifierToken {
1957- p .tt = IdentifierToken
1963+ if p .tt == PrivateIdentifierToken {
1964+ left = & DotExpr {left , p .scope .Use (p .data ), exprPrec , false }
1965+ } else {
1966+ left = & DotExpr {left , LiteralExpr {IdentifierToken , p .data }, exprPrec , false }
19581967 }
1959- left = & DotExpr {left , LiteralExpr {p .tt , p .data }, exprPrec , false }
19601968 p .next ()
19611969 if precLeft < OpMember {
19621970 precLeft = OpCall
0 commit comments