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

Side by Side Diff: test/type_parser.dart

Issue 2502343002: Store named parameters in sorted lists instead of using maps. (Closed)
Patch Set: Add testcase 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 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 // A very simple parser for a subset of DartTypes for use in testing type 4 // A very simple parser for a subset of DartTypes for use in testing type
5 // algebra. 5 // algebra.
6 library kernel.test.type_parser; 6 library kernel.test.type_parser;
7 7
8 import 'package:kernel/kernel.dart'; 8 import 'package:kernel/kernel.dart';
9 import 'package:kernel/text/ast_to_text.dart'; 9 import 'package:kernel/text/ast_to_text.dart';
10 10
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 } else if (target is TypeParameter) { 144 } else if (target is TypeParameter) {
145 if (peekToken() == Token.LeftAngle) { 145 if (peekToken() == Token.LeftAngle) {
146 return fail('Attempt to apply type arguments to a type variable'); 146 return fail('Attempt to apply type arguments to a type variable');
147 } 147 }
148 return new TypeParameterType(target); 148 return new TypeParameterType(target);
149 } 149 }
150 return fail("Unexpected lookup result for $name: $target"); 150 return fail("Unexpected lookup result for $name: $target");
151 151
152 case Token.LeftParen: 152 case Token.LeftParen:
153 List<DartType> parameters = <DartType>[]; 153 List<DartType> parameters = <DartType>[];
154 Map<String, DartType> namedParameters = <String, DartType>{}; 154 List<NamedType> namedParameters = <NamedType>[];
155 parseParameterList(parameters, namedParameters); 155 parseParameterList(parameters, namedParameters);
156 consumeString('=>'); 156 consumeString('=>');
157 var returnType = parseType(); 157 var returnType = parseType();
158 return new FunctionType(parameters, returnType, 158 return new FunctionType(parameters, returnType,
159 namedParameters: namedParameters); 159 namedParameters: namedParameters);
160 160
161 case Token.LeftAngle: 161 case Token.LeftAngle:
162 var typeParameters = parseAndPushTypeParameterList(); 162 var typeParameters = parseAndPushTypeParameterList();
163 List<DartType> parameters = <DartType>[]; 163 List<DartType> parameters = <DartType>[];
164 Map<String, DartType> namedParameters = <String, DartType>{}; 164 List<NamedType> namedParameters = <NamedType>[];
165 parseParameterList(parameters, namedParameters); 165 parseParameterList(parameters, namedParameters);
166 consumeString('=>'); 166 consumeString('=>');
167 var returnType = parseType(); 167 var returnType = parseType();
168 popTypeParameters(typeParameters); 168 popTypeParameters(typeParameters);
169 return new FunctionType(parameters, returnType, 169 return new FunctionType(parameters, returnType,
170 typeParameters: typeParameters, namedParameters: namedParameters); 170 typeParameters: typeParameters, namedParameters: namedParameters);
171 171
172 default: 172 default:
173 return fail('Unexpected token: $tokenText'); 173 return fail('Unexpected token: $tokenText');
174 } 174 }
175 } 175 }
176 176
177 void parseParameterList( 177 void parseParameterList(
178 List<DartType> positional, Map<String, DartType> named) { 178 List<DartType> positional, List<NamedType> named) {
179 int token = scanToken(); 179 int token = scanToken();
180 assert(token == Token.LeftParen); 180 assert(token == Token.LeftParen);
181 token = peekToken(); 181 token = peekToken();
182 while (token != Token.RightParen) { 182 while (token != Token.RightParen) {
183 var type = parseType(); // Could be a named parameter name. 183 var type = parseType(); // Could be a named parameter name.
184 token = scanToken(); 184 token = scanToken();
185 if (token == Token.Colon) { 185 if (token == Token.Colon) {
186 String name = convertTypeToParameterName(type); 186 String name = convertTypeToParameterName(type);
187 named[name] = parseType(); 187 named.add(new NamedType(name, parseType()));
188 token = scanToken(); 188 token = scanToken();
189 } else { 189 } else {
190 positional.add(type); 190 positional.add(type);
191 } 191 }
192 if (token != Token.Comma && token != Token.RightParen) { 192 if (token != Token.Comma && token != Token.RightParen) {
193 return fail('Unterminated parameter list'); 193 return fail('Unterminated parameter list');
194 } 194 }
195 } 195 }
196 named.sort();
196 } 197 }
197 198
198 String convertTypeToParameterName(DartType type) { 199 String convertTypeToParameterName(DartType type) {
199 if (type is InterfaceType && type.typeArguments.isEmpty) { 200 if (type is InterfaceType && type.typeArguments.isEmpty) {
200 return type.classNode.name; 201 return type.classNode.name;
201 } else if (type is TypeParameterType) { 202 } else if (type is TypeParameterType) {
202 return type.parameter.name; 203 return type.parameter.name;
203 } else { 204 } else {
204 return fail('Unexpected colon after $type'); 205 return fail('Unexpected colon after $type');
205 } 206 }
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 void main(List<String> args) { 315 void main(List<String> args) {
315 if (args.length != 1) { 316 if (args.length != 1) {
316 print('Usage: type_parser TYPE'); 317 print('Usage: type_parser TYPE');
317 } 318 }
318 var environment = new LazyTypeEnvironment(); 319 var environment = new LazyTypeEnvironment();
319 var type = parseDartType(args[0], environment.lookup); 320 var type = parseDartType(args[0], environment.lookup);
320 var buffer = new StringBuffer(); 321 var buffer = new StringBuffer();
321 new Printer(buffer).writeType(type); 322 new Printer(buffer).writeType(type);
322 print(buffer); 323 print(buffer);
323 } 324 }
OLDNEW
« lib/ast.dart ('K') | « lib/visitor.dart ('k') | testcases/input/named_parameters.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698