/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

/*global exports:true*/
/*jslint node:true*/
'use strict';

var util = require('util');

var Syntax = require('esprima-fb').Syntax;
var utils = require('jstransform/src/utils');

// Top level file pragmas that must not exist for the meta transform to
// be applied.
var mustNotHave = [
  'nosourcemeta',
];

function shouldTraverseFile(state, pragmas) {
  if (state.g.sourcemeta === undefined) {
    var notHaves = true;
    mustNotHave.forEach(function (value) {
      notHaves = notHaves && !(value in pragmas);
    });
    state.g.sourcemeta = notHaves;
  }
  return state.g.sourcemeta;
}

var shouldTransformFile = shouldTraverseFile;

function shouldTransformFunction(node, state, pragmas, params) /*bool*/ {
  if (!shouldTransformFile(state, pragmas)) {
    throw new Error(
      'shouldTransformFunction should not be called if shouldTransformFile ' +
      'fails'
    );
  }
  return true;
}

function wrapsBody() {
  return false;
}

function annotates() {
  return true;
}

exports.shouldTransformFile = shouldTransformFile;
exports.shouldTraverseFile = shouldTraverseFile;
exports.shouldTransformFunction = shouldTransformFunction;
exports.wrapsBody = wrapsBody;
exports.annotates = annotates;
exports.name = 'sourcemeta';