Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Unified Diff: pkg/front_end/lib/src/fasta/source/diet_listener.dart

Issue 2876813002: Implement generalized function types. (Closed)
Patch Set: Fixes for analyzer and dart2js. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 7cd2da7d9772ae0ac54edd8711e1b9763f79ca85..9ce132348c7fec26029307f4d668a81ccb99d851 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, Token;
@@ -152,10 +152,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-");
}
@@ -163,7 +166,7 @@ class DietListener extends StackListener {
}
@override
- void handleNoFormalParameters(Token token) {
+ void handleNoFormalParameters(Token token, MemberKind kind) {
debugEvent("NoFormalParameters");
if (identical(peek(), "-")) {
pop();
@@ -175,15 +178,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.
@@ -192,8 +195,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);
@@ -211,7 +213,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
@@ -371,7 +374,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
@@ -389,7 +393,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(
@@ -413,7 +423,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);
@@ -422,7 +433,8 @@ class DietListener extends StackListener {
parseFunctionBody(
createListener(builder, typeParameterScope, builder.isInstanceMember,
formalParameterScope),
- token);
+ token,
+ kind);
}
void buildFields(Token token, bool isTopLevel, MemberBuilder builder) {
@@ -501,10 +513,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();

Powered by Google App Engine
This is Rietveld 408576698