“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.File = File; exports.Program = Program; exports.BlockStatement = BlockStatement; exports.Noop = Noop; exports.Directive = Directive; exports.DirectiveLiteral = DirectiveLiteral; exports.InterpreterDirective = InterpreterDirective; exports.Placeholder = Placeholder;

function File(node) {

if (node.program) {
  this.print(node.program.interpreter, node);
}

this.print(node.program, node);

}

function Program(node) {

this.printInnerComments(node, false);
this.printSequence(node.directives, node);
if (node.directives && node.directives.length) this.newline();
this.printSequence(node.body, node);

}

function BlockStatement(node) {

this.token("{");
this.printInnerComments(node);
const hasDirectives = node.directives && node.directives.length;

if (node.body.length || hasDirectives) {
  this.newline();
  this.printSequence(node.directives, node, {
    indent: true
  });
  if (hasDirectives) this.newline();
  this.printSequence(node.body, node, {
    indent: true
  });
  this.removeTrailingNewline();
  this.source("end", node.loc);
  if (!this.endsWith("\n")) this.newline();
  this.rightBrace();
} else {
  this.source("end", node.loc);
  this.token("}");
}

}

function Noop() {}

function Directive(node) {

this.print(node.value, node);
this.semicolon();

}

const unescapedSingleQuoteRE = /(?:^|[^\])(?:\\)*'/; const unescapedDoubleQuoteRE = /(?:^|[^\])(?:\\)*“/;

function DirectiveLiteral(node) {

const raw = this.getPossibleRaw(node);

if (raw != null) {
  this.token(raw);
  return;
}

const {
  value
} = node;

if (!unescapedDoubleQuoteRE.test(value)) {
  this.token(`"${value}"`);
} else if (!unescapedSingleQuoteRE.test(value)) {
  this.token(`'${value}'`);
} else {
  throw new Error("Malformed AST: it is not possible to print a directive containing" + " both unescaped single and double quotes.");
}

}

function InterpreterDirective(node) {

this.token(`#!${node.value}\n`);

}

function Placeholder(node) {

this.token("%%");
this.print(node.name);
this.token("%%");

if (node.expectedNode === "Statement") {
  this.semicolon();
}

}