| Index: pkg/front_end/lib/src/fasta/source/diet_listener.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
|
| index d0926bbed2166dd3ed9daf56a9bbdf40e1e0d0eb..00414f30916bc232890dcbdaa9b4a161b261875d 100644
|
| --- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
|
| +++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
|
| @@ -21,7 +21,7 @@ import 'package:kernel/core_types.dart' show CoreTypes;
|
|
|
| import '../fasta_codes.dart' show FastaMessage, codeExpectedBlockToSkip;
|
|
|
| -import '../parser/parser.dart' show Parser, optional;
|
| +import '../parser/parser.dart' show MemberKind, Parser, optional;
|
|
|
| import '../scanner/token.dart' show BeginGroupToken;
|
|
|
| @@ -154,10 +154,13 @@ class DietListener extends StackListener {
|
| }
|
|
|
| @override
|
| - void endFormalParameters(int count, Token beginToken, Token endToken) {
|
| + void endFormalParameters(
|
| + int count, Token beginToken, Token endToken, MemberKind kind) {
|
| debugEvent("FormalParameters");
|
| assert(count == 0); // Count is always 0 as the diet parser skips formals.
|
| - if (identical(peek(), "-") && identical(beginToken.next, endToken)) {
|
| + if (kind != MemberKind.GeneralizedFunctionType &&
|
| + identical(peek(), "-") &&
|
| + identical(beginToken.next, endToken)) {
|
| pop();
|
| push("unary-");
|
| }
|
| @@ -165,7 +168,7 @@ class DietListener extends StackListener {
|
| }
|
|
|
| @override
|
| - void handleNoFormalParameters(Token token) {
|
| + void handleNoFormalParameters(Token token, MemberKind kind) {
|
| debugEvent("NoFormalParameters");
|
| if (identical(peek(), "-")) {
|
| pop();
|
| @@ -177,15 +180,15 @@ class DietListener extends StackListener {
|
| @override
|
| void handleFunctionType(Token functionToken, Token endToken) {
|
| debugEvent("FunctionType");
|
| + discard(1);
|
| }
|
|
|
| @override
|
| void endFunctionTypeAlias(
|
| Token typedefKeyword, Token equals, Token endToken) {
|
| debugEvent("FunctionTypeAlias");
|
| - if (stack.length == 1) {
|
| - // TODO(ahe): This happens when recovering from `typedef I = A;`. Find a
|
| - // different way to track tokens of formal parameters.
|
| + if (equals != null) {
|
| + // This is a `typedef NAME = TYPE`.
|
| discard(1); // Name.
|
| } else {
|
| discard(2); // Name + endToken.
|
| @@ -194,8 +197,7 @@ class DietListener extends StackListener {
|
| }
|
|
|
| @override
|
| - void endFields(
|
| - int count, Token covariantToken, Token beginToken, Token endToken) {
|
| + void endFields(int count, Token beginToken, Token endToken) {
|
| debugEvent("Fields");
|
| List<String> names = popList(count);
|
| Builder builder = lookupBuilder(beginToken, null, names.first);
|
| @@ -213,7 +215,8 @@ class DietListener extends StackListener {
|
| Token bodyToken = pop();
|
| String name = pop();
|
| checkEmpty(beginToken.charOffset);
|
| - buildFunctionBody(bodyToken, lookupBuilder(beginToken, getOrSet, name));
|
| + buildFunctionBody(bodyToken, lookupBuilder(beginToken, getOrSet, name),
|
| + MemberKind.TopLevelMethod);
|
| }
|
|
|
| @override
|
| @@ -373,7 +376,8 @@ class DietListener extends StackListener {
|
| if (bodyToken == null || optional("=", bodyToken.endGroup.next)) {
|
| return;
|
| }
|
| - buildFunctionBody(bodyToken, lookupBuilder(beginToken, null, name));
|
| + buildFunctionBody(
|
| + bodyToken, lookupBuilder(beginToken, null, name), MemberKind.Factory);
|
| }
|
|
|
| @override
|
| @@ -391,7 +395,13 @@ class DietListener extends StackListener {
|
| if (bodyToken == null) {
|
| return;
|
| }
|
| - buildFunctionBody(bodyToken, lookupBuilder(beginToken, getOrSet, name));
|
| + ProcedureBuilder builder = lookupBuilder(beginToken, getOrSet, name);
|
| + buildFunctionBody(
|
| + bodyToken,
|
| + builder,
|
| + builder.isStatic
|
| + ? MemberKind.StaticMethod
|
| + : MemberKind.NonStaticMethod);
|
| }
|
|
|
| StackListener createListener(
|
| @@ -415,7 +425,8 @@ class DietListener extends StackListener {
|
| ..constantExpressionRequired = builder.isConstructor && builder.isConst;
|
| }
|
|
|
| - void buildFunctionBody(Token token, ProcedureBuilder builder) {
|
| + void buildFunctionBody(
|
| + Token token, ProcedureBuilder builder, MemberKind kind) {
|
| Scope typeParameterScope = builder.computeTypeParameterScope(memberScope);
|
| Scope formalParameterScope =
|
| builder.computeFormalParameterScope(typeParameterScope);
|
| @@ -424,7 +435,8 @@ class DietListener extends StackListener {
|
| parseFunctionBody(
|
| createListener(builder, typeParameterScope, builder.isInstanceMember,
|
| formalParameterScope),
|
| - token);
|
| + token,
|
| + kind);
|
| }
|
|
|
| void buildFields(Token token, bool isTopLevel, MemberBuilder builder) {
|
| @@ -503,10 +515,10 @@ class DietListener extends StackListener {
|
|
|
| AsyncMarker getAsyncMarker(StackListener listener) => listener.pop();
|
|
|
| - void parseFunctionBody(StackListener listener, Token token) {
|
| + void parseFunctionBody(StackListener listener, Token token, MemberKind kind) {
|
| try {
|
| Parser parser = new Parser(listener);
|
| - token = parser.parseFormalParametersOpt(token);
|
| + token = parser.parseFormalParametersOpt(token, kind);
|
| var formals = listener.pop();
|
| listener.checkEmpty(token.charOffset);
|
| listener.prepareInitializers();
|
|
|