| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.ir.optimize; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.dex.ApplicationReader; |
| import com.android.tools.r8.graph.AppInfoWithSubtyping; |
| import com.android.tools.r8.graph.AppView; |
| import com.android.tools.r8.graph.DexApplication; |
| import com.android.tools.r8.graph.DexItemFactory; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.ir.optimize.Inliner.Constraint; |
| import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; |
| import com.android.tools.r8.utils.AndroidApp; |
| import com.android.tools.r8.utils.InternalOptions; |
| import com.android.tools.r8.utils.Timing; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| public class ConstraintWithTargetTest { |
| private static DexItemFactory factory; |
| private static AppView<AppInfoWithSubtyping> appView; |
| |
| @BeforeClass |
| public static void makeAppInfo() throws Exception { |
| InternalOptions options = new InternalOptions(); |
| DexApplication application = |
| new ApplicationReader( |
| AndroidApp.builder() |
| .addLibraryFiles(ToolHelper.getDefaultAndroidJar()) |
| .build(), |
| options, |
| new Timing(ConstraintWithTargetTest.class.getName())) |
| .read() |
| .toDirect(); |
| factory = options.itemFactory; |
| appView = AppView.createForR8(new AppInfoWithSubtyping(application), options); |
| } |
| |
| private ConstraintWithTarget never() { |
| return ConstraintWithTarget.NEVER; |
| } |
| |
| private ConstraintWithTarget always() { |
| return ConstraintWithTarget.ALWAYS; |
| } |
| |
| private ConstraintWithTarget element(Constraint constraint, DexType type) { |
| return new ConstraintWithTarget(constraint, type); |
| } |
| |
| private ConstraintWithTarget meet(ConstraintWithTarget e1, ConstraintWithTarget e2) { |
| return ConstraintWithTarget.meet(e1, e2, appView); |
| } |
| |
| @Test |
| public void meetNeverIsNever() { |
| assertEquals(never(), |
| meet(never(), always())); |
| assertEquals(never(), |
| meet(always(), never())); |
| assertEquals(never(), |
| meet(never(), element(Constraint.SAMECLASS, factory.objectType))); |
| } |
| |
| @Test |
| public void meetAlwaysIsUnit() { |
| ConstraintWithTarget o = element(Constraint.SUBCLASS, factory.objectType); |
| assertEquals(o, |
| meet(always(), o)); |
| assertEquals(o, |
| meet(o, always())); |
| } |
| |
| @Test |
| public void withSameTarget() { |
| DexType s = factory.createType("Ljava/lang/String;"); |
| ConstraintWithTarget c0 = element(Constraint.SAMECLASS, s); |
| ConstraintWithTarget c1 = element(Constraint.PACKAGE, s); |
| ConstraintWithTarget c2 = element(Constraint.SUBCLASS, s); |
| assertEquals(c0, |
| meet(c1, c0)); |
| assertEquals(c0, |
| meet(c0, c2)); |
| assertEquals(c1, |
| meet(c2, c1)); |
| } |
| |
| @Test |
| public void withDifferentTarget() { |
| DexType s = factory.createType("Ljava/lang/String;"); |
| DexType b = factory.createType("Ljava/lang/StringBuilder;"); |
| ConstraintWithTarget c1 = element(Constraint.SAMECLASS, s); |
| ConstraintWithTarget c2 = element(Constraint.SAMECLASS, b); |
| assertEquals(never(), |
| meet(c1, c2)); |
| |
| ConstraintWithTarget c0 = element(Constraint.PACKAGE, factory.objectType); |
| assertEquals(c1, |
| meet(c0, c1)); |
| assertEquals(c2, |
| meet(c0, c2)); |
| |
| c0 = element(Constraint.SUBCLASS, factory.objectType); |
| assertEquals(c1, |
| meet(c0, c1)); |
| assertEquals(c2, |
| meet(c0, c2)); |
| |
| c1 = element(Constraint.PACKAGE, s); |
| c2 = element(Constraint.PACKAGE, b); |
| assertEquals(c1, |
| meet(c0, c1)); |
| assertEquals(c2, |
| meet(c0, c2)); |
| assertEquals(c1, |
| meet(c1, c2)); |
| assertEquals(c2, |
| meet(c2, c1)); |
| |
| DexType t = factory.createType("Ljava/lang/reflect/Type;"); |
| DexType c = factory.createType("Ljava/lang/Class;"); |
| c1 = element(Constraint.SUBCLASS, t); |
| c2 = element(Constraint.SUBCLASS, c); |
| assertEquals(c2, |
| meet(c1, c2)); |
| assertEquals(c2, |
| meet(c2, c1)); |
| } |
| |
| |
| @Test |
| public void b111080693() { |
| ConstraintWithTarget c1 = |
| element(Constraint.SUBCLASS, factory.createType("Ljava/lang/Class;")); |
| ConstraintWithTarget c2 = |
| element(Constraint.PACKAGE, factory.createType("Ljava/lang/reflect/Type;")); |
| assertEquals(never(), |
| meet(c1, c2)); |
| } |
| |
| } |