| OLD | NEW | 
|    1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2013, 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 import 'package:expect/expect.dart'; |    5 import 'package:expect/expect.dart'; | 
 |    6 import "package:async_helper/async_helper.dart"; | 
|    6 import |    7 import | 
|    7     '../../../sdk/lib/_internal/compiler/implementation/types/types.dart' |    8     '../../../sdk/lib/_internal/compiler/implementation/types/types.dart' | 
|    8     show TypeMask; |    9     show TypeMask; | 
|    9  |   10  | 
|   10 import 'compiler_helper.dart'; |   11 import 'compiler_helper.dart'; | 
|   11 import 'parser_helper.dart'; |   12 import 'parser_helper.dart'; | 
|   12  |   13  | 
|   13 const String TEST = """ |   14 const String TEST = """ | 
|   14 returnNum1(a) { |   15 returnNum1(a) { | 
|   15   if (a) return 1; |   16   if (a) return 1; | 
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  590   testCascade2(); |  591   testCascade2(); | 
|  591   testSpecialization1(); |  592   testSpecialization1(); | 
|  592   testSpecialization2(); |  593   testSpecialization2(); | 
|  593   testSpecialization3(); |  594   testSpecialization3(); | 
|  594 } |  595 } | 
|  595 """; |  596 """; | 
|  596  |  597  | 
|  597 void main() { |  598 void main() { | 
|  598   Uri uri = new Uri(scheme: 'source'); |  599   Uri uri = new Uri(scheme: 'source'); | 
|  599   var compiler = compilerFor(TEST, uri); |  600   var compiler = compilerFor(TEST, uri); | 
|  600   compiler.runCompiler(uri); |  601   asyncTest(() => compiler.runCompiler(uri).then((_) { | 
|  601   var typesTask = compiler.typesTask; |  602     var typesTask = compiler.typesTask; | 
|  602   var typesInferrer = typesTask.typesInferrer; |  603     var typesInferrer = typesTask.typesInferrer; | 
|  603  |  604  | 
|  604   checkReturn(String name, type) { |  605     checkReturn(String name, type) { | 
|  605     var element = findElement(compiler, name); |  606       var element = findElement(compiler, name); | 
|  606     Expect.equals( |  607       Expect.equals( | 
|  607         type, |  608           type, | 
|  608         typesInferrer.getReturnTypeOfElement(element).simplify(compiler), |  609           typesInferrer.getReturnTypeOfElement(element).simplify(compiler), | 
|  609         name); |  610           name); | 
|  610   } |  611     } | 
|  611   var interceptorType = |  612     var interceptorType = | 
|  612       findTypeMask(compiler, 'Interceptor', 'nonNullSubclass'); |  613         findTypeMask(compiler, 'Interceptor', 'nonNullSubclass'); | 
|  613  |  614  | 
|  614   checkReturn('returnNum1', typesTask.numType); |  615     checkReturn('returnNum1', typesTask.numType); | 
|  615   checkReturn('returnNum2', typesTask.numType); |  616     checkReturn('returnNum2', typesTask.numType); | 
|  616   checkReturn('returnInt1', typesTask.intType); |  617     checkReturn('returnInt1', typesTask.intType); | 
|  617   checkReturn('returnInt2', typesTask.intType); |  618     checkReturn('returnInt2', typesTask.intType); | 
|  618   checkReturn('returnDouble', typesTask.doubleType); |  619     checkReturn('returnDouble', typesTask.doubleType); | 
|  619   checkReturn('returnGiveUp', interceptorType); |  620     checkReturn('returnGiveUp', interceptorType); | 
|  620   checkReturn('returnInt5', typesTask.intType); |  621     checkReturn('returnInt5', typesTask.intType); | 
|  621   checkReturn('returnInt6', typesTask.intType); |  622     checkReturn('returnInt6', typesTask.intType); | 
|  622   checkReturn('returnIntOrNull', typesTask.intType.nullable()); |  623     checkReturn('returnIntOrNull', typesTask.intType.nullable()); | 
|  623   checkReturn('returnInt3', typesTask.intType); |  624     checkReturn('returnInt3', typesTask.intType); | 
|  624   checkReturn('returnDynamic', typesTask.dynamicType); |  625     checkReturn('returnDynamic', typesTask.dynamicType); | 
|  625   checkReturn('returnInt4', typesTask.intType); |  626     checkReturn('returnInt4', typesTask.intType); | 
|  626   checkReturn('returnInt7', typesTask.intType); |  627     checkReturn('returnInt7', typesTask.intType); | 
|  627   checkReturn('returnInt8', typesTask.intType); |  628     checkReturn('returnInt8', typesTask.intType); | 
|  628   checkReturn('returnDynamic1', typesTask.dynamicType); |  629     checkReturn('returnDynamic1', typesTask.dynamicType); | 
|  629   checkReturn('returnDynamic2', typesTask.dynamicType); |  630     checkReturn('returnDynamic2', typesTask.dynamicType); | 
|  630   TypeMask intType = new TypeMask.nonNullSubtype(compiler.intClass.rawType); |  631     TypeMask intType = new TypeMask.nonNullSubtype(compiler.intClass.rawType); | 
|  631   checkReturn('testIsCheck1', intType); |  632     checkReturn('testIsCheck1', intType); | 
|  632   checkReturn('testIsCheck2', intType); |  633     checkReturn('testIsCheck2', intType); | 
|  633   checkReturn('testIsCheck3', intType.nullable()); |  634     checkReturn('testIsCheck3', intType.nullable()); | 
|  634   checkReturn('testIsCheck4', intType); |  635     checkReturn('testIsCheck4', intType); | 
|  635   checkReturn('testIsCheck5', intType); |  636     checkReturn('testIsCheck5', intType); | 
|  636   checkReturn('testIsCheck6', typesTask.dynamicType); |  637     checkReturn('testIsCheck6', typesTask.dynamicType); | 
|  637   checkReturn('testIsCheck7', intType); |  638     checkReturn('testIsCheck7', intType); | 
|  638   checkReturn('testIsCheck8', typesTask.dynamicType); |  639     checkReturn('testIsCheck8', typesTask.dynamicType); | 
|  639   checkReturn('testIsCheck9', intType); |  640     checkReturn('testIsCheck9', intType); | 
|  640   checkReturn('testIsCheck10', typesTask.dynamicType); |  641     checkReturn('testIsCheck10', typesTask.dynamicType); | 
|  641   checkReturn('testIsCheck11', intType); |  642     checkReturn('testIsCheck11', intType); | 
|  642   checkReturn('testIsCheck12', typesTask.dynamicType); |  643     checkReturn('testIsCheck12', typesTask.dynamicType); | 
|  643   checkReturn('testIsCheck13', intType); |  644     checkReturn('testIsCheck13', intType); | 
|  644   checkReturn('testIsCheck14', typesTask.dynamicType); |  645     checkReturn('testIsCheck14', typesTask.dynamicType); | 
|  645   checkReturn('testIsCheck15', intType); |  646     checkReturn('testIsCheck15', intType); | 
|  646   checkReturn('testIsCheck16', typesTask.dynamicType); |  647     checkReturn('testIsCheck16', typesTask.dynamicType); | 
|  647   checkReturn('testIsCheck17', intType); |  648     checkReturn('testIsCheck17', intType); | 
|  648   checkReturn('testIsCheck18', typesTask.dynamicType); |  649     checkReturn('testIsCheck18', typesTask.dynamicType); | 
|  649   checkReturn('testIsCheck19', typesTask.dynamicType); |  650     checkReturn('testIsCheck19', typesTask.dynamicType); | 
|  650   checkReturn('testIsCheck20', typesTask.dynamicType.nonNullable()); |  651     checkReturn('testIsCheck20', typesTask.dynamicType.nonNullable()); | 
|  651   checkReturn('testIf1', typesTask.intType.nullable()); |  652     checkReturn('testIf1', typesTask.intType.nullable()); | 
|  652   checkReturn('testIf2', typesTask.intType.nullable()); |  653     checkReturn('testIf2', typesTask.intType.nullable()); | 
|  653   checkReturn('returnAsString', |  654     checkReturn('returnAsString', | 
|  654       new TypeMask.subtype(compiler.stringClass.computeType(compiler))); |  655         new TypeMask.subtype(compiler.stringClass.computeType(compiler))); | 
|  655   checkReturn('returnIntAsNum', typesTask.intType); |  656     checkReturn('returnIntAsNum', typesTask.intType); | 
|  656   checkReturn('returnAsTypedef', typesTask.functionType.nullable()); |  657     checkReturn('returnAsTypedef', typesTask.functionType.nullable()); | 
|  657   checkReturn('returnTopLevelGetter', typesTask.intType); |  658     checkReturn('returnTopLevelGetter', typesTask.intType); | 
|  658   checkReturn('testDeadCode', typesTask.intType); |  659     checkReturn('testDeadCode', typesTask.intType); | 
|  659   checkReturn('testLabeledIf', typesTask.intType.nullable()); |  660     checkReturn('testLabeledIf', typesTask.intType.nullable()); | 
|  660   checkReturn('testSwitch1', typesTask.intType |  661     checkReturn('testSwitch1', typesTask.intType | 
|  661       .union(typesTask.doubleType, compiler).nullable().simplify(compiler)); |  662         .union(typesTask.doubleType, compiler) | 
|  662   checkReturn('testSwitch2', typesTask.intType); |  663         .nullable().simplify(compiler)); | 
|  663   checkReturn('testSwitch3', interceptorType.nullable()); |  664     checkReturn('testSwitch2', typesTask.intType); | 
|  664   checkReturn('testSwitch4', typesTask.intType); |  665     checkReturn('testSwitch3', interceptorType.nullable()); | 
|  665   checkReturn('testSwitch5', typesTask.intType); |  666     checkReturn('testSwitch4', typesTask.intType); | 
|  666   checkReturn('testContinue1', interceptorType.nullable()); |  667     checkReturn('testSwitch5', typesTask.intType); | 
|  667   checkReturn('testBreak1', interceptorType.nullable()); |  668     checkReturn('testContinue1', interceptorType.nullable()); | 
|  668   checkReturn('testContinue2', interceptorType.nullable()); |  669     checkReturn('testBreak1', interceptorType.nullable()); | 
|  669   checkReturn('testBreak2', typesTask.intType.nullable()); |  670     checkReturn('testContinue2', interceptorType.nullable()); | 
|  670   checkReturn('testReturnElementOfConstList1', typesTask.intType); |  671     checkReturn('testBreak2', typesTask.intType.nullable()); | 
|  671   checkReturn('testReturnElementOfConstList2', typesTask.intType); |  672     checkReturn('testReturnElementOfConstList1', typesTask.intType); | 
|  672   checkReturn('testReturnItselfOrInt', typesTask.intType); |  673     checkReturn('testReturnElementOfConstList2', typesTask.intType); | 
|  673   checkReturn('testReturnInvokeDynamicGetter', typesTask.dynamicType); |  674     checkReturn('testReturnItselfOrInt', typesTask.intType); | 
 |  675     checkReturn('testReturnInvokeDynamicGetter', typesTask.dynamicType); | 
|  674  |  676  | 
|  675   checkReturn('testDoWhile1', typesTask.stringType); |  677     checkReturn('testDoWhile1', typesTask.stringType); | 
|  676   checkReturn('testDoWhile2', typesTask.nullType); |  678     checkReturn('testDoWhile2', typesTask.nullType); | 
|  677   checkReturn('testDoWhile3', interceptorType); |  679     checkReturn('testDoWhile3', interceptorType); | 
|  678   checkReturn('testDoWhile4', typesTask.numType); |  680     checkReturn('testDoWhile4', typesTask.numType); | 
|  679  |  681  | 
|  680   checkReturnInClass(String className, String methodName, type) { |  682     checkReturnInClass(String className, String methodName, type) { | 
|  681     var cls = findElement(compiler, className); |  683       var cls = findElement(compiler, className); | 
|  682     var element = cls.lookupLocalMember(buildSourceString(methodName)); |  684       var element = cls.lookupLocalMember(buildSourceString(methodName)); | 
|  683     Expect.equals(type, |  685       Expect.equals(type, | 
|  684         typesInferrer.getReturnTypeOfElement(element).simplify(compiler)); |  686           typesInferrer.getReturnTypeOfElement(element).simplify(compiler)); | 
|  685   } |  687     } | 
|  686  |  688  | 
|  687   checkReturnInClass('A', 'returnInt1', typesTask.intType); |  689     checkReturnInClass('A', 'returnInt1', typesTask.intType); | 
|  688   checkReturnInClass('A', 'returnInt2', typesTask.intType); |  690     checkReturnInClass('A', 'returnInt2', typesTask.intType); | 
|  689   checkReturnInClass('A', 'returnInt3', typesTask.intType); |  691     checkReturnInClass('A', 'returnInt3', typesTask.intType); | 
|  690   checkReturnInClass('A', 'returnInt4', typesTask.intType); |  692     checkReturnInClass('A', 'returnInt4', typesTask.intType); | 
|  691   checkReturnInClass('A', 'returnInt5', typesTask.intType); |  693     checkReturnInClass('A', 'returnInt5', typesTask.intType); | 
|  692   checkReturnInClass('A', 'returnInt6', typesTask.intType); |  694     checkReturnInClass('A', 'returnInt6', typesTask.intType); | 
|  693   checkReturnInClass('A', '==', interceptorType); |  695     checkReturnInClass('A', '==', interceptorType); | 
|  694  |  696  | 
|  695   checkReturnInClass('B', 'returnInt1', typesTask.intType); |  697     checkReturnInClass('B', 'returnInt1', typesTask.intType); | 
|  696   checkReturnInClass('B', 'returnInt2', typesTask.intType); |  698     checkReturnInClass('B', 'returnInt2', typesTask.intType); | 
|  697   checkReturnInClass('B', 'returnInt3', typesTask.intType); |  699     checkReturnInClass('B', 'returnInt3', typesTask.intType); | 
|  698   checkReturnInClass('B', 'returnInt4', typesTask.intType); |  700     checkReturnInClass('B', 'returnInt4', typesTask.intType); | 
|  699   checkReturnInClass('B', 'returnInt5', typesTask.intType); |  701     checkReturnInClass('B', 'returnInt5', typesTask.intType); | 
|  700   checkReturnInClass('B', 'returnInt6', typesTask.intType); |  702     checkReturnInClass('B', 'returnInt6', typesTask.intType); | 
|  701   checkReturnInClass('B', 'returnInt7', typesTask.intType); |  703     checkReturnInClass('B', 'returnInt7', typesTask.intType); | 
|  702   checkReturnInClass('B', 'returnInt8', typesTask.intType); |  704     checkReturnInClass('B', 'returnInt8', typesTask.intType); | 
|  703   checkReturnInClass('B', 'returnInt9', typesTask.intType); |  705     checkReturnInClass('B', 'returnInt9', typesTask.intType); | 
|  704  |  706  | 
|  705   checkFactoryConstructor(String className, String factoryName) { |  707     checkFactoryConstructor(String className, String factoryName) { | 
|  706     var cls = findElement(compiler, className); |  708       var cls = findElement(compiler, className); | 
|  707     var element = cls.localLookup(buildSourceString(factoryName)); |  709       var element = cls.localLookup(buildSourceString(factoryName)); | 
|  708     Expect.equals(new TypeMask.nonNullExact(cls.rawType), |  710       Expect.equals(new TypeMask.nonNullExact(cls.rawType), | 
|  709                   typesInferrer.getReturnTypeOfElement(element)); |  711                     typesInferrer.getReturnTypeOfElement(element)); | 
|  710   } |  712     } | 
|  711   checkFactoryConstructor('A', ''); |  713     checkFactoryConstructor('A', ''); | 
|  712  |  714  | 
|  713   checkReturn('testCascade1', typesTask.growableListType); |  715     checkReturn('testCascade1', typesTask.growableListType); | 
|  714   checkReturn('testCascade2', new TypeMask.nonNullExact( |  716     checkReturn('testCascade2', new TypeMask.nonNullExact( | 
|  715       typesTask.rawTypeOf(findElement(compiler, 'CascadeHelper')))); |  717         typesTask.rawTypeOf(findElement(compiler, 'CascadeHelper')))); | 
|  716   checkReturn('testSpecialization1', typesTask.numType); |  718     checkReturn('testSpecialization1', typesTask.numType); | 
|  717   checkReturn('testSpecialization2', typesTask.dynamicType); |  719     checkReturn('testSpecialization2', typesTask.dynamicType); | 
|  718   checkReturn('testSpecialization3', typesTask.intType.nullable()); |  720     checkReturn('testSpecialization3', typesTask.intType.nullable()); | 
 |  721   })); | 
|  719 } |  722 } | 
| OLD | NEW |