// 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.

// This sample demonstrates how to run the compiler in a loop reading
// all sources from memory, instead of using dart:io.
library sample.compile_loop;

import 'dart:async';

import '../../compiler.dart' as compiler;

// If this file is missing, generate it using ../jsonify/jsonify.dart.
import 'sdk.dart';

Future<String> compile(source) {
  Future<String> inputProvider(Uri uri) {
    if (uri.scheme == 'sdk') {
      var value = SDK_SOURCES['$uri'];
      if (value == null) {
        // TODO(ahe): Use new Future.error.
        throw new Exception('Error: Cannot read: $uri');
      }
      return new Future.value(value);
    } else if ('$uri' == 'memory:/main.dart') {
      return new Future.value(source);
    }
    // TODO(ahe): Use new Future.error.
    throw new Exception('Error: Cannot read: $uri');
  }
  void handler(Uri uri, int begin, int end,
               String message, compiler.Diagnostic kind) {
    // TODO(ahe): Remove dart:io import from
    // ../../implementation/source_file_provider.dart and use
    // FormattingDiagnosticHandler instead.
    print({ 'uri': '$uri',
            'begin': begin,
            'end': end,
            'message': message,
            'kind': kind.name });
    if (kind == compiler.Diagnostic.ERROR) {
      throw new Exception('Unexpected error occurred.');
    }
  }
  return compiler.compile(
      new Uri('memory:/main.dart'),
      Uri.parse('sdk:/sdk/'),
      null,
      inputProvider,
      handler,
      []);
}

int iterations = 10;

main() {
  compile(EXAMPLE_HELLO_HTML).then((jsResult) {
    if (jsResult == null) throw 'Compilation failed';
    if (--iterations > 0) main();
  });
}

const String EXAMPLE_HELLO_HTML = r'''
// Go ahead and modify this example.

import "dart:html";

var greeting = "Hello, World!";

// Displays a greeting.
void main() {
  // This example uses HTML to display the greeting and it will appear
  // in a nested HTML frame (an iframe).
  document.body.append(new HeadingElement.h1()..appendText(greeting));
}
''';
