From 4e32a356e0f2affebe612a09fa835652a7a95deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20von=20der=20Ahe=CC=81?= Date: Tue, 25 Sep 2018 14:15:23 +0000 Subject: [PATCH] Ignore synthetic elements created by the parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I558827417c938a22075c5b5357294d27cbd6286a Reviewed-on: https://dart-review.googlesource.com/76121 Reviewed-by: Aske Simon Christensen Commit-Queue: Peter von der Ahé --- .../src/fasta/builder/procedure_builder.dart | 6 +- .../lib/src/fasta/kernel/body_builder.dart | 111 +++-- .../fasta/kernel/kernel_library_builder.dart | 14 +- .../kernel_mixin_application_builder.dart | 3 +- .../lib/src/fasta/source/diet_listener.dart | 77 ++-- .../lib/src/fasta/source/outline_builder.dart | 380 ++++++++++++------ .../lib/src/fasta/source/scope_listener.dart | 3 +- .../fasta/source/source_class_builder.dart | 9 +- .../fasta/source/source_library_builder.dart | 6 +- .../lib/src/fasta/source/stack_listener.dart | 31 +- 10 files changed, 435 insertions(+), 205 deletions(-) diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart index 73020a55244..aeb7fd1b3ef 100644 --- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart @@ -117,8 +117,10 @@ abstract class ProcedureBuilder extends MemberBuilder { } FormalParameterBuilder getFormal(String name) { - for (FormalParameterBuilder formal in formals) { - if (formal.name == name) return formal; + if (formals != null) { + for (FormalParameterBuilder formal in formals) { + if (formal.name == name) return formal; + } } return null; } diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart index adf249b01c1..63d3ae2d674 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -31,8 +31,7 @@ import '../parser.dart' offsetForToken, optional; -import '../problems.dart' - show internalProblem, unexpected, unhandled, unsupported; +import '../problems.dart' show unexpected, unhandled, unsupported; import '../quote.dart' show @@ -57,6 +56,7 @@ import '../source/scope_listener.dart' GrowableList, JumpTargetKind, NullValue, + ParserRecovery, ScopeListener; import '../type_inference/type_inferrer.dart' show TypeInferrer; @@ -324,8 +324,10 @@ abstract class BodyBuilder extends ScopeListener } Statement popBlock(int count, Token openBrace, Token closeBrace) { - return forest.block(openBrace, - const GrowableList().pop(stack, count), closeBrace); + return forest.block( + openBrace, + const GrowableList().pop(stack, count) ?? [], + closeBrace); } Statement popStatementIfNotNull(Object value) { @@ -471,7 +473,8 @@ abstract class BodyBuilder extends ScopeListener if (count == 0) { push(NullValue.Metadata); } else { - push(const GrowableList().pop(stack, count)); + push(const GrowableList().pop(stack, count) ?? + NullValue.Metadata /* Ignore parser recovery */); } } @@ -1085,8 +1088,13 @@ abstract class BodyBuilder extends ScopeListener @override void endArguments(int count, Token beginToken, Token endToken) { debugEvent("Arguments"); - List arguments = - const FixedNullableList().pop(stack, count) ?? []; + List arguments = count == 0 + ? [] + : const FixedNullableList().pop(stack, count); + if (arguments == null) { + push(new ParserRecovery(beginToken.charOffset)); + return; + } int firstNamedArgumentIndex = arguments.length; for (int i = 0; i < arguments.length; i++) { Object node = arguments[i]; @@ -1728,6 +1736,10 @@ abstract class BodyBuilder extends ScopeListener } else { int count = 1 + interpolationCount * 2; List parts = const FixedNullableList().pop(stack, count); + if (parts == null) { + push(new ParserRecovery(endToken.charOffset)); + return; + } Token first = parts.first; Token last = parts.last; Quote quote = analyzeQuote(first.lexeme); @@ -1974,6 +1986,10 @@ abstract class BodyBuilder extends ScopeListener currentLocalVariableType = pop(); currentLocalVariableModifiers = pop(); List annotations = pop(); + if (variables == null) { + push(new ParserRecovery(endToken.charOffset)); + return; + } if (annotations != null) { bool isFirstVariable = true; for (VariableDeclarationJudgment variable in variables) { @@ -2185,7 +2201,8 @@ abstract class BodyBuilder extends ScopeListener void handleLiteralMap( int count, Token leftBrace, Token constKeyword, Token rightBrace) { debugEvent("LiteralMap"); - List entries = const GrowableList().pop(stack, count); + List entries = + const GrowableList().pop(stack, count) ?? []; List> typeArguments = pop(); DartType keyType; DartType valueType; @@ -2245,6 +2262,10 @@ abstract class BodyBuilder extends ScopeListener } else { List parts = const FixedNullableList().pop(stack, identifierCount); + if (parts == null) { + push(new ParserRecovery(hashToken.charOffset)); + return; + } value = symbolPartToString(parts.first); for (int i = 1; i < parts.length; i++) { value += ".${symbolPartToString(parts[i])}"; @@ -2460,6 +2481,10 @@ abstract class BodyBuilder extends ScopeListener modifiers |= finalMask; } List annotations = pop(); + if (nameToken.isSynthetic) { + push(new ParserRecovery(nameToken.charOffset)); + return; + } KernelFormalParameterBuilder parameter; if (!inCatchClause && functionNestingLevel == 0 && @@ -2467,11 +2492,8 @@ abstract class BodyBuilder extends ScopeListener ProcedureBuilder member = this.member; parameter = member.getFormal(name.name); if (parameter == null) { - internalProblem( - fasta.templateInternalProblemNotFoundIn - .withArguments(name.name, "formals"), - offsetForToken(nameToken), - uri); + push(new ParserRecovery(nameToken.charOffset)); + return; } } else { parameter = new KernelFormalParameterBuilder(null, modifiers, @@ -2517,10 +2539,14 @@ abstract class BodyBuilder extends ScopeListener List parameters = const FixedNullableList() .pop(stack, count); - for (KernelFormalParameterBuilder parameter in parameters) { - parameter.kind = kind; + if (parameters == null) { + push(new ParserRecovery(offsetForToken(beginToken))); + } else { + for (KernelFormalParameterBuilder parameter in parameters) { + parameter.kind = kind; + } + push(parameters); } - push(parameters); } @override @@ -2595,6 +2621,7 @@ abstract class BodyBuilder extends ScopeListener if (optionals != null && parameters != null) { parameters.setRange(count, count + optionalsCount, optionals); } + assert(parameters?.isNotEmpty ?? true); FormalParameters formals = new FormalParameters(parameters, offsetForToken(beginToken), lengthOfSpan(beginToken, endToken), uri); constantContext = pop(); @@ -3238,7 +3265,8 @@ abstract class BodyBuilder extends ScopeListener void endTypeArguments(int count, Token beginToken, Token endToken) { debugEvent("TypeArguments"); push(const FixedNullableList>() - .pop(stack, count)); + .pop(stack, count) ?? + NullValue.TypeArguments); } @override @@ -3564,8 +3592,10 @@ abstract class BodyBuilder extends ScopeListener enterLocalScope(null, scope.createNestedLabelScope()); LabelTarget target = new LabelTarget(member, functionNestingLevel, token.charOffset); - for (Label label in labels) { - scope.declareLabel(label.name, target); + if (labels != null) { + for (Label label in labels) { + scope.declareLabel(label.name, target); + } } push(target); } @@ -3690,7 +3720,7 @@ abstract class BodyBuilder extends ScopeListener int count = labelCount + expressionCount; List labelsAndExpressions = const FixedNullableList().pop(stack, count); - List