Fix several failing tests

R=danrubel@google.com

Review-Url: https://codereview.chromium.org/3011643002 .
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index c6f57ce..524b1fd 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1226,9 +1226,6 @@
   void endConditionalUri(Token ifKeyword, Token equalitySign) {
     debugEvent("ConditionalUri");
     StringLiteral libraryUri = pop();
-    // TODO(paulberry,ahe): the parser should report the right paren token to
-    // the listener.
-    Token rightParen = null;
     StringLiteral value;
     if (equalitySign != null) {
       value = pop();
@@ -1239,6 +1236,9 @@
     // recovery and then report both the ifKeyword and leftParen tokens to the
     // listener.
     Token leftParen = ifKeyword.next;
+    // TODO(paulberry,ahe): the parser should report the right paren token to
+    // the listener.
+    Token rightParen = name.endToken.next;
     push(ast.configuration(ifKeyword, leftParen, name, equalitySign, value,
         rightParen, libraryUri));
   }
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 31f1ce3..339bb27 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/fasta/ast_builder.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
+import 'package:analyzer/src/generated/parser.dart' show CommentAndMetadata;
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/string_source.dart';
 import 'package:front_end/src/fasta/fasta_codes.dart' show Message;
@@ -19,6 +20,7 @@
 import 'package:front_end/src/fasta/parser.dart' as fasta;
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/fasta/scanner/token.dart' as fasta;
+import 'package:front_end/src/fasta/source/stack_listener.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -2808,6 +2810,24 @@
   }
 
   @override
+  CommentAndMetadata parseCommentAndMetadata() {
+    List commentAndMetadata =
+        _run((parser) => parser.parseMetadataStar, nodeCount: -1);
+    expect(commentAndMetadata, hasLength(2));
+    Object comment = commentAndMetadata[0];
+    Object metadata = commentAndMetadata[1];
+    if (comment == NullValue.Comments) {
+      comment = null;
+    }
+    if (metadata == NullValue.Metadata) {
+      metadata = null;
+    } else {
+      metadata = new List<Annotation>.from(metadata);
+    }
+    return new CommentAndMetadata(comment, metadata);
+  }
+
+  @override
   CompilationUnit parseCompilationUnit2() {
     var result = _run(null) as CompilationUnit;
     _eventListener.expectEmpty();
@@ -2849,9 +2869,13 @@
   }
 
   /**
-   * Runs a single parser function, and returns the result as an analyzer AST.
+   * Runs a single parser function (returned by [getParseFunction]), and returns
+   * the result as an analyzer AST. It checks that the parse consumed all of the
+   * tokens and that there were [nodeCount] AST nodes created (unless the node
+   * count is negative).
    */
-  Object _run(ParseFunction getParseFunction(fasta.Parser parser)) {
+  Object _run(ParseFunction getParseFunction(fasta.Parser parser),
+      {int nodeCount: 1}) {
     ParseFunction parseFunction;
     if (getParseFunction != null) {
       parseFunction = getParseFunction(_fastaParser);
@@ -2862,7 +2886,12 @@
     }
     _currentFastaToken = parseFunction(_currentFastaToken);
     expect(_currentFastaToken.isEof, isTrue);
-    expect(_astBuilder.stack, hasLength(1));
+    if (nodeCount >= 0) {
+      expect(_astBuilder.stack, hasLength(nodeCount));
+    }
+    if (nodeCount != 1) {
+      return _astBuilder.stack.values;
+    }
     return _astBuilder.pop();
   }
 }
@@ -3813,7 +3842,6 @@
   @override
   @failingTest
   void test_parseCombinator_hide() {
-    // TODO(brianwilkerson) exception:
     // Uninteresting. Covered by the test_parseCombinators_* methods.
     super.test_parseCombinator_hide();
   }
@@ -3821,149 +3849,26 @@
   @override
   @failingTest
   void test_parseCombinator_show() {
-    // TODO(brianwilkerson) exception:
     // Uninteresting. Covered by the test_parseCombinators_* methods.
     super.test_parseCombinator_show();
   }
 
   @override
   @failingTest
-  void test_parseCombinators_h() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseCombinators_h();
-  }
-
-  @override
-  @failingTest
-  void test_parseCombinators_hs() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseCombinators_hs();
-  }
-
-  @override
-  @failingTest
-  void test_parseCombinators_hshs() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseCombinators_hshs();
-  }
-
-  @override
-  @failingTest
-  void test_parseCombinators_s() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseCombinators_s();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_c() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_c();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_cmc() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_cmc();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_cmcm() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_cmcm();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_cmm() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_cmm();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_m() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_m();
-  }
-
-  @override
-  @failingTest
   void test_parseCommentAndMetadata_mcm() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
