| OLD | NEW |
| 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 '../fasta_codes.dart' | 7 import '../fasta_codes.dart' |
| 8 show FastaMessage, codeExpectedButGot, codeExpectedFunctionBody; | 8 show FastaMessage, codeExpectedButGot, codeExpectedFunctionBody; |
| 9 | 9 |
| 10 import '../parser/parser.dart' show FormalParameterType, optional; | 10 import '../parser/parser.dart' show FormalParameterType, MemberKind, optional; |
| 11 | 11 |
| 12 import '../parser/identifier_context.dart' show IdentifierContext; | 12 import '../parser/identifier_context.dart' show IdentifierContext; |
| 13 | 13 |
| 14 import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory; | 14 import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory; |
| 15 | 15 |
| 16 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' | 16 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
| 17 show | 17 show |
| 18 KernelArguments, | 18 KernelArguments, |
| 19 KernelField, | 19 KernelField, |
| 20 KernelFunctionDeclaration, | 20 KernelFunctionDeclaration, |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 @override | 329 @override |
| 330 void endTopLevelFields(int count, Token beginToken, Token endToken) { | 330 void endTopLevelFields(int count, Token beginToken, Token endToken) { |
| 331 debugEvent("TopLevelFields"); | 331 debugEvent("TopLevelFields"); |
| 332 doFields(count); | 332 doFields(count); |
| 333 // There's no metadata here because of a slight asymmetry between | 333 // There's no metadata here because of a slight asymmetry between |
| 334 // [parseTopLevelMember] and [parseMember]. This asymmetry leads to | 334 // [parseTopLevelMember] and [parseMember]. This asymmetry leads to |
| 335 // DietListener discarding top-level member metadata. | 335 // DietListener discarding top-level member metadata. |
| 336 } | 336 } |
| 337 | 337 |
| 338 @override | 338 @override |
| 339 void endFields( | 339 void endFields(int count, Token beginToken, Token endToken) { |
| 340 int count, Token covariantKeyword, Token beginToken, Token endToken) { | |
| 341 debugEvent("Fields"); | 340 debugEvent("Fields"); |
| 342 doFields(count); | 341 doFields(count); |
| 343 pop(); // Metadata. | 342 pop(); // Metadata. |
| 344 } | 343 } |
| 345 | 344 |
| 346 void doFields(int count) { | 345 void doFields(int count) { |
| 347 for (int i = 0; i < count; i++) { | 346 for (int i = 0; i < count; i++) { |
| 348 Expression initializer = pop(); | 347 Expression initializer = pop(); |
| 349 Identifier identifier = pop(); | 348 Identifier identifier = pop(); |
| 350 if (initializer != null) { | 349 if (initializer != null) { |
| (...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1471 if (!isInstanceContext && type.parameter.parent is Class) { | 1470 if (!isInstanceContext && type.parameter.parent is Class) { |
| 1472 pop(); | 1471 pop(); |
| 1473 warning("Type variables can only be used in instance methods.", | 1472 warning("Type variables can only be used in instance methods.", |
| 1474 beginToken.charOffset); | 1473 beginToken.charOffset); |
| 1475 push(const DynamicType()); | 1474 push(const DynamicType()); |
| 1476 } | 1475 } |
| 1477 } | 1476 } |
| 1478 } | 1477 } |
| 1479 | 1478 |
| 1480 @override | 1479 @override |
| 1480 void handleFunctionType(Token functionToken, Token endToken) { |
| 1481 FormalParameters formals = pop(); |
| 1482 ignore(Unhandled.TypeVariables); |
| 1483 DartType returnType = pop(); |
| 1484 push(formals.toFunctionType(returnType)); |
| 1485 } |
| 1486 |
| 1487 @override |
| 1481 void handleVoidKeyword(Token token) { | 1488 void handleVoidKeyword(Token token) { |
| 1482 debugEvent("VoidKeyword"); | 1489 debugEvent("VoidKeyword"); |
| 1483 push(const VoidType()); | 1490 push(const VoidType()); |
| 1484 } | 1491 } |
| 1485 | 1492 |
| 1486 @override | 1493 @override |
| 1487 void handleAsOperator(Token operator, Token endToken) { | 1494 void handleAsOperator(Token operator, Token endToken) { |
| 1488 debugEvent("AsOperator"); | 1495 debugEvent("AsOperator"); |
| 1489 DartType type = pop(); | 1496 DartType type = pop(); |
| 1490 Expression expression = popForValue(); | 1497 Expression expression = popForValue(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1522 Expression expression = popForValue(); | 1529 Expression expression = popForValue(); |
| 1523 if (constantExpressionRequired) { | 1530 if (constantExpressionRequired) { |
| 1524 push(buildCompileTimeError( | 1531 push(buildCompileTimeError( |
| 1525 "Not a constant expression.", throwToken.charOffset)); | 1532 "Not a constant expression.", throwToken.charOffset)); |
| 1526 } else { | 1533 } else { |
| 1527 push(astFactory.throwExpression(throwToken, expression)); | 1534 push(astFactory.throwExpression(throwToken, expression)); |
| 1528 } | 1535 } |
| 1529 } | 1536 } |
| 1530 | 1537 |
| 1531 @override | 1538 @override |
| 1532 void endFormalParameter(Token covariantKeyword, Token thisKeyword, | 1539 void endFormalParameter(Token thisKeyword, Token nameToken, |
| 1533 Token nameToken, FormalParameterType kind) { | 1540 FormalParameterType kind, MemberKind memberKind) { |
| 1534 debugEvent("FormalParameter"); | 1541 debugEvent("FormalParameter"); |
| 1535 // TODO(ahe): Need beginToken here. | |
| 1536 int charOffset = thisKeyword?.charOffset; | |
| 1537 if (thisKeyword != null) { | 1542 if (thisKeyword != null) { |
| 1538 if (!inConstructor) { | 1543 if (!inConstructor) { |
| 1539 addCompileTimeError(thisKeyword.charOffset, | 1544 addCompileTimeError(thisKeyword.charOffset, |
| 1540 "'this' parameters can only be used on constructors."); | 1545 "'this' parameters can only be used on constructors."); |
| 1541 thisKeyword = null; | 1546 thisKeyword = null; |
| 1542 } | 1547 } |
| 1543 } | 1548 } |
| 1544 Identifier name = pop(); | 1549 Identifier name = pop(); |
| 1545 DartType type = pop(); | 1550 DartType type = pop(); |
| 1546 int modifiers = Modifier.validate(pop()); | 1551 int modifiers = Modifier.validate(pop()); |
| 1547 if (inCatchClause) { | 1552 if (inCatchClause) { |
| 1548 modifiers |= finalMask; | 1553 modifiers |= finalMask; |
| 1549 } | 1554 } |
| 1550 bool isConst = (modifiers & constMask) != 0; | 1555 bool isConst = (modifiers & constMask) != 0; |
| 1551 bool isFinal = (modifiers & finalMask) != 0; | 1556 bool isFinal = (modifiers & finalMask) != 0; |
| 1552 ignore(Unhandled.Metadata); | 1557 ignore(Unhandled.Metadata); |
| 1553 VariableDeclaration variable; | 1558 VariableDeclaration variable; |
| 1554 if (!inCatchClause && functionNestingLevel == 0) { | 1559 if (!inCatchClause && |
| 1555 dynamic builder = formalParameterScope.lookup(name.name, charOffset, uri); | 1560 functionNestingLevel == 0 && |
| 1561 memberKind != MemberKind.GeneralizedFunctionType) { |
| 1562 dynamic builder = formalParameterScope.lookup( |
| 1563 name.name, offsetForToken(name.token), uri); |
| 1556 if (builder == null) { | 1564 if (builder == null) { |
| 1557 if (thisKeyword == null) { | 1565 if (thisKeyword == null) { |
| 1558 internalError("Internal error: formal missing for '${name.name}'"); | 1566 internalError("Internal error: formal missing for '${name.name}'"); |
| 1559 } else { | 1567 } else { |
| 1560 addCompileTimeError(thisKeyword.charOffset, | 1568 addCompileTimeError(thisKeyword.charOffset, |
| 1561 "'${name.name}' isn't a field in this class."); | 1569 "'${name.name}' isn't a field in this class."); |
| 1562 thisKeyword = null; | 1570 thisKeyword = null; |
| 1563 } | 1571 } |
| 1564 } else if (thisKeyword == null) { | 1572 } else if (thisKeyword == null) { |
| 1565 variable = builder.build(library); | 1573 variable = builder.build(library); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1602 } | 1610 } |
| 1603 | 1611 |
| 1604 @override | 1612 @override |
| 1605 void beginFunctionTypedFormalParameter(Token token) { | 1613 void beginFunctionTypedFormalParameter(Token token) { |
| 1606 debugEvent("beginFunctionTypedFormalParameter"); | 1614 debugEvent("beginFunctionTypedFormalParameter"); |
| 1607 functionNestingLevel++; | 1615 functionNestingLevel++; |
| 1608 } | 1616 } |
| 1609 | 1617 |
| 1610 @override | 1618 @override |
| 1611 void endFunctionTypedFormalParameter( | 1619 void endFunctionTypedFormalParameter( |
| 1612 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) { | 1620 Token thisKeyword, FormalParameterType kind) { |
| 1613 debugEvent("FunctionTypedFormalParameter"); | 1621 debugEvent("FunctionTypedFormalParameter"); |
| 1614 if (inCatchClause || functionNestingLevel != 0) { | 1622 if (inCatchClause || functionNestingLevel != 0) { |
| 1615 exitLocalScope(); | 1623 exitLocalScope(); |
| 1616 } | 1624 } |
| 1617 FormalParameters formals = pop(); | 1625 FormalParameters formals = pop(); |
| 1618 ignore(Unhandled.TypeVariables); | 1626 ignore(Unhandled.TypeVariables); |
| 1619 Identifier name = pop(); | 1627 Identifier name = pop(); |
| 1620 DartType returnType = pop(); | 1628 DartType returnType = pop(); |
| 1621 push(formals.toFunctionType(returnType)); | 1629 push(formals.toFunctionType(returnType)); |
| 1622 push(name); | 1630 push(name); |
| 1623 functionNestingLevel--; | 1631 functionNestingLevel--; |
| 1624 } | 1632 } |
| 1625 | 1633 |
| 1626 @override | 1634 @override |
| 1627 void handleValuedFormalParameter(Token equals, Token token) { | 1635 void handleValuedFormalParameter(Token equals, Token token) { |
| 1628 debugEvent("ValuedFormalParameter"); | 1636 debugEvent("ValuedFormalParameter"); |
| 1629 Expression initializer = popForValue(); | 1637 Expression initializer = popForValue(); |
| 1630 Identifier name = pop(); | 1638 Identifier name = pop(); |
| 1631 push(new InitializedIdentifier(name.token, initializer)); | 1639 push(new InitializedIdentifier(name.token, initializer)); |
| 1632 } | 1640 } |
| 1633 | 1641 |
| 1634 @override | 1642 @override |
| 1635 void handleFormalParameterWithoutValue(Token token) { | 1643 void handleFormalParameterWithoutValue(Token token) { |
| 1636 debugEvent("FormalParameterWithoutValue"); | 1644 debugEvent("FormalParameterWithoutValue"); |
| 1637 } | 1645 } |
| 1638 | 1646 |
| 1639 @override | 1647 @override |
| 1640 void endFormalParameters(int count, Token beginToken, Token endToken) { | 1648 void endFormalParameters( |
| 1649 int count, Token beginToken, Token endToken, MemberKind kind) { |
| 1641 debugEvent("FormalParameters"); | 1650 debugEvent("FormalParameters"); |
| 1642 OptionalFormals optional; | 1651 OptionalFormals optional; |
| 1643 if (count > 0 && peek() is OptionalFormals) { | 1652 if (count > 0 && peek() is OptionalFormals) { |
| 1644 optional = pop(); | 1653 optional = pop(); |
| 1645 count--; | 1654 count--; |
| 1646 } | 1655 } |
| 1647 FormalParameters formals = new FormalParameters( | 1656 FormalParameters formals = new FormalParameters( |
| 1648 popList(count) ?? <VariableDeclaration>[], | 1657 popList(count) ?? <VariableDeclaration>[], |
| 1649 optional, | 1658 optional, |
| 1650 beginToken.charOffset); | 1659 beginToken.charOffset); |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2519 @override | 2528 @override |
| 2520 void handleModifiers(int count) { | 2529 void handleModifiers(int count) { |
| 2521 debugEvent("Modifiers"); | 2530 debugEvent("Modifiers"); |
| 2522 // TODO(ahe): Copied from outline_builder.dart. | 2531 // TODO(ahe): Copied from outline_builder.dart. |
| 2523 push(popList(count) ?? NullValue.Modifiers); | 2532 push(popList(count) ?? NullValue.Modifiers); |
| 2524 } | 2533 } |
| 2525 | 2534 |
| 2526 @override | 2535 @override |
| 2527 void handleRecoverableError(Token token, FastaMessage message) { | 2536 void handleRecoverableError(Token token, FastaMessage message) { |
| 2528 bool silent = hasParserError; | 2537 bool silent = hasParserError; |
| 2529 super.handleRecoverableError(token, message); | |
| 2530 addCompileTimeError(message.charOffset, message.message, silent: silent); | 2538 addCompileTimeError(message.charOffset, message.message, silent: silent); |
| 2531 } | 2539 } |
| 2532 | 2540 |
| 2533 @override | 2541 @override |
| 2534 Token handleUnrecoverableError(Token token, FastaMessage message) { | 2542 Token handleUnrecoverableError(Token token, FastaMessage message) { |
| 2535 if (isDartLibrary && message.code == codeExpectedFunctionBody) { | 2543 if (isDartLibrary && message.code == codeExpectedFunctionBody) { |
| 2536 Token recover = library.loader.target.skipNativeClause(token); | 2544 Token recover = library.loader.target.skipNativeClause(token); |
| 2537 if (recover != null) return recover; | 2545 if (recover != null) return recover; |
| 2538 } else if (message.code == codeExpectedButGot) { | 2546 } else if (message.code == codeExpectedButGot) { |
| 2539 String expected = message.arguments["string"]; | 2547 String expected = message.arguments["string"]; |
| (...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3137 } else if (node is PrefixBuilder) { | 3145 } else if (node is PrefixBuilder) { |
| 3138 return node.name; | 3146 return node.name; |
| 3139 } else if (node is ThisAccessor) { | 3147 } else if (node is ThisAccessor) { |
| 3140 return node.isSuper ? "super" : "this"; | 3148 return node.isSuper ? "super" : "this"; |
| 3141 } else if (node is FastaAccessor) { | 3149 } else if (node is FastaAccessor) { |
| 3142 return node.plainNameForRead; | 3150 return node.plainNameForRead; |
| 3143 } else { | 3151 } else { |
| 3144 return internalError("Unhandled: ${node.runtimeType}"); | 3152 return internalError("Unhandled: ${node.runtimeType}"); |
| 3145 } | 3153 } |
| 3146 } | 3154 } |
| OLD | NEW |