blob: a5c1cdb8040c7c90812e40a8629630c6fd5fc335 [file] [log] [blame]
// Copyright (c) 2015, 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.
// Output provider that collects the output in string buffers.
library output_collector;
import 'package:compiler/compiler_new.dart';
class BufferedOutputSink implements OutputSink {
StringBuffer sb = new StringBuffer();
String text;
void add(String event) {
sb.write(event);
}
void close() {
text = sb.toString();
sb = null;
}
String toString() {
return text ?? sb.toString();
}
}
class CloningOutputSink implements OutputSink {
final List<OutputSink> sinks;
CloningOutputSink(this.sinks);
@override
void add(String event) {
sinks.forEach((OutputSink sink) => sink.add(event));
}
@override
void close() {
sinks.forEach((OutputSink sink) => sink.close());
}
}
class OutputCollector implements CompilerOutput {
Map<OutputType, Map<String, BufferedOutputSink>> outputMap = {};
String getOutput(String name, OutputType type) {
Map<String, BufferedOutputSink> sinkMap = outputMap[type];
if (sinkMap == null) {
print("No output available for $type.");
return null;
}
BufferedOutputSink sink = sinkMap[name];
if (sink == null) {
print("Output '$name' not found for $type. Available: ${sinkMap.keys}");
return null;
} else {
return sink.text;
}
}
/// `true` if any output has been collected.
bool get hasOutput => !outputMap.isEmpty;
/// `true` if any output other than main output has been collected.
bool get hasExtraOutput {
for (OutputType type in outputMap.keys) {
for (String name in outputMap[type].keys) {
if (name != '') return true;
}
}
return false;
}
@override
OutputSink createOutputSink(String name, String extension, OutputType type) {
Map<String, BufferedOutputSink> sinkMap =
outputMap.putIfAbsent(type, () => {});
return sinkMap.putIfAbsent(name, () => new BufferedOutputSink());
}
}