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 // 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 Loading... |
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 Loading... |
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 } |
OLD | NEW |