Don't allow inlining between different features (and base)

Bug: 122902374
Change-Id: Ief95f81d5210a5db2d1b358365f02898f9e19d36
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java b/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java
index 8e779f4..b7f6158 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitConfiguration.java
@@ -68,7 +68,7 @@
     if (javaTypeToFeatureSplitMapping.isEmpty()) {
       return true;
     }
-    // TODO(ricow): Consider caching the descriptor string.
+    // TODO(141451259): Consider doing the mapping from DexType to Feature (with support in mapper)
     return javaTypeToFeatureSplitMapping.get(
             DescriptorUtils.descriptorToJavaType(a.toDescriptorString()))
         == javaTypeToFeatureSplitMapping.get(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 0c4e409..9d2c5ad 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -213,6 +213,12 @@
     }
 
     InternalOptions options = appView.options();
+    if (options.featureSplitConfiguration != null
+        && !options.featureSplitConfiguration.inSameFeatureOrBase(
+            candidate.method, method.method)) {
+      return false;
+    }
+
     if (options.testing.validInliningReasons != null
         && !options.testing.validInliningReasons.contains(reason)) {
       return false;
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
index cd9ad87..14d1e63 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.dexsplitter;
 
+import static junit.framework.TestCase.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
@@ -85,9 +86,9 @@
             EXPECTED,
             a -> true,
             configurator);
-    // TODO(122902374): This should not fail, but currently we are just on par with DexSplitter.
-    assertNotEquals(processResult.exitCode, 0);
-    assertTrue(processResult.stderr.contains("NoClassDefFoundError"));
+
+    assertEquals(processResult.exitCode, 0);
+    assertEquals(processResult.stdout, StringUtils.lines("42"));
   }
 
   @NeverMerge
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
index b56827b..9d8c12b 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
@@ -2,6 +2,7 @@
 
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.ArchiveProgramResourceProvider;
 import com.android.tools.r8.ByteDataView;
@@ -205,7 +206,7 @@
   protected ProcessResult runFeatureOnArt(
       Class toRun, Path splitterBaseDexFile, Path splitterFeatureDexFile, TestRuntime runtime)
       throws IOException {
-    assertTrue(runtime.isDex());
+    assumeTrue(runtime.isDex());
     ArtCommandBuilder commandBuilder = new ArtCommandBuilder(runtime.asDex().getVm());
     commandBuilder.appendClasspath(splitterBaseDexFile.toString());
     commandBuilder.appendProgramArgument(toRun.getName());