/**

* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

let currentTypes = null;

export function wrapWithTypes(types, fn) {

return function (...args) {
  const oldTypes = currentTypes;
  currentTypes = types;
  try {
    return fn.apply(this, args);
  } finally {
    currentTypes = oldTypes;
  }
};

}

export function getTypes() {

return currentTypes;

}

export function runtimeProperty(name) {

const t = getTypes();
return t.memberExpression(
  t.identifier("regeneratorRuntime"),
  t.identifier(name),
  false
);

}

export function isReference(path) {

return path.isReferenced() || path.parentPath.isAssignmentExpression({ left: path.node });

}

export function replaceWithOrRemove(path, replacement) {

if (replacement) {
  path.replaceWith(replacement)
} else {
  path.remove();
}

}