From e93f6ff2ea897100e021ab49f0eeadee5bbc8271 Mon Sep 17 00:00:00 2001 From: "paulberry@google.com" Date: Wed, 26 Nov 2014 16:22:00 +0000 Subject: [PATCH] Fix incremental parsing when class name is changed. This bug was discovered by the incremental parse stress tester. R=brianwilkerson@google.com Review URL: https://codereview.chromium.org//760863002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42000 260f80e4-7a28-3924-810f-c04153c831b5 --- pkg/analyzer/lib/src/generated/parser.dart | 4 +++- pkg/analyzer/test/generated/parser_test.dart | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart index b12174767e3..9bd6454e9c3 100644 --- a/pkg/analyzer/lib/src/generated/parser.dart +++ b/pkg/analyzer/lib/src/generated/parser.dart @@ -842,7 +842,9 @@ class IncrementalParseDispatcher implements AstVisitor { } else if (node.metadata.contains(_oldNode)) { return _parser.parseAnnotation(); } else if (identical(_oldNode, node.name)) { - return _parser.parseSimpleIdentifier(); + // Changing the class name changes whether a member is interpreted as a + // constructor or not, so we'll just have to re-parse the entire class. + throw new InsufficientContextException(); } else if (identical(_oldNode, node.typeParameters)) { return _parser.parseTypeParameterList(); } else if (identical(_oldNode, node.extendsClause)) { diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart index 1dc7170cf7a..009f2c2e3fb 100644 --- a/pkg/analyzer/test/generated/parser_test.dart +++ b/pkg/analyzer/test/generated/parser_test.dart @@ -2712,6 +2712,12 @@ class IncrementalParserTest extends EngineTestCase { _assertParse("f() => a", "", " ", " + b;"); } + void test_rename_class_withConstructor() { + // "class C { C() {} }" + // "class D { C() {} }" + _assertParse('class ', 'C', 'D', ' { C() {} }'); + } + void test_replace_field_type_with_void() { // Note: this produces an error, but we still need the parser to produce a // consistent parse tree for it.