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); |
+ } |
+} |