• Adam Klein's avatar
    [ast] Save one pointer in most Function and Variable declaration node · 69b165db
    Adam Klein authored
    Currently, Declaration stores a Scope pointer to whichever Scope the
    declaration appeared in. This is used to disallow var declarations
    being hoisted over lexical declarations. For example:
    
      {
        let x;
        { var x; }
      }
    
    But in fact this is the only sort of case where storing the scope
    is required: for lexical declarations (including function declarations
    appearing in blocks), Declaration::scope() was always identical to
    Declaration::proxy()->var()->scope(). That is, only var declarations
    end up "nested" in this way.
    
    This patch adds a subclass of VariableDeclaration to store the Scope.
    Since the only thing that cares about that data is Scope analysis,
    this isn't treated as a distinct AstNode::NodeType from VariableDeclaration,
    leaving all AstVisitors untouched in the process.
    
    Also reworked the logic in Scope::CheckConflictingVarDeclarations() for
    clarity after making changes to accomodate the new code.
    
    Change-Id: I6ee4298700508ab9e28a76ddb8504bae68bc473f
    Reviewed-on: https://chromium-review.googlesource.com/619595
    Commit-Queue: Adam Klein <adamk@chromium.org>
    Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#47441}
    69b165db
var-conflict-in-with.out 177 Bytes