| 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 |