| // Copyright (c) 2020, 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.missingclasses; |
| |
| import com.android.tools.r8.CompilationFailedException; |
| import com.android.tools.r8.NeverInline; |
| import com.android.tools.r8.TestParameters; |
| import com.android.tools.r8.diagnostic.DefinitionContext; |
| import com.android.tools.r8.diagnostic.internal.DefinitionMethodContextImpl; |
| import com.android.tools.r8.origin.Origin; |
| import com.android.tools.r8.references.Reference; |
| import com.android.tools.r8.utils.DescriptorUtils; |
| import com.google.common.collect.ImmutableList; |
| import org.junit.Test; |
| |
| public class MissingClassReferencedFromThrowsClauseWithNoShrinkingTest |
| extends MissingClassesTestBase { |
| |
| private static final String NEW_A_DESCRIPTOR = "Lfoo/a;"; |
| private static final String NEW_B_DESCRIPTOR = "Lfoo/b;"; |
| |
| private static final DefinitionContext referencedFrom = |
| DefinitionMethodContextImpl.builder() |
| .setMethodContext( |
| Reference.method( |
| Reference.classFromDescriptor("Lfoo/a;"), "foo", ImmutableList.of(), null)) |
| .setOrigin(Origin.unknown()) |
| .build(); |
| |
| public MissingClassReferencedFromThrowsClauseWithNoShrinkingTest(TestParameters parameters) { |
| super(parameters); |
| } |
| |
| @Test(expected = CompilationFailedException.class) |
| public void testNoShrinking() throws Exception { |
| compileWithExpectedDiagnostics( |
| Main.class, |
| diagnostics -> inspectDiagnosticsWithNoRules(diagnostics, referencedFrom), |
| b -> { |
| b.addProgramClassFileData( |
| transformer(A.class) |
| .setClassDescriptor(NEW_A_DESCRIPTOR) |
| .removeInnerClasses() |
| .transform(), |
| transformer(B.class) |
| .setClassDescriptor(NEW_B_DESCRIPTOR) |
| .removeInnerClasses() |
| .replaceClassDescriptorInMethodInstructions(descriptor(A.class), NEW_A_DESCRIPTOR) |
| .transform()); |
| b.enableInliningAnnotations(); |
| b.addKeepClassAndMembersRules(DescriptorUtils.descriptorToJavaType(NEW_A_DESCRIPTOR)); |
| b.noTreeShaking(); |
| }); |
| } |
| |
| public static class Main { |
| |
| public static void main(String[] args) {} |
| } |
| |
| public static class /* will be: foo.A */ A { |
| |
| @NeverInline |
| public static void foo() throws MissingClass { |
| System.out.println("Hello World"); |
| } |
| } |
| |
| public static class /* will be: foo.B */ B { |
| |
| public static void callFoo() { |
| A.foo(); |
| } |
| } |
| } |