+    // TODO(brianwilkerson) Does not find comment if not before first annotation
     super.test_parseCommentAndMetadata_mcm();
   }
 
   @override
   @failingTest
   void test_parseCommentAndMetadata_mcmc() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
+    // TODO(brianwilkerson) Does not find comment if not before first annotation
     super.test_parseCommentAndMetadata_mcmc();
   }
 
   @override
   @failingTest
-  void test_parseCommentAndMetadata_mm() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_mm();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_none() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_none();
-  }
-
-  @override
-  @failingTest
-  void test_parseCommentAndMetadata_singleLine() {
-    // TODO(brianwilkerson) exception:
-    // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseCommentAndMetadata'.
-    super.test_parseCommentAndMetadata_singleLine();
-  }
-
-  @override
-  @failingTest
-  void test_parseConfiguration_noOperator_dottedIdentifier() {
-    // TODO(brianwilkerson) Missing right parenthesis.
-    super.test_parseConfiguration_noOperator_dottedIdentifier();
-  }
-
-  @override
-  @failingTest
-  void test_parseConfiguration_noOperator_simpleIdentifier() {
-    // TODO(brianwilkerson) Missing right parenthesis.
-    super.test_parseConfiguration_noOperator_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
-  void test_parseConfiguration_operator_dottedIdentifier() {
-    // TODO(brianwilkerson) Missing right parenthesis.
-    super.test_parseConfiguration_operator_dottedIdentifier();
-  }
-
-  @override
-  @failingTest
-  void test_parseConfiguration_operator_simpleIdentifier() {
-    // TODO(brianwilkerson) Missing right parenthesis.
-    super.test_parseConfiguration_operator_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
   void test_parseConstructorName_named_noPrefix() {
     // TODO(brianwilkerson) exception:
     // NoSuchMethodError: Class 'ParserProxy' has no instance method 'parseConstructorName'.
@@ -4397,55 +4302,6 @@
 
   @override
   @failingTest
-  void test_parseTypeAnnotation_function_noReturnType_noParameters() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_function_noReturnType_noParameters();
-  }
-
-  @override
-  @failingTest
-  void test_parseTypeAnnotation_function_noReturnType_parameters() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_function_noReturnType_parameters();
-  }
-
-  @override
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_classFunction() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_function_returnType_classFunction();
-  }
-
-  @override
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_function() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_function_returnType_function();
-  }
-
-  @override
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_simple() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_function_returnType_simple();
-  }
-
-  @override
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_withArguments() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_function_returnType_withArguments();
-  }
-
-  @override
-  @failingTest
-  void test_parseTypeAnnotation_named() {
-    // TODO(brianwilkerson) Failed to use all tokens.
-    super.test_parseTypeAnnotation_named();
-  }
-
-  @override
-  @failingTest
   void test_parseTypeArgumentList_empty() {
     // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
     super.test_parseTypeArgumentList_empty();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index fa2e143..420eda0 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -11137,7 +11137,7 @@
   }
 
   void test_parseCombinator_hide() {
-    createParser('hide a;');
+    createParser('hide a');
     Combinator combinator = parser.parseCombinator();
     expectNotNullIfNoErrors(combinator);
     listener.assertNoErrors();
@@ -11148,7 +11148,7 @@
   }
 
   void test_parseCombinator_show() {
-    createParser('show a;');
+    createParser('show a');
     Combinator combinator = parser.parseCombinator();
     expectNotNullIfNoErrors(combinator);
     listener.assertNoErrors();
@@ -11159,7 +11159,7 @@
   }
 
   void test_parseCombinators_h() {
-    createParser('hide a;');
+    createParser('hide a');
     List<Combinator> combinators = parser.parseCombinators();
     expectNotNullIfNoErrors(combinators);
     listener.assertNoErrors();
@@ -11171,7 +11171,7 @@
   }
 
   void test_parseCombinators_hs() {
-    createParser('hide a show b;');
+    createParser('hide a show b');
     List<Combinator> combinators = parser.parseCombinators();
     expectNotNullIfNoErrors(combinators);
     listener.assertNoErrors();
@@ -11187,7 +11187,7 @@
   }
 
   void test_parseCombinators_hshs() {
-    createParser('hide a show b hide c show d;');
+    createParser('hide a show b hide c show d');
     List<Combinator> combinators = parser.parseCombinators();
     expectNotNullIfNoErrors(combinators);
     listener.assertNoErrors();
@@ -11195,7 +11195,7 @@
   }
 
   void test_parseCombinators_s() {
-    createParser('show a;');
+    createParser('show a');
     List<Combinator> combinators = parser.parseCombinators();
     expectNotNullIfNoErrors(combinators);
     listener.assertNoErrors();
@@ -11207,7 +11207,7 @@
   }
 
   void test_parseCommentAndMetadata_c() {
-    createParser('/** 1 */ void');
+    createParser('/** 1 */');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11216,7 +11216,7 @@
   }
 
   void test_parseCommentAndMetadata_cmc() {
-    createParser('/** 1 */ @A /** 2 */ void');
+    createParser('/** 1 */ @A /** 2 */');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11225,7 +11225,7 @@
   }
 
   void test_parseCommentAndMetadata_cmcm() {
-    createParser('/** 1 */ @A /** 2 */ @B void');
+    createParser('/** 1 */ @A /** 2 */ @B');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11234,7 +11234,7 @@
   }
 
   void test_parseCommentAndMetadata_cmm() {
-    createParser('/** 1 */ @A @B void');
+    createParser('/** 1 */ @A @B');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11243,7 +11243,7 @@
   }
 
   void test_parseCommentAndMetadata_m() {
-    createParser('@A void');
+    createParser('@A');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11252,7 +11252,7 @@
   }
 
   void test_parseCommentAndMetadata_mcm() {
-    createParser('@A /** 1 */ @B void');
+    createParser('@A /** 1 */ @B');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11261,7 +11261,7 @@
   }
 
   void test_parseCommentAndMetadata_mcmc() {
-    createParser('@A /** 1 */ @B /** 2 */ void');
+    createParser('@A /** 1 */ @B /** 2 */');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11270,7 +11270,7 @@
   }
 
   void test_parseCommentAndMetadata_mm() {
-    createParser('@A @B(x) void');
+    createParser('@A @B(x)');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11279,7 +11279,7 @@
   }
 
   void test_parseCommentAndMetadata_none() {
-    createParser('void');
+    createParser('');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11291,7 +11291,7 @@
     createParser(r'''
 /// 1
 /// 2
-void''');
+''');
     CommentAndMetadata commentAndMetadata = parser.parseCommentAndMetadata();
     expectNotNullIfNoErrors(commentAndMetadata);
     listener.assertNoErrors();
@@ -11983,7 +11983,7 @@
   }
 
   void test_parseTypeAnnotation_function_noReturnType_noParameters() {
-    createParser('Function() v');
+    createParser('Function()');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
     expectNotNullIfNoErrors(functionType);
     listener.assertNoErrors();
@@ -11996,7 +11996,7 @@
   }
 
   void test_parseTypeAnnotation_function_noReturnType_parameters() {
-    createParser('Function(int, int) v');
+    createParser('Function(int, int)');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
     expectNotNullIfNoErrors(functionType);
     listener.assertNoErrors();
@@ -12053,14 +12053,14 @@
   }
 
   void test_parseTypeAnnotation_function_returnType_classFunction() {
-    createParser('Function v');
+    createParser('Function');
     TypeName functionType = parser.parseTypeAnnotation(false);
     expectNotNullIfNoErrors(functionType);
     listener.assertNoErrors();
   }
 
   void test_parseTypeAnnotation_function_returnType_function() {
-    createParser('A Function(B, C) Function(D) v');
+    createParser('A Function(B, C) Function(D)');
     // TODO(scheglov) improve the test to verify also the node properties
     var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
@@ -12109,7 +12109,7 @@
   }
 
   void test_parseTypeAnnotation_function_returnType_simple() {
-    createParser('A Function(B, C) v');
+    createParser('A Function(B, C)');
     // TODO(scheglov) improve the test to verify also the node properties
     var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
@@ -12148,7 +12148,7 @@
   }
 
   void test_parseTypeAnnotation_function_returnType_withArguments() {
-    createParser('A<B> Function(C) v');
+    createParser('A<B> Function(C)');
     // TODO(scheglov) improve this test to verify also the node properties
     var functionType = parser.parseTypeAnnotation(false) as GenericFunctionType;
     expectNotNullIfNoErrors(functionType);
@@ -12156,7 +12156,7 @@
   }
 
   void test_parseTypeAnnotation_named() {
-    createParser('A<B> v');
+    createParser('A<B>');
     TypeName typeName = parser.parseTypeAnnotation(false);
     expectNotNullIfNoErrors(typeName);
     listener.assertNoErrors();