| Index: tests/compiler/dart2js/annotated_code_helper.dart
|
| diff --git a/tests/compiler/dart2js/annotated_code_helper.dart b/tests/compiler/dart2js/annotated_code_helper.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4d6f8ecafcf0556bd1dad17510c50c9816b0f864
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js/annotated_code_helper.dart
|
| @@ -0,0 +1,100 @@
|
| +// Copyright (c) 2016, 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.
|
| +
|
| +const int _LF = 0x0A;
|
| +const int _CR = 0x0D;
|
| +const int _LBRACE = 0x7B;
|
| +
|
| +class Annotation {
|
| + /// 1-based line number of the annotation.
|
| + final int lineNo;
|
| +
|
| + /// 1-based column number of the annotation.
|
| + final int columnNo;
|
| +
|
| + /// 0-based character offset of the annotation within the source text.
|
| + final int offset;
|
| +
|
| + /// The text in the annotation.
|
| + final String text;
|
| +
|
| + Annotation(this.lineNo, this.columnNo, this.offset, this.text);
|
| +}
|
| +
|
| +/// A source code text with annotated positions.
|
| +///
|
| +/// An [AnnotatedCode] can be created from a [String] of source code where
|
| +/// annotated positions are embedded using the syntax `@{text}`. For instance
|
| +///
|
| +/// main() {
|
| +/// @{foo-call}foo();
|
| +/// bar@{bar-args}();
|
| +/// }
|
| +///
|
| +/// the position of `foo` call will hold an annotation with text 'foo-call' and
|
| +/// the position of `bar` arguments will hold an annotation with text
|
| +/// 'bar-args'.
|
| +///
|
| +/// Annotation text cannot span multiple lines and cannot contain '}'.
|
| +class AnnotatedCode {
|
| + /// The source code without annotations.
|
| + final String sourceCode;
|
| +
|
| + /// The annotations for the source code.
|
| + final List<Annotation> annotations;
|
| +
|
| + AnnotatedCode.internal(this.sourceCode, this.annotations);
|
| +
|
| + /// Creates an [AnnotatedCode] by processing [annotatedCode]. Annotation of
|
| + /// the form `@{...}` are converted into [Annotation]s and removed from the
|
| + /// [annotatedCode] to process the source code.
|
| + factory AnnotatedCode(String annotatedCode) {
|
| + StringBuffer codeBuffer = new StringBuffer();
|
| + List<Annotation> annotations = <Annotation>[];
|
| + int index = 0;
|
| + int offset = 0;
|
| + int lineNo = 1;
|
| + int columnNo = 1;
|
| + while (index < annotatedCode.length) {
|
| + int charCode = annotatedCode.codeUnitAt(index);
|
| + switch (charCode) {
|
| + case _LF:
|
| + codeBuffer.write('\n');
|
| + offset++;
|
| + lineNo++;
|
| + columnNo = 1;
|
| + break;
|
| + case _CR:
|
| + if (index + 1 < annotatedCode.length &&
|
| + annotatedCode.codeUnitAt(index + 1) == _LF) {
|
| + index++;
|
| + }
|
| + codeBuffer.write('\n');
|
| + offset++;
|
| + lineNo++;
|
| + columnNo = 1;
|
| + break;
|
| + case 0x40:
|
| + if (index + 1 < annotatedCode.length &&
|
| + annotatedCode.codeUnitAt(index + 1) == _LBRACE) {
|
| + int endIndex = annotatedCode.indexOf('}', index);
|
| + String text = annotatedCode.substring(index + 2, endIndex);
|
| + annotations.add(new Annotation(lineNo, columnNo, offset, text));
|
| + index = endIndex;
|
| + } else {
|
| + codeBuffer.writeCharCode(charCode);
|
| + offset++;
|
| + columnNo++;
|
| + }
|
| + break;
|
| + default:
|
| + codeBuffer.writeCharCode(charCode);
|
| + offset++;
|
| + columnNo++;
|
| + }
|
| + index++;
|
| + }
|
| + return new AnnotatedCode.internal(codeBuffer.toString(), annotations);
|
| + }
|
| +}
|
|
|