| // 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(); | |
| } | |
| } | |
| } |