| // 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. |
| |
| import 'package:front_end/src/scanner/reader.dart'; |
| |
| export 'package:front_end/src/scanner/reader.dart' |
| show CharacterReader, CharSequenceReader, SubSequenceReader; |
| |
| /** |
| * A [CharacterReader] that reads a range of characters from another character |
| * reader. |
| */ |
| class CharacterRangeReader extends CharacterReader { |
| /** |
| * The reader from which the characters are actually being read. |
| */ |
| final CharacterReader baseReader; |
| |
| /** |
| * The first character to be read. |
| */ |
| final int startIndex; |
| |
| /** |
| * The last character to be read. |
| */ |
| final int endIndex; |
| |
| /** |
| * Initialize a newly created reader to read the characters from the given |
| * [baseReader] between the [startIndex] inclusive to [endIndex] exclusive. |
| */ |
| CharacterRangeReader(this.baseReader, this.startIndex, this.endIndex) { |
| baseReader.offset = startIndex - 1; |
| } |
| |
| @override |
| int get offset => baseReader.offset; |
| |
| @override |
| void set offset(int offset) { |
| baseReader.offset = offset; |
| } |
| |
| @override |
| int advance() { |
| if (baseReader.offset + 1 >= endIndex) { |
| return -1; |
| } |
| return baseReader.advance(); |
| } |
| |
| @override |
| String getContents() => |
| baseReader.getContents().substring(startIndex, endIndex); |
| |
| @override |
| String getString(int start, int endDelta) => |
| baseReader.getString(start, endDelta); |
| |
| @override |
| int peek() { |
| if (baseReader.offset + 1 >= endIndex) { |
| return -1; |
| } |
| return baseReader.peek(); |
| } |
| } |