| Index: pkg/front_end/lib/src/fasta/source/outline_builder.dart | 
| diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart | 
| index 2fa72595d6119ac3dab4776311443f188d7eba4b..19938160b2349fa6d28a204a813355fba9e137d5 100644 | 
| --- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart | 
| +++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart | 
| @@ -50,6 +50,12 @@ class OutlineBuilder extends UnhandledListener { | 
|  | 
| final bool enableNative; | 
|  | 
| +  /// When true, recoverable parser errors are silently ignored. This is | 
| +  /// because they will be reported by the BodyBuilder later. However, typedefs | 
| +  /// are fully compiled by the outline builder, so parser errors are turned on | 
| +  /// when parsing typedefs. | 
| +  bool silenceParserErrors = true; | 
| + | 
| String nativeMethodName; | 
|  | 
| OutlineBuilder(SourceLibraryBuilder library) | 
| @@ -597,6 +603,7 @@ class OutlineBuilder extends UnhandledListener { | 
| @override | 
| void beginFunctionTypeAlias(Token token) { | 
| library.beginNestedDeclaration(null, hasMembers: false); | 
| +    silenceParserErrors = false; | 
| } | 
|  | 
| @override | 
| @@ -649,6 +656,7 @@ class OutlineBuilder extends UnhandledListener { | 
| library.addFunctionTypeAlias( | 
| metadata, returnType, name, typeVariables, formals, charOffset); | 
| checkEmpty(typedefKeyword.charOffset); | 
| +    silenceParserErrors = true; | 
| } | 
|  | 
| @override | 
| @@ -814,6 +822,15 @@ class OutlineBuilder extends UnhandledListener { | 
| push(popList(count) ?? NullValue.Modifiers); | 
| } | 
|  | 
| +  @override | 
| +  void handleRecoverableError(Token token, FastaMessage message) { | 
| +    if (silenceParserErrors) { | 
| +      debugEvent("RecoverableError"); | 
| +    } else { | 
| +      super.handleRecoverableError(token, message); | 
| +    } | 
| +  } | 
| + | 
| @override | 
| Token handleUnrecoverableError(Token token, FastaMessage message) { | 
| if (enableNative && message.code == codeExpectedBlockToSkip) { | 
|  |