001    // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
002    // for details. All rights reserved. Use of this source code is governed by a
003    // BSD-style license that can be found in the LICENSE file.
004    
005    package com.google.dart.compiler.backend.js.ast;
006    
007    import com.google.dart.compiler.backend.js.JsReservedIdentifiers;
008    import org.jetbrains.annotations.NotNull;
009    
010    /**
011     * The root scope is the parent of every scope. All identifiers in this scope
012     * are not obfuscatable. This scope is prefilled with reserved global
013     * JavaScript symbols.
014     */
015    public final class JsRootScope extends JsScope {
016      private final JsProgram program;
017    
018      public JsRootScope(JsProgram program) {
019        super("Root");
020        this.program = program;
021      }
022    
023      @Override
024      public JsProgram getProgram() {
025        return program;
026      }
027    
028      @Override
029      protected JsName findOwnName(@NotNull String ident) {
030        JsName name = super.findOwnName(ident);
031        if (name == null) {
032            if (JsReservedIdentifiers.reservedGlobalSymbols.contains(ident)) {
033            /*
034             * Lazily add JsNames for reserved identifiers.  Since a JsName for a reserved global symbol
035             * must report a legitimate enclosing scope, we can't simply have a shared set of symbol
036             * names.
037             */
038            name = doCreateName(ident);
039          }
040        }
041        return name;
042      }
043    }