blob: aafeadf302dac05b04fd68321cabedab6085eef3 [file] [log] [blame]
// 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.graph.genericsignature;
import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static com.google.common.base.Predicates.alwaysFalse;
import static com.google.common.base.Predicates.alwaysTrue;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestDiagnosticMessagesImpl;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.GenericSignature;
import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
import com.android.tools.r8.graph.GenericSignaturePrinter;
import com.android.tools.r8.graph.GenericSignatureTypeRewriter;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.Reporter;
import java.util.function.Function;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class FieldSignatureTest extends TestBase {
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withNoneRuntime().build();
}
public FieldSignatureTest(TestParameters parameters) {
parameters.assertNoneRuntime();
}
@Test
public void testClass() {
testParsingAndPrintingEqual("Lfoo/bar/baz;");
}
@Test
public void testMissingSemicolon() {
testParsingAndPrintingError("Lfoo/bar/baz")
.assertAllErrorsMatch(
diagnosticMessage(containsString("Invalid signature 'Lfoo/bar/baz;' for field A.")));
}
@Test
public void testClassWithEmptyTypeArguments() {
testParsingAndPrintingError("Lfoo/bar/baz<>;")
.assertAllErrorsMatch(
diagnosticMessage(containsString("Invalid signature 'Lfoo/bar/baz;' for field A.")));
}
@Test
public void testClassWithTypeVariableArguments() {
testParsingAndPrintingEqual("Lfoo/bar/baz<TT;>;");
}
@Test
public void testTypeVariable() {
testParsingAndPrintingEqual("TT;");
}
@Test
public void testPrimitive() {
testParsingAndPrintingError("I")
.assertAllErrorsMatch(
diagnosticMessage(containsString("Invalid signature 'I' for field A.")));
}
@Test
public void testArray() {
testParsingAndPrintingEqual("[I");
testParsingAndPrintingEqual("[Lfoo/bar/baz;");
}
@Test
public void testArrayWithGeneric() {
testParsingAndPrintingEqual("[Lfoo/bar/baz<[I+Lfoo/Qux<*>.Inner<-Lfoo/Quux<TT;>;>;>;");
}
private void testParsingAndPrintingEqual(String signature) {
FieldTypeSignature parsed =
GenericSignature.parseFieldTypeSignature(
"A", signature, Origin.unknown(), new DexItemFactory(), new Reporter());
GenericSignaturePrinter genericSignaturePrinter =
new GenericSignaturePrinter(NamingLens.getIdentityLens(), alwaysFalse());
genericSignaturePrinter.visitFieldTypeSignature(parsed);
String outSignature = genericSignaturePrinter.toString();
assertEquals(signature, outSignature);
}
private TestDiagnosticMessages testParsingAndPrintingError(String signature) {
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
FieldTypeSignature parsed =
GenericSignature.parseFieldTypeSignature(
"A",
signature,
Origin.unknown(),
new DexItemFactory(),
new Reporter(testDiagnosticMessages));
assertEquals(FieldTypeSignature.noSignature(), parsed);
return testDiagnosticMessages;
}
@Test
public void testPruningNullTest() {
DexItemFactory factory = new DexItemFactory();
FieldTypeSignature parsed =
GenericSignature.parseFieldTypeSignature(
"A", "Lfoo/bar/Baz;", Origin.unknown(), factory, new Reporter());
assertTrue(parsed.hasSignature());
GenericSignatureTypeRewriter rewriter =
new GenericSignatureTypeRewriter(
factory, alwaysTrue(), Function.identity(), null, alwaysTrue());
FieldTypeSignature rewrittenType = rewriter.rewrite(parsed);
assertNotNull(rewrittenType);
assertTrue(rewrittenType.hasNoSignature());
}
}