blob: bcfa12c9b5ff6b0d3ce3f92cb1f66d4ddd3bbc8d [file] [log] [blame]
// Copyright (c) 2014, 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.
/// Library for debugging helpers. The unittest analyze_unused_test checks that
/// the helper are not used in production code.
library dart2js.helpers;
import 'dart:async' show EventSink;
import 'dart:collection';
import 'dart:convert';
import '../../compiler.dart';
import '../dart2jslib.dart';
import '../util/util.dart';
part 'debug_collection.dart';
part 'trace.dart';
part 'expensive_map.dart';
part 'expensive_set.dart';
part 'stats.dart';
part 'track_map.dart';
/// Global flag to enable [debugPrint]. This should always be `true` by default
/// and be set to `false` as a means to temporarily turn off all debugging
/// printouts.
const bool DEBUG_PRINT_ENABLED = true;
/// Enables debug mode.
/// Sets the [DEBUG_MODE] to `true`.
void enableDebugMode() {
DEBUG_MODE = true;
class _DebugIndentation extends Indentation {
final String indentationUnit = " ";
_DebugIndentation _indentation = new _DebugIndentation();
/// Function signature of [debugPrint].
typedef DebugPrint(s);
/// If [DEBUG_PRINT_ENABLED] is `true` print [s] using the current identation.
DebugPrint get debugPrint {
// TODO(johnniwinther): Maybe disable debug mode after the call.
return _debugPrint;
/// Implementation of [debugPrint].
_debugPrint(s) {
if (DEBUG_PRINT_ENABLED) print('${_indentation.indentation}$s');
/// Function signature of [debugWrapPrint].
typedef DebugWrapPrint(s, f());
/// Wraps the call to [f] with a print of 'start:$s' and 'end:$s' incrementing
/// the current indentation used by [debugPrint] during the execution of [f].
/// Use this to get a tree-like debug printout for nested calls.
DebugWrapPrint get debugWrapPrint {
return _debugWrapPrint;
/// Implementation of [debugWrapPrint].
_debugWrapPrint(s, f()) {
var result = _indentation.indentBlock(f);
return result;
/// Dummy method to mark breakpoints.
debugBreak() {
/// Function signature of [reportHere].
typedef ReportHere(Compiler compiler, Spannable node, String debugMessage);
/// Print a message with a source location.
ReportHere get reportHere {
return _reportHere;
/// Implementation of [reportHere]
_reportHere(Compiler compiler, Spannable node, String debugMessage) {
MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});