code: @VisibleForTesting
    TypedScope createInitialScope(Node root) {
      checkArgument(root.isRoot(), root);
  
      NodeTraversal.traverse(
          compiler,
          root,
          new IdentifyGlobalEnumsAndTypedefsAsNonNullable(typeRegistry, codingConvention));
  
      TypedScope s = TypedScope.createGlobalScope(root);
      declareNativeFunctionType(s, ARRAY_FUNCTION_TYPE);
      declareNativeFunctionType(s, BOOLEAN_OBJECT_FUNCTION_TYPE);
      declareNativeFunctionType(s, DATE_FUNCTION_TYPE);
      declareNativeFunctionType(s, FUNCTION_FUNCTION_TYPE);
      declareNativeFunctionType(s, GENERATOR_FUNCTION_TYPE);
      declareNativeFunctionType(s, ITERABLE_FUNCTION_TYPE);
      declareNativeFunctionType(s, ITERATOR_FUNCTION_TYPE);
      declareNativeFunctionType(s, NUMBER_OBJECT_FUNCTION_TYPE);
      declareNativeFunctionType(s, OBJECT_FUNCTION_TYPE);
      declareNativeFunctionType(s, REGEXP_FUNCTION_TYPE);
      declareNativeFunctionType(s, STRING_OBJECT_FUNCTION_TYPE);
      declareNativeValueType(s, "undefined", VOID_TYPE);
  
      gatherAllProvides(root);
  
      return s;
    }
docs: Create the outermost scope. This scope contains native binding such as {@code Object}, {@code
  Date}, etc.
  
  @param root The global ROOT node