// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart2js.js_emitter.full_emitter;

class CodeEmitterHelper {
  Emitter emitter;

  Namer get namer => emitter.namer;

  JavaScriptBackend get backend => emitter.backend;

  BackendHelpers get helpers => backend.helpers;

  CodeEmitterTask get task => emitter.task;

  Compiler get compiler => emitter.compiler;

  DiagnosticReporter get reporter => compiler.reporter;

  String get n => emitter.n;

  String get _ => emitter._;

  String get N => emitter.N;
}
