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

Unified Diff: lib/type_algebra.dart

Issue 2502343002: Store named parameters in sorted lists instead of using maps. (Closed)
Patch Set: Remove duplicates from named parameter lists to recover from erroneous inputs Created 4 years, 1 month 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
« no previous file with comments | « lib/transformations/treeshaker.dart ('k') | lib/type_environment.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/type_algebra.dart
diff --git a/lib/type_algebra.dart b/lib/type_algebra.dart
index e6002b11ea9b32003518a562416beae5ce57279a..2a4e89544bf478571a144d7e289b9acbd6dedd42 100644
--- a/lib/type_algebra.dart
+++ b/lib/type_algebra.dart
@@ -325,6 +325,13 @@ abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
return new Supertype(node.classNode, typeArguments);
}
+ NamedType visitNamedType(NamedType node) {
+ int before = useCounter;
+ var type = visit(node.type);
+ if (useCounter == before) return node;
+ return new NamedType(node.name, type);
+ }
+
DartType visit(DartType node) => node.accept(this);
DartType visitInvalidType(InvalidType node) => node;
@@ -368,8 +375,8 @@ abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
? const <DartType>[]
: node.positionalParameters.map(inner.visit).toList();
var namedParameters = node.namedParameters.isEmpty
- ? const <String, DartType>{}
- : _mapValues(node.namedParameters, inner.visit);
+ ? const <NamedType>[]
+ : node.namedParameters.map(inner.visitNamedType).toList();
inner.invertVariance();
var returnType = inner.visit(node.returnType);
if (this.useCounter == before) return node;
@@ -552,11 +559,12 @@ class _TypeUnification {
var right = substitute(type2.positionalParameters[i], rightInstance);
if (!_unify(left, right)) return false;
}
- for (var name in type1.namedParameters.keys) {
- var right = type2.namedParameters[name];
- if (right == null) return _fail();
- right = substitute(right, rightInstance);
- var left = substitute(type1.namedParameters[name], leftInstance);
+ for (int i = 0; i < type1.namedParameters.length; ++i) {
+ if (type1.namedParameters[i].name != type2.namedParameters[i].name) {
+ return false;
+ }
+ var left = substitute(type1.namedParameters[i].type, leftInstance);
+ var right = substitute(type2.namedParameters[i].type, rightInstance);
if (!_unify(left, right)) return false;
}
var leftReturn = substitute(type1.returnType, leftInstance);
@@ -605,6 +613,10 @@ class _OccurrenceVisitor extends DartTypeVisitor<bool> {
bool visit(DartType node) => node.accept(this);
+ bool visitNamedType(NamedType node) {
+ return visit(node.type);
+ }
+
bool visitInvalidType(InvalidType node) => false;
bool visitDynamicType(DynamicType node) => false;
bool visitVoidType(VoidType node) => false;
@@ -616,7 +628,7 @@ class _OccurrenceVisitor extends DartTypeVisitor<bool> {
bool visitFunctionType(FunctionType node) {
return node.typeParameters.any(handleTypeParameter) ||
node.positionalParameters.any(visit) ||
- node.namedParameters.values.any(visit) ||
+ node.namedParameters.any(visitNamedType) ||
visit(node.returnType);
}
« no previous file with comments | « lib/transformations/treeshaker.dart ('k') | lib/type_environment.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698