Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1426)

Unified Diff: pkg/analyzer/lib/src/generated/scanner.dart

Issue 746503002: Move incremental scanner to separate file (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add new files Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/generated/scanner.dart
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 813f07ea98b40e4897715a13428a553724f0381b..cd56ce17dcaad8d755054018511f79d8469a8943 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -2,19 +2,14 @@
// 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 code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
library engine.scanner;
-import "dart:math" as math;
import 'dart:collection';
import 'error.dart';
import 'instrumentation.dart';
import 'java_engine.dart';
import 'source.dart';
-import 'utilities_collection.dart' show TokenMap;
/**
* A `BeginToken` is the opening half of a grouping pair of tokens. This is used
@@ -229,248 +224,6 @@ abstract class CharacterReader {
}
/**
- * Instances of the class `IncrementalScanner` implement a scanner that scans a subset of a
- * string and inserts the resulting tokens into the middle of an existing token stream.
- */
-class IncrementalScanner extends Scanner {
- /**
- * The reader used to access the characters in the source.
- */
- CharacterReader _reader;
-
- /**
- * A map from tokens that were copied to the copies of the tokens.
- */
- TokenMap _tokenMap = new TokenMap();
-
- /**
- * The token in the new token stream immediately to the left of the range of tokens that were
- * inserted, or the token immediately to the left of the modified region if there were no new
- * tokens.
- */
- Token _leftToken;
-
- /**
- * The token in the new token stream immediately to the right of the range of tokens that were
- * inserted, or the token immediately to the right of the modified region if there were no new
- * tokens.
- */
- Token _rightToken;
-
- /**
- * A flag indicating whether there were any tokens changed as a result of the modification.
- */
- bool _hasNonWhitespaceChange = false;
-
- /**
- * Initialize a newly created scanner.
- *
- * @param source the source being scanned
- * @param reader the character reader used to read the characters in the source
- * @param errorListener the error listener that will be informed of any errors that are found
- */
- IncrementalScanner(Source source, CharacterReader reader,
- AnalysisErrorListener errorListener)
- : super(source, reader, errorListener) {
- this._reader = reader;
- }
-
- /**
- * Return `true` if there were any tokens either added or removed (or both) as a result of
- * the modification.
- *
- * @return `true` if there were any tokens changed as a result of the modification
- */
- bool get hasNonWhitespaceChange => _hasNonWhitespaceChange;
-
- /**
- * Return the token in the new token stream immediately to the left of the range of tokens that
- * were inserted, or the token immediately to the left of the modified region if there were no new
- * tokens.
- *
- * @return the token to the left of the inserted tokens
- */
- Token get leftToken => _leftToken;
-
- /**
- * Return the token in the new token stream immediately to the right of the range of tokens that
- * were inserted, or the token immediately to the right of the modified region if there were no
- * new tokens.
- *
- * @return the token to the right of the inserted tokens
- */
- Token get rightToken => _rightToken;
-
- /**
- * Return a map from tokens that were copied to the copies of the tokens.
- *
- * @return a map from tokens that were copied to the copies of the tokens
- */
- TokenMap get tokenMap => _tokenMap;
-
- /**
- * Given the stream of tokens scanned from the original source, the modified source (the result of
- * replacing one contiguous range of characters with another string of characters), and a
- * specification of the modification that was made, return a stream of tokens scanned from the
- * modified source. The original stream of tokens will not be modified.
- *
- * @param originalStream the stream of tokens scanned from the original source
- * @param index the index of the first character in both the original and modified source that was
- * affected by the modification
- * @param removedLength the number of characters removed from the original source
- * @param insertedLength the number of characters added to the modified source
- */
- Token rescan(Token originalStream, int index, int removedLength,
- int insertedLength) {
- //
- // Copy all of the tokens in the originalStream whose end is less than the
- // replacement start. (If the replacement start is equal to the end of an
- // existing token, then it means that the existing token might have been
- // modified, so we need to rescan it.)
- //
- while (originalStream.type != TokenType.EOF && originalStream.end < index) {
- originalStream = _copyAndAdvance(originalStream, 0);
- }
- Token oldFirst = originalStream;
- Token oldLeftToken = originalStream.previous;
- _leftToken = tail;
- //
- // Skip tokens in the original stream until we find a token whose offset is
- // greater than the end of the removed region. (If the end of the removed
- // region is equal to the beginning of an existing token, then it means that
- // the existing token might have been modified, so we need to rescan it.)
- //
- int removedEnd = index + (removedLength == 0 ? 0 : removedLength - 1);
- while (originalStream.type != TokenType.EOF &&
- originalStream.offset <= removedEnd) {
- originalStream = originalStream.next;
- }
- Token oldLast;
- Token oldRightToken;
- if (originalStream.type != TokenType.EOF &&
- removedEnd + 1 == originalStream.offset) {
- oldLast = originalStream;
- originalStream = originalStream.next;
- oldRightToken = originalStream;
- } else {
- oldLast = originalStream.previous;
- oldRightToken = originalStream;
- }
- //
- // Compute the delta between the character index of characters after the
- // modified region in the original source and the index of the corresponding
- // character in the modified source.
- //
- int delta = insertedLength - removedLength;
- //
- // Compute the range of characters that are known to need to be rescanned.
- // If the index is within an existing token, then we need to start at the
- // beginning of the token.
- //
- int scanStart = math.min(oldFirst.offset, index);
- int oldEnd = oldLast.end + delta - 1;
- int newEnd = index + insertedLength - 1;
- int scanEnd = math.max(newEnd, oldEnd);
- //
- // Starting at the start of the scan region, scan tokens from the
- // modifiedSource until the end of the just scanned token is greater than or
- // equal to end of the scan region in the modified source. Include trailing
- // characters of any token that was split as a result of inserted text,
- // as in "ab" --> "a.b".
- //
- _reader.offset = scanStart - 1;
- int next = _reader.advance();
- while (next != -1 && _reader.offset <= scanEnd) {
- next = bigSwitch(next);
- }
- //
- // Copy the remaining tokens in the original stream, but apply the delta to
- // the token's offset.
- //
- if (originalStream.type == TokenType.EOF) {
- _copyAndAdvance(originalStream, delta);
- _rightToken = tail;
- _rightToken.setNextWithoutSettingPrevious(_rightToken);
- } else {
- originalStream = _copyAndAdvance(originalStream, delta);
- _rightToken = tail;
- while (originalStream.type != TokenType.EOF) {
- originalStream = _copyAndAdvance(originalStream, delta);
- }
- Token eof = _copyAndAdvance(originalStream, delta);
- eof.setNextWithoutSettingPrevious(eof);
- }
- //
- // If the index is immediately after an existing token and the inserted
- // characters did not change that original token, then adjust the leftToken
- // to be the next token. For example, in "a; c;" --> "a;b c;", the leftToken
- // was ";", but this code advances it to "b" since "b" is the first new
- // token.
- //
- Token newFirst = _leftToken.next;
- while (!identical(newFirst, _rightToken) &&
- !identical(oldFirst, oldRightToken) &&
- newFirst.type != TokenType.EOF &&
- _equalTokens(oldFirst, newFirst)) {
- _tokenMap.put(oldFirst, newFirst);
- oldLeftToken = oldFirst;
- oldFirst = oldFirst.next;
- _leftToken = newFirst;
- newFirst = newFirst.next;
- }
- Token newLast = _rightToken.previous;
- while (!identical(newLast, _leftToken) &&
- !identical(oldLast, oldLeftToken) &&
- newLast.type != TokenType.EOF &&
- _equalTokens(oldLast, newLast)) {
- _tokenMap.put(oldLast, newLast);
- oldRightToken = oldLast;
- oldLast = oldLast.previous;
- _rightToken = newLast;
- newLast = newLast.previous;
- }
- _hasNonWhitespaceChange = !identical(_leftToken.next, _rightToken) ||
- !identical(oldLeftToken.next, oldRightToken);
- //
- // TODO(brianwilkerson) Begin tokens are not getting associated with the
- // corresponding end tokens (because the end tokens have not been copied
- // when we're copying the begin tokens). This could have implications for
- // parsing.
- // TODO(brianwilkerson) Update the lineInfo.
- //
- return firstToken;
- }
-
- Token _copyAndAdvance(Token originalToken, int delta) {
- Token copiedToken = originalToken.copy();
- _tokenMap.put(originalToken, copiedToken);
- copiedToken.offset += delta;
- appendToken(copiedToken);
- Token originalComment = originalToken.precedingComments;
- Token copiedComment = originalToken.precedingComments;
- while (originalComment != null) {
- _tokenMap.put(originalComment, copiedComment);
- originalComment = originalComment.next;
- copiedComment = copiedComment.next;
- }
- return originalToken.next;
- }
-
- /**
- * Return `true` if the two tokens are equal to each other. For the purposes of the
- * incremental scanner, two tokens are equal if they have the same type and lexeme.
- *
- * @param oldToken the token from the old stream that is being compared
- * @param newToken the token from the new stream that is being compared
- * @return `true` if the two tokens are equal to each other
- */
- bool _equalTokens(Token oldToken, Token newToken) =>
- oldToken.type == newToken.type &&
- oldToken.length == newToken.length &&
- oldToken.lexeme == newToken.lexeme;
-}
-
-/**
* The enumeration `Keyword` defines the keywords in the Dart programming
* language.
*/
« no previous file with comments | « pkg/analyzer/lib/src/generated/incremental_scanner.dart ('k') | pkg/analyzer/test/generated/incremental_scanner_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698