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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Issue 2775163003: Make catch variables final. (Closed)
Patch Set: Update expectation files. Created 3 years, 8 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 unified diff | Download patch
« no previous file with comments | « no previous file | pkg/front_end/test/fasta/accessors.dart.direct.expect » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library fasta.body_builder; 5 library fasta.body_builder;
6 6
7 import '../parser/parser.dart' show FormalParameterType, optional; 7 import '../parser/parser.dart' show FormalParameterType, optional;
8 8
9 import '../parser/error_kind.dart' show ErrorKind; 9 import '../parser/error_kind.dart' show ErrorKind;
10 10
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 int charOffset = thisKeyword?.charOffset; 1386 int charOffset = thisKeyword?.charOffset;
1387 if (thisKeyword != null) { 1387 if (thisKeyword != null) {
1388 if (!inConstructor) { 1388 if (!inConstructor) {
1389 addCompileTimeError(thisKeyword.charOffset, 1389 addCompileTimeError(thisKeyword.charOffset,
1390 "'this' parameters can only be used on constructors."); 1390 "'this' parameters can only be used on constructors.");
1391 thisKeyword = null; 1391 thisKeyword = null;
1392 } 1392 }
1393 } 1393 }
1394 Identifier name = pop(); 1394 Identifier name = pop();
1395 DartType type = pop(); 1395 DartType type = pop();
1396 pop(); // Modifiers. 1396 int modifiers = Modifier.validate(pop());
1397 if (inCatchClause) {
1398 modifiers |= finalMask;
1399 }
1400 bool isConst = (modifiers & constMask) != 0;
1401 bool isFinal = (modifiers & finalMask) != 0;
1397 ignore(Unhandled.Metadata); 1402 ignore(Unhandled.Metadata);
1398 VariableDeclaration variable; 1403 VariableDeclaration variable;
1399 if (!inCatchClause && functionNestingLevel == 0) { 1404 if (!inCatchClause && functionNestingLevel == 0) {
1400 dynamic builder = formalParameterScope.lookup(name.name, charOffset, uri); 1405 dynamic builder = formalParameterScope.lookup(name.name, charOffset, uri);
1401 if (builder == null) { 1406 if (builder == null) {
1402 if (thisKeyword == null) { 1407 if (thisKeyword == null) {
1403 internalError("Internal error: formal missing for '${name.name}'"); 1408 internalError("Internal error: formal missing for '${name.name}'");
1404 } else { 1409 } else {
1405 addCompileTimeError(thisKeyword.charOffset, 1410 addCompileTimeError(thisKeyword.charOffset,
1406 "'${name.name}' isn't a field in this class."); 1411 "'${name.name}' isn't a field in this class.");
1407 thisKeyword = null; 1412 thisKeyword = null;
1408 } 1413 }
1409 } else if (thisKeyword == null) { 1414 } else if (thisKeyword == null) {
1410 variable = builder.build(library); 1415 variable = builder.build(library);
1411 variable.initializer = name.initializer; 1416 variable.initializer = name.initializer;
1412 } else if (builder.isField && builder.parent == classBuilder) { 1417 } else if (builder.isField && builder.parent == classBuilder) {
1413 FieldBuilder field = builder; 1418 FieldBuilder field = builder;
1414 if (type != null) { 1419 if (type != null) {
1415 nit("Ignoring type on 'this' parameter '${name.name}'.", 1420 nit("Ignoring type on 'this' parameter '${name.name}'.",
1416 thisKeyword.charOffset); 1421 thisKeyword.charOffset);
1417 } 1422 }
1418 type = field.target.type ?? const DynamicType(); 1423 type = field.target.type ?? const DynamicType();
1419 variable = new VariableDeclaration(name.name, 1424 variable = new VariableDeclaration(name.name,
1420 type: type, initializer: name.initializer); 1425 type: type,
1426 initializer: name.initializer,
1427 isFinal: isFinal,
1428 isConst: isConst)..fileOffset = name.fileOffset;
1421 } else { 1429 } else {
1422 addCompileTimeError( 1430 addCompileTimeError(
1423 name.fileOffset, "'${name.name}' isn't a field in this class."); 1431 name.fileOffset, "'${name.name}' isn't a field in this class.");
1424 } 1432 }
1425 } 1433 }
1426 variable ??= new VariableDeclaration(name.name, 1434 variable ??= new VariableDeclaration(name.name,
1427 type: type ?? const DynamicType(), 1435 type: type ?? const DynamicType(),
1428 initializer: name.initializer)..fileOffset = name.fileOffset; 1436 initializer: name.initializer,
1437 isFinal: isFinal,
1438 isConst: isConst)..fileOffset = name.fileOffset;
1429 push(variable); 1439 push(variable);
1430 } 1440 }
1431 1441
1432 @override 1442 @override
1433 void endOptionalFormalParameters( 1443 void endOptionalFormalParameters(
1434 int count, Token beginToken, Token endToken) { 1444 int count, Token beginToken, Token endToken) {
1435 debugEvent("OptionalFormalParameters"); 1445 debugEvent("OptionalFormalParameters");
1436 FormalParameterType kind = optional("{", beginToken) 1446 FormalParameterType kind = optional("{", beginToken)
1437 ? FormalParameterType.NAMED 1447 ? FormalParameterType.NAMED
1438 : FormalParameterType.POSITIONAL; 1448 : FormalParameterType.POSITIONAL;
(...skipping 1447 matching lines...) Expand 10 before | Expand all | Expand 10 after
2886 } else if (node is PrefixBuilder) { 2896 } else if (node is PrefixBuilder) {
2887 return node.name; 2897 return node.name;
2888 } else if (node is ThisAccessor) { 2898 } else if (node is ThisAccessor) {
2889 return node.isSuper ? "super" : "this"; 2899 return node.isSuper ? "super" : "this";
2890 } else if (node is BuilderAccessor) { 2900 } else if (node is BuilderAccessor) {
2891 return node.plainNameForRead; 2901 return node.plainNameForRead;
2892 } else { 2902 } else {
2893 return internalError("Unhandled: ${node.runtimeType}"); 2903 return internalError("Unhandled: ${node.runtimeType}");
2894 } 2904 }
2895 } 2905 }
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/test/fasta/accessors.dart.direct.expect » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698