/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef COBALT_SCRIPT_SCOPE_H_
#define COBALT_SCRIPT_SCOPE_H_

#include <string>

#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/optional.h"
#include "cobalt/script/opaque_handle.h"
#include "cobalt/script/script_object.h"

namespace cobalt {
namespace script {

// Opaque type that encapsulates a scope object, as used by the JavaScript
// debugger and devtools. Each call frame has a scope chain: a list of the
// individual scopes valid at that call frame. The scope objects are only
// guaranteed to be valid while the script debugger is paused in that call
// frame.
// https://developer.chrome.com/devtools/docs/protocol/1.1/debugger#type-CallFrame
// https://developer.chrome.com/devtools/docs/protocol/1.1/debugger#type-Scope
class Scope {
 public:
  // Possible values returned by |GetType|.
  // One of the set of enumerated strings defined here:
  // https://developer.chrome.com/devtools/docs/protocol/1.1/debugger#type-Scope
  enum Type { kCatch, kClosure, kGlobal, kLocal, kWith };

  virtual ~Scope() {}

  // An opaque handle to the underlying JavaScript object encapsulating the
  // scope.
  virtual const OpaqueHandleHolder* GetObject() = 0;

  // The type of the scope object. One of the enumerated values in |Type|.
  // Devtools expects a string, which can be obtained from the
  // |TypeToString| method.
  virtual Type GetType() = 0;

  // The next entry in the scope chain.
  virtual scoped_ptr<Scope> GetNext() = 0;

  // Converts an enumerated type value to the string expected by devtools.
  static const char* TypeToString(Type type) {
    static const char kCatchString[] = "catch";
    static const char kClosureString[] = "closure";
    static const char kGlobalString[] = "global";
    static const char kLocalString[] = "local";
    static const char kWithString[] = "with";

    switch (type) {
      case kCatch:
        return kCatchString;
      case kClosure:
        return kClosureString;
      case kGlobal:
        return kGlobalString;
      case kLocal:
        return kLocalString;
      case kWith:
        return kWithString;
      default: {
        NOTREACHED();
        return kLocalString;
      }
    }
  }
};

}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_SCOPE_H_
