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

Side by Side Diff: pkg/kernel/lib/ast.dart

Issue 2993993002: Implement erasure of local function declarations. (Closed)
Patch Set: It's not safe to call clear on a function type's list of typeParameters. Created 3 years, 4 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
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 /// ----------------------------------------------------------------------- 5 /// -----------------------------------------------------------------------
6 /// ERROR HANDLING 6 /// ERROR HANDLING
7 /// ----------------------------------------------------------------------- 7 /// -----------------------------------------------------------------------
8 /// 8 ///
9 /// As a rule of thumb, errors that can be detected statically are handled by 9 /// As a rule of thumb, errors that can be detected statically are handled by
10 /// the frontend, typically by translating the erroneous code into a 'throw' or 10 /// the frontend, typically by translating the erroneous code into a 'throw' or
(...skipping 1521 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 1532
1533 static NamedType _getNamedTypeOfVariable(VariableDeclaration node) { 1533 static NamedType _getNamedTypeOfVariable(VariableDeclaration node) {
1534 return new NamedType(node.name, node.type); 1534 return new NamedType(node.name, node.type);
1535 } 1535 }
1536 1536
1537 FunctionType get functionType { 1537 FunctionType get functionType {
1538 TreeNode parent = this.parent; 1538 TreeNode parent = this.parent;
1539 List<NamedType> named = 1539 List<NamedType> named =
1540 namedParameters.map(_getNamedTypeOfVariable).toList(growable: false); 1540 namedParameters.map(_getNamedTypeOfVariable).toList(growable: false);
1541 named.sort(); 1541 named.sort();
1542 // We need create a copy of the list of type parameters, otherwise
1543 // transformations like erasure don't work.
1544 var typeParametersCopy = new List<TypeParameter>.from(parent is Constructor
1545 ? parent.enclosingClass.typeParameters
1546 : typeParameters);
1542 return new FunctionType( 1547 return new FunctionType(
1543 positionalParameters.map(_getTypeOfVariable).toList(growable: false), 1548 positionalParameters.map(_getTypeOfVariable).toList(growable: false),
1544 returnType, 1549 returnType,
1545 namedParameters: named, 1550 namedParameters: named,
1546 typeParameters: parent is Constructor 1551 typeParameters: typeParametersCopy,
1547 ? parent.enclosingClass.typeParameters
1548 : typeParameters,
1549 requiredParameterCount: requiredParameterCount); 1552 requiredParameterCount: requiredParameterCount);
1550 } 1553 }
1551 1554
1552 accept(TreeVisitor v) => v.visitFunctionNode(this); 1555 accept(TreeVisitor v) => v.visitFunctionNode(this);
1553 1556
1554 visitChildren(Visitor v) { 1557 visitChildren(Visitor v) {
1555 visitList(typeParameters, v); 1558 visitList(typeParameters, v);
1556 visitList(positionalParameters, v); 1559 visitList(positionalParameters, v);
1557 visitList(namedParameters, v); 1560 visitList(namedParameters, v);
1558 returnType?.accept(v); 1561 returnType?.accept(v);
(...skipping 3187 matching lines...) Expand 10 before | Expand all | Expand 10 after
4746 if (typedef_.canonicalName == null) { 4749 if (typedef_.canonicalName == null) {
4747 throw '$typedef_ has no canonical name'; 4750 throw '$typedef_ has no canonical name';
4748 } 4751 }
4749 return typedef_.canonicalName; 4752 return typedef_.canonicalName;
4750 } 4753 }
4751 4754
4752 /// Annotation describing information which is not part of Dart semantics; in 4755 /// Annotation describing information which is not part of Dart semantics; in
4753 /// other words, if this information (or any information it refers to) changes, 4756 /// other words, if this information (or any information it refers to) changes,
4754 /// static analysis and runtime behavior of the library are unaffected. 4757 /// static analysis and runtime behavior of the library are unaffected.
4755 const informative = null; 4758 const informative = null;
OLDNEW
« no previous file with comments | « no previous file | pkg/kernel/lib/transformations/erasure.dart » ('j') | pkg/kernel/lib/transformations/erasure.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698