Index: tests/compiler/dart2js/kernel/impact_test.dart |
diff --git a/tests/compiler/dart2js/kernel/impact_test.dart b/tests/compiler/dart2js/kernel/impact_test.dart |
index 89753a86550d465b20e2903abccffce4ac7ce357..cc7f49ee092067081af46c3a5e6bd26f7c545faf 100644 |
--- a/tests/compiler/dart2js/kernel/impact_test.dart |
+++ b/tests/compiler/dart2js/kernel/impact_test.dart |
@@ -15,6 +15,7 @@ import 'package:compiler/src/elements/elements.dart'; |
import 'package:compiler/src/resolution/registry.dart'; |
import 'package:compiler/src/ssa/kernel_impact.dart'; |
import 'package:compiler/src/serialization/equivalence.dart'; |
+import 'package:compiler/src/universe/call_structure.dart'; |
import 'package:compiler/src/universe/feature.dart'; |
import 'package:compiler/src/universe/use.dart'; |
import 'package:expect/expect.dart'; |
@@ -62,6 +63,10 @@ main() { |
testIsNotGeneric(null); |
testIsNotGenericRaw(null); |
testIsNotGenericDynamic(null); |
+ testIsTypedef(null); |
+ testIsTypedefGeneric(null); |
+ testIsTypedefGenericRaw(null); |
+ testIsTypedefGenericDynamic(null); |
testAs(null); |
testAsGeneric(null); |
testAsGenericRaw(null); |
@@ -80,6 +85,8 @@ main() { |
testTryCatchOn(); |
testTryCatchStackTrace(); |
testTryFinally(); |
+ testSwitchWithoutFallthrough(null); |
+ testSwitchWithFallthrough(null); |
testTopLevelInvoke(); |
testTopLevelInvokeTyped(); |
testTopLevelFunctionTyped(); |
@@ -166,6 +173,10 @@ testIsNot(o) => o is! Class; |
testIsNotGeneric(o) => o is! GenericClass<int, String>; |
testIsNotGenericRaw(o) => o is! GenericClass; |
testIsNotGenericDynamic(o) => o is! GenericClass<dynamic, dynamic>; |
+testIsTypedef(o) => o is Typedef; |
+testIsTypedefGeneric(o) => o is GenericTypedef<int, String>; |
+testIsTypedefGenericRaw(o) => o is GenericTypedef; |
+testIsTypedefGenericDynamic(o) => o is GenericTypedef<dynamic, dynamic>; |
testAs(o) => o as Class; |
testAsGeneric(o) => o as GenericClass<int, String>; |
testAsGenericRaw(o) => o as GenericClass; |
@@ -210,6 +221,31 @@ testTryCatchStackTrace() { |
testTryFinally() { |
try {} finally {} |
} |
+testSwitchWithoutFallthrough(o) { |
+ switch (o) { |
+ case 0: |
+ case 1: |
+ o = 2; |
+ break; |
+ case 2: |
+ o = 3; |
+ return; |
+ case 3: |
+ default: |
+ } |
+} |
+testSwitchWithFallthrough(o) { |
+ switch (o) { |
+ case 0: |
+ case 1: |
+ o = 2; |
+ case 2: |
+ o = 3; |
+ return; |
+ case 3: |
+ default: |
+ } |
+} |
topLevelFunction1(a) {} |
topLevelFunction2(a, [b, c]) {} |
topLevelFunction3(a, {b, c}) {} |
@@ -376,6 +412,8 @@ class GenericClass<X, Y> { |
factory GenericClass.fact() => null; |
factory GenericClass.redirect() = GenericClass.generative; |
} |
+typedef Typedef(); |
+typedef X GenericTypedef<X, Y>(Y y); |
''', |
}; |
@@ -411,7 +449,7 @@ void checkLibrary(Compiler compiler, LibraryElement library) { |
void checkElement(Compiler compiler, AstElement element) { |
ResolutionImpact astImpact = compiler.resolution.getResolutionImpact(element); |
- astImpact = laxImpact(element, astImpact); |
+ astImpact = laxImpact(compiler, element, astImpact); |
ResolutionImpact kernelImpact = build(compiler, element.resolvedAst); |
Expect.isNotNull(kernelImpact, 'No impact computed for $element'); |
testResolutionImpactEquivalence( |
@@ -420,18 +458,23 @@ void checkElement(Compiler compiler, AstElement element) { |
/// Lax the precision of [impact] to meet expectancy of the corresponding impact |
/// generated from kernel. |
-ResolutionImpact laxImpact(AstElement element, ResolutionImpact impact) { |
+ResolutionImpact laxImpact( |
+ Compiler compiler, AstElement element, ResolutionImpact impact) { |
ResolutionWorldImpactBuilder builder = |
new ResolutionWorldImpactBuilder('Lax impact of ${element}'); |
impact.staticUses.forEach(builder.registerStaticUse); |
impact.dynamicUses.forEach(builder.registerDynamicUse); |
- impact.typeUses.forEach(builder.registerTypeUse); |
+ for (TypeUse typeUse in impact.typeUses) { |
+ if (typeUse.type.isTypedef) { |
+ typeUse = new TypeUse.internal(typeUse.type.unaliased, typeUse.kind); |
+ } |
+ builder.registerTypeUse(typeUse); |
+ } |
impact.constantLiterals.forEach(builder.registerConstantLiteral); |
impact.constSymbolNames.forEach(builder.registerConstSymbolName); |
impact.listLiterals.forEach(builder.registerListLiteral); |
impact.mapLiterals.forEach(builder.registerMapLiteral); |
for (Feature feature in impact.features) { |
- builder.registerFeature(feature); |
switch (feature) { |
case Feature.STRING_INTERPOLATION: |
case Feature.STRING_JUXTAPOSITION: |
@@ -440,7 +483,20 @@ ResolutionImpact laxImpact(AstElement element, ResolutionImpact impact) { |
builder.registerFeature(Feature.STRING_INTERPOLATION); |
builder.registerFeature(Feature.STRING_JUXTAPOSITION); |
break; |
+ case Feature.FALL_THROUGH_ERROR: |
+ LibraryElement library = |
+ compiler.libraryLoader.lookupLibrary(Uris.dart_core); |
+ ClassElement cls = |
+ library.implementation.localLookup('FallThroughError'); |
+ ConstructorElement constructor = cls.lookupConstructor(''); |
+ builder.registerTypeUse(new TypeUse.instantiation(cls.thisType)); |
+ builder.registerStaticUse(new StaticUse.constructorInvoke( |
+ constructor, CallStructure.NO_ARGS)); |
+ builder.registerFeature(Feature.THROW_EXPRESSION); |
+ break; |
default: |
+ builder.registerFeature(feature); |
+ break; |
} |
} |
impact.nativeData.forEach(builder.registerNativeData); |