OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class CancelTypeInferenceException { | 5 class CancelTypeInferenceException { |
6 final Node node; | 6 final Node node; |
7 final String reason; | 7 final String reason; |
8 | 8 |
9 CancelTypeInferenceException(this.node, this.reason); | 9 CancelTypeInferenceException(this.node, this.reason); |
10 } | 10 } |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 | 206 |
207 ConcreteTypeCartesianProductIterator(this.baseTypeOfThis, | 207 ConcreteTypeCartesianProductIterator(this.baseTypeOfThis, |
208 Map<Element, ConcreteType> concreteTypes) : | 208 Map<Element, ConcreteType> concreteTypes) : |
209 this.concreteTypes = concreteTypes, | 209 this.concreteTypes = concreteTypes, |
210 nextValues = new Map<Element, BaseType>(), | 210 nextValues = new Map<Element, BaseType>(), |
211 state = new Map<Element, Iterator>() { | 211 state = new Map<Element, Iterator>() { |
212 if (concreteTypes.isEmpty) { | 212 if (concreteTypes.isEmpty) { |
213 size = 0; | 213 size = 0; |
214 return; | 214 return; |
215 } | 215 } |
216 for (final e in concreteTypes.getKeys()) { | 216 for (final e in concreteTypes.keys) { |
217 final baseTypes = concreteTypes[e].baseTypes; | 217 final baseTypes = concreteTypes[e].baseTypes; |
218 size *= baseTypes.length; | 218 size *= baseTypes.length; |
219 } | 219 } |
220 } | 220 } |
221 | 221 |
222 bool get hasNext { | 222 bool get hasNext { |
223 return counter < size; | 223 return counter < size; |
224 } | 224 } |
225 | 225 |
226 ConcreteTypesEnvironment takeSnapshot() { | 226 ConcreteTypesEnvironment takeSnapshot() { |
227 Map<Element, ConcreteType> result = new Map<Element, ConcreteType>(); | 227 Map<Element, ConcreteType> result = new Map<Element, ConcreteType>(); |
228 nextValues.forEach((k, v) { result[k] = new ConcreteType.singleton(v); }); | 228 nextValues.forEach((k, v) { result[k] = new ConcreteType.singleton(v); }); |
229 return new ConcreteTypesEnvironment.of(result, baseTypeOfThis); | 229 return new ConcreteTypesEnvironment.of(result, baseTypeOfThis); |
230 } | 230 } |
231 | 231 |
232 ConcreteTypesEnvironment next() { | 232 ConcreteTypesEnvironment next() { |
233 if (!hasNext) throw new NoMoreElementsException(); | 233 if (!hasNext) throw new NoMoreElementsException(); |
234 Element keyToIncrement = null; | 234 Element keyToIncrement = null; |
235 for (final key in concreteTypes.getKeys()) { | 235 for (final key in concreteTypes.keys) { |
236 final iterator = state[key]; | 236 final iterator = state[key]; |
237 if (iterator != null && iterator.hasNext) { | 237 if (iterator != null && iterator.hasNext) { |
238 nextValues[key] = state[key].next(); | 238 nextValues[key] = state[key].next(); |
239 break; | 239 break; |
240 } | 240 } |
241 Iterator newIterator = concreteTypes[key].baseTypes.iterator(); | 241 Iterator newIterator = concreteTypes[key].baseTypes.iterator(); |
242 state[key] = newIterator; | 242 state[key] = newIterator; |
243 nextValues[key] = newIterator.next(); | 243 nextValues[key] = newIterator.next(); |
244 } | 244 } |
245 counter++; | 245 counter++; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 newMap[element] = currentType.union(type); | 310 newMap[element] = currentType.union(type); |
311 } | 311 } |
312 }); | 312 }); |
313 return new ConcreteTypesEnvironment.of(newMap, typeOfThis); | 313 return new ConcreteTypesEnvironment.of(newMap, typeOfThis); |
314 } | 314 } |
315 | 315 |
316 bool operator ==(ConcreteTypesEnvironment other) { | 316 bool operator ==(ConcreteTypesEnvironment other) { |
317 if (other is! ConcreteTypesEnvironment) return false; | 317 if (other is! ConcreteTypesEnvironment) return false; |
318 if (typeOfThis != other.typeOfThis) return false; | 318 if (typeOfThis != other.typeOfThis) return false; |
319 if (environment.length != other.environment.length) return false; | 319 if (environment.length != other.environment.length) return false; |
320 for (Element key in environment.getKeys()) { | 320 for (Element key in environment.keys) { |
321 if (!other.environment.containsKey(key) | 321 if (!other.environment.containsKey(key) |
322 || (environment[key] != other.environment[key])) { | 322 || (environment[key] != other.environment[key])) { |
323 return false; | 323 return false; |
324 } | 324 } |
325 } | 325 } |
326 return true; | 326 return true; |
327 } | 327 } |
328 | 328 |
329 int get hashCode { | 329 int get hashCode { |
330 int result = (typeOfThis != null) ? typeOfThis.hashCode : 1; | 330 int result = (typeOfThis != null) ? typeOfThis.hashCode : 1; |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 final Map<SourceString, Element> leftOverNamedParameters = | 656 final Map<SourceString, Element> leftOverNamedParameters = |
657 new Map<SourceString, Element>(); | 657 new Map<SourceString, Element>(); |
658 for (; | 658 for (; |
659 !remainingNamedParameters.isEmpty; | 659 !remainingNamedParameters.isEmpty; |
660 remainingNamedParameters = remainingNamedParameters.tail) { | 660 remainingNamedParameters = remainingNamedParameters.tail) { |
661 final Element namedParameter = remainingNamedParameters.head; | 661 final Element namedParameter = remainingNamedParameters.head; |
662 leftOverNamedParameters[namedParameter.name] = namedParameter; | 662 leftOverNamedParameters[namedParameter.name] = namedParameter; |
663 } | 663 } |
664 // we attach the named arguments to their corresponding named paramaters | 664 // we attach the named arguments to their corresponding named paramaters |
665 // (we don't use foreach because we want to be able to return early) | 665 // (we don't use foreach because we want to be able to return early) |
666 for (Identifier identifier in argumentsTypes.named.getKeys()) { | 666 for (Identifier identifier in argumentsTypes.named.keys) { |
667 final ConcreteType concreteType = argumentsTypes.named[identifier]; | 667 final ConcreteType concreteType = argumentsTypes.named[identifier]; |
668 SourceString source = identifier.source; | 668 SourceString source = identifier.source; |
669 final Element namedParameter = leftOverNamedParameters[source]; | 669 final Element namedParameter = leftOverNamedParameters[source]; |
670 // unexisting or already used named parameter | 670 // unexisting or already used named parameter |
671 if (namedParameter == null) return null; | 671 if (namedParameter == null) return null; |
672 result[namedParameter] = concreteType; | 672 result[namedParameter] = concreteType; |
673 leftOverNamedParameters.remove(source); | 673 leftOverNamedParameters.remove(source); |
674 }; | 674 }; |
675 // we use null for each unused named parameter | 675 // we use null for each unused named parameter |
676 // TODO(polux): use default value whenever available | 676 // TODO(polux): use default value whenever available |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1382 Element element = elements[node]; | 1382 Element element = elements[node]; |
1383 inferrer.addCaller(element, currentMethod); | 1383 inferrer.addCaller(element, currentMethod); |
1384 return inferrer.getSendReturnType(element, null, | 1384 return inferrer.getSendReturnType(element, null, |
1385 analyzeArguments(node.arguments)); | 1385 analyzeArguments(node.arguments)); |
1386 } | 1386 } |
1387 | 1387 |
1388 void internalError(String reason, {Node node}) { | 1388 void internalError(String reason, {Node node}) { |
1389 inferrer.fail(node, reason); | 1389 inferrer.fail(node, reason); |
1390 } | 1390 } |
1391 } | 1391 } |
OLD | NEW |