Merge "R8 Kotlin tests: also check symbols in input"
diff --git a/src/main/java/com/android/tools/r8/naming/MemberNaming.java b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
index 2c85270..c766c37 100644
--- a/src/main/java/com/android/tools/r8/naming/MemberNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
@@ -299,5 +299,16 @@
}
writer.append(')');
}
+
+ public String toDescriptor() {
+ StringBuilder sb = new StringBuilder();
+ sb.append('(');
+ for (String parameterType : parameters) {
+ sb.append(javaTypeToDescriptor(parameterType));
+ }
+ sb.append(')');
+ sb.append(javaTypeToDescriptor(type));
+ return sb.toString();
+ }
}
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index bb83093..c175e04 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -49,6 +49,12 @@
// invoke the tested method.
private static final String JASMIN_MAIN_CLASS = "TestMain";
+ @Parameter(0) public boolean allowAccessModification;
+ @Parameter(1) public KotlinTargetVersion targetVersion;
+
+ private final List<Path> classpath = new ArrayList<>();
+ private final List<Path> extraClasspath = new ArrayList<>();
+
@Parameters(name = "allowAccessModification: {0} target: {1}")
public static Collection<Object[]> data() {
ImmutableList.Builder<Object[]> builder = new ImmutableList.Builder<>();
@@ -59,11 +65,6 @@
return builder.build();
}
- @Parameter(0) public boolean allowAccessModification;
- @Parameter(1) public KotlinTargetVersion targetVersion;
-
- private final List<Path> extraClasspath = new ArrayList<>();
-
protected void addExtraClasspath(Path path) {
extraClasspath.add(path);
}
@@ -111,47 +112,67 @@
}));
}
- protected static ClassSubject checkClassExists(DexInspector inspector, String className) {
+ protected ClassSubject checkClassIsKept(DexInspector inspector, String className) {
+ checkClassExistsInInput(className);
ClassSubject classSubject = inspector.clazz(className);
assertNotNull(classSubject);
assertTrue("No class " + className, classSubject.isPresent());
return classSubject;
}
- protected static FieldSubject checkFieldIsPresent(ClassSubject classSubject, String fieldType,
+ protected FieldSubject checkFieldIsKept(ClassSubject classSubject, String fieldType,
String fieldName) {
+ // Field must exist in the input.
+ checkFieldPresenceInInput(classSubject.getOriginalName(), fieldType, fieldName, true);
FieldSubject fieldSubject = classSubject.field(fieldType, fieldName);
assertTrue("No field " + fieldName + " in " + classSubject.getOriginalName(),
fieldSubject.isPresent());
return fieldSubject;
}
- protected static void checkFieldIsAbsent(ClassSubject classSubject, String fieldType,
+ protected void checkFieldIsAbsent(ClassSubject classSubject, String fieldType,
String fieldName) {
+ // Field must NOT exist in the input.
+ checkFieldPresenceInInput(classSubject.getOriginalName(), fieldType, fieldName, false);
FieldSubject fieldSubject = classSubject.field(fieldType, fieldName);
assertNotNull(fieldSubject);
assertFalse(fieldSubject.isPresent());
}
- protected static MethodSubject checkMethodIsPresent(ClassSubject classSubject,
+ protected void checkMethodIsAbsent(ClassSubject classSubject,
MethodSignature methodSignature) {
- return checkMethod(classSubject, methodSignature, true);
+ checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, false);
+ checkMethodPresenceInOutput(classSubject, methodSignature, false);
}
- protected static void checkMethodIsAbsent(ClassSubject classSubject,
+ protected MethodSubject checkMethodIsKept(ClassSubject classSubject,
MethodSignature methodSignature) {
- checkMethod(classSubject, methodSignature, false);
+ checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, true);
+ return checkMethodisKeptOrRemoved(classSubject, methodSignature, true);
}
- protected static MethodSubject checkMethod(ClassSubject classSubject,
+ protected void checkMethodIsRemoved(ClassSubject classSubject,
+ MethodSignature methodSignature) {
+ checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, true);
+ checkMethodisKeptOrRemoved(classSubject, methodSignature, false);
+ }
+
+ protected MethodSubject checkMethodisKeptOrRemoved(ClassSubject classSubject,
+ MethodSignature methodSignature, boolean isPresent) {
+ checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, true);
+ return checkMethodPresenceInOutput(classSubject, methodSignature, isPresent);
+ }
+
+ private MethodSubject checkMethodPresenceInOutput(ClassSubject classSubject,
MethodSignature methodSignature, boolean isPresent) {
MethodSubject methodSubject = classSubject.method(methodSignature);
assertNotNull(methodSubject);
+ String methodSig = methodSignature.name + methodSignature.toDescriptor();
if (isPresent) {
- assertTrue("No method " + methodSignature.name, methodSubject.isPresent());
+ assertTrue("No method " + methodSig + " in output", methodSubject.isPresent());
} else {
- assertFalse("Method " + methodSignature.name + " exists", methodSubject.isPresent());
+ assertFalse("Method " + methodSig + " exists in output", methodSubject.isPresent());
}
return methodSubject;
}
@@ -210,7 +231,7 @@
}
// Build classpath for compilation (and java execution)
- List<Path> classpath = new ArrayList<>(extraClasspath.size() + 1);
+ assert classpath.isEmpty();
classpath.add(getKotlinJarFile(folder));
classpath.add(getJavaJarFile(folder));
classpath.addAll(extraClasspath);
@@ -240,6 +261,36 @@
inspector.inspectApp(app);
}
+ protected void checkClassExistsInInput(String className) {
+ if (!AsmUtils.doesClassExist(classpath, className)) {
+ throw new AssertionError("Class " + className + " does not exist in input");
+ }
+ }
+
+ private void checkMethodPresenceInInput(String className, MethodSignature methodSignature,
+ boolean isPresent) {
+ boolean foundMethod = AsmUtils.doesMethodExist(classpath, className,
+ methodSignature.name, methodSignature.toDescriptor());
+ if (isPresent != foundMethod) {
+ throw new AssertionError(
+ "Method " + methodSignature.name + methodSignature.toDescriptor()
+ + " " + (foundMethod ? "exists" : "does not exist")
+ + " in input class " + className + " but is expected to be "
+ + (isPresent ? "present" : "absent"));
+ }
+ }
+
+ private void checkFieldPresenceInInput(String className, String fieldType, String fieldName,
+ boolean isPresent) {
+ boolean foundField = AsmUtils.doesFieldExist(classpath, className, fieldName, fieldType);
+ if (isPresent != foundField) {
+ throw new AssertionError(
+ "Field " + fieldName + " " + (foundField ? "exists" : "does not exist")
+ + " in input class " + className + " but is expected to be "
+ + (isPresent ? "present" : "absent"));
+ }
+ }
+
private Path getKotlinJarFile(String folder) {
return Paths.get(ToolHelper.TESTS_BUILD_DIR, "kotlinR8TestResources",
targetVersion.getFolderName(), folder + FileUtils.JAR_EXTENSION);
diff --git a/src/test/java/com/android/tools/r8/kotlin/AsmUtils.java b/src/test/java/com/android/tools/r8/kotlin/AsmUtils.java
new file mode 100644
index 0000000..7b7abcb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/AsmUtils.java
@@ -0,0 +1,144 @@
+// 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.kotlin;
+
+import com.android.tools.r8.utils.DescriptorUtils;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * Utilities to lookup symbols in a classpath using ASM.
+ */
+public final class AsmUtils {
+
+ private AsmUtils() {
+ }
+
+ public static boolean doesClassExist(List<Path> classpath, String className) {
+ byte[] classData = loadClassBytesFromClasspath(classpath, className);
+ return classData != null;
+ }
+
+ public static boolean doesMethodExist(List<Path> classpath, String className,
+ String methodName,
+ String methodDescriptor) {
+ MethodFinder classVisitor = new MethodFinder(methodName, methodDescriptor);
+ visitClass(classpath, className, classVisitor);
+ return classVisitor.foundMethod;
+ }
+
+ private static final class MethodFinder extends ClassVisitor {
+
+ private final String methodName;
+ private final String methodDescriptor;
+ public boolean foundMethod = false;
+
+ public MethodFinder(String methodName, String methodDescriptor) {
+ super(Opcodes.ASM6);
+ this.methodName = methodName;
+ this.methodDescriptor = methodDescriptor;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature,
+ String[] exceptions) {
+ if (name.equals(methodName) && desc.equals(methodDescriptor)) {
+ assert !foundMethod;
+ foundMethod = true;
+ }
+ return null;
+ }
+ }
+
+ public static boolean doesFieldExist(List<Path> classpath, String className,
+ String fieldName,
+ String fieldType) {
+ FieldFinder classVisitor = new FieldFinder(fieldName, fieldType);
+ visitClass(classpath, className, classVisitor);
+ return classVisitor.foundField;
+ }
+
+ private static final class FieldFinder extends ClassVisitor {
+
+ private final String fieldName;
+ private final String fieldDescriptor;
+ public boolean foundField = false;
+
+ public FieldFinder(String fieldName, String fieldType) {
+ super(Opcodes.ASM6);
+ this.fieldName = fieldName;
+ this.fieldDescriptor = DescriptorUtils.javaTypeToDescriptor(fieldType);
+ }
+
+ @Override
+ public FieldVisitor visitField(int access, String name, String desc, String signature,
+ Object value) {
+ if (name.equals(fieldName) && desc.equals(fieldDescriptor)) {
+ assert !foundField;
+ foundField = true;
+ }
+ return null;
+ }
+ }
+
+ private static void visitClass(List<Path> classpath, String className,
+ ClassVisitor classVisitor) {
+ byte[] classData = loadClassBytesFromClasspath(classpath, className);
+ new ClassReader(classData).accept(classVisitor,
+ ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+ }
+
+ private static byte[] loadClassBytesFromClasspath(List<Path> classpath, String className) {
+ String classFilename = DescriptorUtils.getPathFromJavaType(className);
+ for (Path path : classpath) {
+ if (path.toFile().getPath().endsWith(".jar")) {
+ try (JarInputStream jarInputStream = new JarInputStream(Files.newInputStream(path))) {
+ JarEntry jarEntry;
+ while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
+ if (jarEntry.isDirectory()) {
+ continue;
+ }
+ String entryName = jarEntry.getName();
+ if (entryName.equals(classFilename)) {
+ byte[] data = new byte[1024];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ while (true) {
+ int bytesRead = jarInputStream.read(data, 0, data.length);
+ if (bytesRead < 0) {
+ break;
+ }
+ baos.write(data, 0, bytesRead);
+ }
+ return baos.toByteArray();
+ }
+ }
+ } catch (IOException e) {
+ throw new AssertionError(e);
+ }
+ } else if (path.toFile().getPath().endsWith(".class")) {
+ if (path.toFile().getPath().equals(classFilename)) {
+ try {
+ return Files.readAllBytes(path);
+ } catch (IOException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index df04931..7425082 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -66,9 +66,9 @@
"companionProperties_usePrimitiveProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "primitiveProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, "int", propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getterAccessor = testedClass
@@ -78,12 +78,12 @@
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(outerClass, getterAccessor);
- checkMethodIsAbsent(outerClass, setterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(outerClass, getterAccessor);
- checkMethodIsPresent(outerClass, setterAccessor);
+ checkMethodIsKept(outerClass, getterAccessor);
+ checkMethodIsKept(outerClass, setterAccessor);
}
});
}
@@ -95,9 +95,9 @@
"companionProperties_usePrivateProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getterAccessor = testedClass
@@ -107,13 +107,13 @@
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(outerClass, getterAccessor);
- checkMethodIsAbsent(outerClass, setterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(outerClass, getterAccessor);
- checkMethodIsPresent(outerClass, setterAccessor);
+ checkMethodIsKept(outerClass, getterAccessor);
+ checkMethodIsKept(outerClass, setterAccessor);
}
});
}
@@ -125,9 +125,9 @@
"companionProperties_useInternalProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "internalProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getterAccessor = testedClass
@@ -137,12 +137,12 @@
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(outerClass, getterAccessor);
- checkMethodIsAbsent(outerClass, setterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(outerClass, getterAccessor);
- checkMethodIsPresent(outerClass, setterAccessor);
+ checkMethodIsKept(outerClass, getterAccessor);
+ checkMethodIsKept(outerClass, setterAccessor);
}
});
}
@@ -154,9 +154,9 @@
"companionProperties_usePublicProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "publicProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getterAccessor = testedClass
@@ -166,12 +166,12 @@
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(outerClass, getterAccessor);
- checkMethodIsAbsent(outerClass, setterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(outerClass, getterAccessor);
- checkMethodIsPresent(outerClass, setterAccessor);
+ checkMethodIsKept(outerClass, getterAccessor);
+ checkMethodIsKept(outerClass, setterAccessor);
}
});
}
@@ -183,9 +183,9 @@
"companionLateInitProperties_usePrivateLateInitProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "privateLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getterAccessor = testedClass
@@ -194,12 +194,12 @@
.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(outerClass, getterAccessor);
- checkMethodIsAbsent(outerClass, setterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(outerClass, getterAccessor);
- checkMethodIsPresent(outerClass, setterAccessor);
+ checkMethodIsKept(outerClass, getterAccessor);
+ checkMethodIsKept(outerClass, setterAccessor);
}
});
}
@@ -211,10 +211,11 @@
"companionLateInitProperties_useInternalLateInitProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "internalLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
MemberNaming.MethodSignature getterAccessor = testedClass
.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
@@ -234,10 +235,11 @@
"companionLateInitProperties_usePublicLateInitProp");
runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
String propertyName = "publicLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
MemberNaming.MethodSignature getterAccessor = testedClass
.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
@@ -257,49 +259,50 @@
"accessor_accessPropertyFromCompanionClass");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
- ClassSubject companionClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+ ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "property";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
// The getter is always inlined since it just calls into the accessor.
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
- checkMethodIsAbsent(companionClass, getter);
+ checkMethodIsRemoved(companionClass, getter);
MemberNaming.MethodSignature getterAccessor =
testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(outerClass, getterAccessor);
+ checkMethodIsKept(outerClass, getterAccessor);
}
});
}
@Test
+ @Ignore("b/74103342")
public void testAccessorFromPrivate() throws Exception {
TestKotlinCompanionClass testedClass = ACCESSOR_COMPANION_PROPERTY_CLASS;
String mainClass = addMainToClasspath("accessors.AccessorKt",
"accessor_accessPropertyFromOuterClass");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
- ClassSubject companionClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+ ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "property";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
// We cannot inline the getter because we don't know if NPE is preserved.
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
- checkMethodIsPresent(companionClass, getter);
+ checkMethodIsKept(companionClass, getter);
// We should always inline the static accessor method.
MemberNaming.MethodSignature getterAccessor =
testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_INNER);
- checkMethodIsAbsent(outerClass, getterAccessor);
+ checkMethodIsRemoved(companionClass, getterAccessor);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
@@ -316,7 +319,7 @@
"noUseOfPropertyAccessorFromInnerClass");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
for (String propertyName : testedClass.properties.keySet()) {
MemberNaming.MethodSignature getterAccessor =
@@ -324,8 +327,8 @@
MemberNaming.MethodSignature setterAccessor =
testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_INNER);
- checkMethodIsAbsent(classSubject, getterAccessor);
- checkMethodIsAbsent(classSubject, setterAccessor);
+ checkMethodIsRemoved(classSubject, getterAccessor);
+ checkMethodIsRemoved(classSubject, setterAccessor);
}
});
}
@@ -338,10 +341,10 @@
"usePrivatePropertyAccessorFromInnerClass");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING,
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING,
propertyName);
assertFalse(fieldSubject.getField().accessFlags.isStatic());
@@ -351,12 +354,12 @@
testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_INNER);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getterAccessor);
- checkMethodIsAbsent(classSubject, setterAccessor);
+ checkMethodIsRemoved(classSubject, getterAccessor);
+ checkMethodIsRemoved(classSubject, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getterAccessor);
- checkMethodIsPresent(classSubject, setterAccessor);
+ checkMethodIsKept(classSubject, getterAccessor);
+ checkMethodIsKept(classSubject, setterAccessor);
}
});
}
@@ -369,10 +372,10 @@
"usePrivateLateInitPropertyAccessorFromInnerClass");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING,
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING,
propertyName);
assertFalse(fieldSubject.getField().accessFlags.isStatic());
@@ -382,12 +385,12 @@
testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_INNER);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getterAccessor);
- checkMethodIsAbsent(classSubject, setterAccessor);
+ checkMethodIsRemoved(classSubject, getterAccessor);
+ checkMethodIsRemoved(classSubject, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getterAccessor);
- checkMethodIsPresent(classSubject, setterAccessor);
+ checkMethodIsKept(classSubject, getterAccessor);
+ checkMethodIsKept(classSubject, setterAccessor);
}
});
}
@@ -400,7 +403,7 @@
"noUseOfPropertyAccessorFromLambda");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "property";
MemberNaming.MethodSignature getterAccessor =
@@ -408,8 +411,8 @@
MemberNaming.MethodSignature setterAccessor =
testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_LAMBDA);
- checkMethodIsAbsent(classSubject, getterAccessor);
- checkMethodIsAbsent(classSubject, setterAccessor);
+ checkMethodIsRemoved(classSubject, getterAccessor);
+ checkMethodIsRemoved(classSubject, setterAccessor);
});
}
@@ -421,9 +424,9 @@
"usePropertyAccessorFromLambda");
runTest("accessors", mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "property";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
assertFalse(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getterAccessor =
@@ -432,12 +435,12 @@
testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_LAMBDA);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getterAccessor);
- checkMethodIsAbsent(classSubject, setterAccessor);
+ checkMethodIsRemoved(classSubject, getterAccessor);
+ checkMethodIsRemoved(classSubject, setterAccessor);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getterAccessor);
- checkMethodIsPresent(classSubject, setterAccessor);
+ checkMethodIsKept(classSubject, getterAccessor);
+ checkMethodIsKept(classSubject, setterAccessor);
}
});
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 29c5582..c8c8aec 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -41,23 +41,23 @@
final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
runTest("dataclass", mainClassName, extraRules, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
+ ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
// Getters should be removed after inlining, which is possible only if access is relaxed.
final boolean areGetterPresent = !allowAccessModification;
- checkMethod(dataClass, NAME_GETTER_METHOD, areGetterPresent);
- checkMethod(dataClass, AGE_GETTER_METHOD, areGetterPresent);
+ checkMethodisKeptOrRemoved(dataClass, NAME_GETTER_METHOD, areGetterPresent);
+ checkMethodisKeptOrRemoved(dataClass, AGE_GETTER_METHOD, areGetterPresent);
// No use of componentN functions.
- checkMethodIsAbsent(dataClass, COMPONENT1_METHOD);
- checkMethodIsAbsent(dataClass, COMPONENT2_METHOD);
+ checkMethodIsRemoved(dataClass, COMPONENT1_METHOD);
+ checkMethodIsRemoved(dataClass, COMPONENT2_METHOD);
// No use of copy functions.
- checkMethodIsAbsent(dataClass, COPY_METHOD);
- checkMethodIsAbsent(dataClass, COPY_DEFAULT_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
- ClassSubject classSubject = checkClassExists(dexInspector, mainClassName);
- MethodSubject testMethod = checkMethodIsPresent(classSubject, testMethodSignature);
+ ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+ MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
DexCode dexCode = getDexCode(testMethod);
if (allowAccessModification) {
// Both getters should be inlined
@@ -76,24 +76,24 @@
final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
runTest("dataclass", mainClassName, extraRules, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
+ ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
// ComponentN functions should be removed after inlining, which is possible only if access
// is relaxed.
final boolean areComponentMethodsPresent = !allowAccessModification;
- checkMethod(dataClass, COMPONENT1_METHOD, areComponentMethodsPresent);
- checkMethod(dataClass, COMPONENT2_METHOD, areComponentMethodsPresent);
+ checkMethodisKeptOrRemoved(dataClass, COMPONENT1_METHOD, areComponentMethodsPresent);
+ checkMethodisKeptOrRemoved(dataClass, COMPONENT2_METHOD, areComponentMethodsPresent);
// No use of getter.
- checkMethodIsAbsent(dataClass, NAME_GETTER_METHOD);
- checkMethodIsAbsent(dataClass, AGE_GETTER_METHOD);
+ checkMethodIsRemoved(dataClass, NAME_GETTER_METHOD);
+ checkMethodIsRemoved(dataClass, AGE_GETTER_METHOD);
// No use of copy functions.
- checkMethodIsAbsent(dataClass, COPY_METHOD);
- checkMethodIsAbsent(dataClass, COPY_DEFAULT_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
- ClassSubject classSubject = checkClassExists(dexInspector, mainClassName);
- MethodSubject testMethod = checkMethodIsPresent(classSubject, testMethodSignature);
+ ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+ MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
DexCode dexCode = getDexCode(testMethod);
if (allowAccessModification) {
checkMethodIsNeverInvoked(dexCode, COMPONENT1_METHOD, COMPONENT2_METHOD);
@@ -111,24 +111,24 @@
final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
runTest("dataclass", mainClassName, extraRules, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
+ ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
boolean component2IsPresent = !allowAccessModification;
- checkMethod(dataClass, COMPONENT2_METHOD, component2IsPresent);
+ checkMethodisKeptOrRemoved(dataClass, COMPONENT2_METHOD, component2IsPresent);
// Function component1 is not used.
- checkMethodIsAbsent(dataClass, COMPONENT1_METHOD);
+ checkMethodIsRemoved(dataClass, COMPONENT1_METHOD);
// No use of getter.
- checkMethodIsAbsent(dataClass, NAME_GETTER_METHOD);
- checkMethodIsAbsent(dataClass, AGE_GETTER_METHOD);
+ checkMethodIsRemoved(dataClass, NAME_GETTER_METHOD);
+ checkMethodIsRemoved(dataClass, AGE_GETTER_METHOD);
// No use of copy functions.
- checkMethodIsAbsent(dataClass, COPY_METHOD);
- checkMethodIsAbsent(dataClass, COPY_DEFAULT_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
- ClassSubject classSubject = checkClassExists(dexInspector, mainClassName);
- MethodSubject testMethod = checkMethodIsPresent(classSubject, testMethodSignature);
+ ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+ MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
DexCode dexCode = getDexCode(testMethod);
if (allowAccessModification) {
checkMethodIsNeverInvoked(dexCode, COMPONENT2_METHOD);
@@ -146,10 +146,10 @@
final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
runTest("dataclass", mainClassName, extraRules, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
+ ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
- checkMethodIsAbsent(dataClass, COPY_METHOD);
- checkMethodIsAbsent(dataClass, COPY_DEFAULT_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
});
}
@@ -161,9 +161,9 @@
final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
runTest("dataclass", mainClassName, extraRules, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject dataClass = checkClassExists(dexInspector, TEST_DATA_CLASS.getClassName());
+ ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
- checkMethodIsAbsent(dataClass, COPY_DEFAULT_METHOD);
+ checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
});
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index 8fef44c..021e045 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -28,7 +28,7 @@
runTest("intrinsics", "intrinsics.IntrinsicsKt", extraRules, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject intrinsicsClass = checkClassExists(
+ ClassSubject intrinsicsClass = checkClassIsKept(
dexInspector, KOTLIN_INTRINSICS_CLASS.getClassName());
checkMethodsPresence(intrinsicsClass,
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
index f884376..74e3d5e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
@@ -6,6 +6,7 @@
import static org.junit.Assert.assertTrue;
+import com.android.tools.r8.kotlin.TestKotlinClass.KotlinProperty;
import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
import com.android.tools.r8.naming.MemberNaming;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -13,6 +14,7 @@
import com.android.tools.r8.utils.DexInspector.ClassSubject;
import com.android.tools.r8.utils.DexInspector.FieldSubject;
import com.android.tools.r8.utils.InternalOptions;
+import java.util.Map.Entry;
import java.util.function.Consumer;
import org.junit.Test;
@@ -89,13 +91,19 @@
"mutableProperty_noUseOfProperties");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
MUTABLE_PROPERTY_CLASS.getClassName());
- for (String propertyName : MUTABLE_PROPERTY_CLASS.properties.keySet()) {
- checkMethodIsAbsent(classSubject,
- MUTABLE_PROPERTY_CLASS.getGetterForProperty(propertyName));
- checkMethodIsAbsent(classSubject,
- MUTABLE_PROPERTY_CLASS.getSetterForProperty(propertyName));
+ for (Entry<String, KotlinProperty> property : MUTABLE_PROPERTY_CLASS.properties.entrySet()) {
+ MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(property.getKey());
+ MethodSignature setter = MUTABLE_PROPERTY_CLASS.getSetterForProperty(property.getKey());
+ if (property.getValue().getVisibility() == Visibility.PRIVATE) {
+ // Private properties have no getter/setter
+ checkMethodIsAbsent(classSubject, getter);
+ checkMethodIsAbsent(classSubject, setter);
+ } else {
+ checkMethodIsRemoved(classSubject, getter);
+ checkMethodIsRemoved(classSubject, setter);
+ }
}
});
}
@@ -106,10 +114,10 @@
"mutableProperty_usePrivateProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
MUTABLE_PROPERTY_CLASS.getClassName());
String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
if (!allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
} else {
@@ -128,19 +136,19 @@
"mutableProperty_useProtectedProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
MUTABLE_PROPERTY_CLASS.getClassName());
String propertyName = "protectedProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
// Protected property has private field.
MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(propertyName);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getter);
+ checkMethodIsRemoved(classSubject, getter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getter);
+ checkMethodIsKept(classSubject, getter);
}
});
}
@@ -151,19 +159,19 @@
"mutableProperty_useInternalProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
MUTABLE_PROPERTY_CLASS.getClassName());
String propertyName = "internalProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
// Internal property has private field
MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(propertyName);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getter);
+ checkMethodIsRemoved(classSubject, getter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getter);
+ checkMethodIsKept(classSubject, getter);
}
});
}
@@ -174,19 +182,19 @@
"mutableProperty_usePublicProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
MUTABLE_PROPERTY_CLASS.getClassName());
String propertyName = "publicProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
// Public property has private field
MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(propertyName);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getter);
+ checkMethodIsRemoved(classSubject, getter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getter);
+ checkMethodIsKept(classSubject, getter);
}
});
}
@@ -197,21 +205,21 @@
"mutableProperty_usePrimitiveProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
MUTABLE_PROPERTY_CLASS.getClassName());
String propertyName = "primitiveProp";
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, "int", propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, "int", propertyName);
MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(propertyName);
MethodSignature setter = MUTABLE_PROPERTY_CLASS.getSetterForProperty(propertyName);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getter);
- checkMethodIsAbsent(classSubject, setter);
+ checkMethodIsRemoved(classSubject, getter);
+ checkMethodIsRemoved(classSubject, setter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getter);
- checkMethodIsPresent(classSubject, setter);
+ checkMethodIsKept(classSubject, getter);
+ checkMethodIsKept(classSubject, setter);
}
});
}
@@ -222,13 +230,20 @@
"lateInitProperty_noUseOfProperties");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
LATE_INIT_PROPERTY_CLASS.getClassName());
- for (String propertyName : LATE_INIT_PROPERTY_CLASS.properties.keySet()) {
- checkMethodIsAbsent(classSubject,
- LATE_INIT_PROPERTY_CLASS.getGetterForProperty(propertyName));
- checkMethodIsAbsent(classSubject,
- LATE_INIT_PROPERTY_CLASS.getSetterForProperty(propertyName));
+ for (Entry<String, KotlinProperty> property : LATE_INIT_PROPERTY_CLASS.properties.entrySet()) {
+ MethodSignature getter = LATE_INIT_PROPERTY_CLASS.getGetterForProperty(property.getKey());
+ MethodSignature setter = LATE_INIT_PROPERTY_CLASS.getSetterForProperty(property.getKey());
+ if (property.getValue().getVisibility() == Visibility.PRIVATE) {
+ // Private properties have no getter or setter.
+ checkMethodIsAbsent(classSubject, getter);
+ checkMethodIsAbsent(classSubject, setter);
+
+ } else {
+ checkMethodIsRemoved(classSubject, getter);
+ checkMethodIsRemoved(classSubject, setter);
+ }
}
});
}
@@ -239,7 +254,7 @@
"properties/LateInitPropertyKt", "lateInitProperty_usePrivateLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
LATE_INIT_PROPERTY_CLASS.getClassName());
String propertyName = "privateLateInitProp";
FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -262,7 +277,7 @@
"lateInitProperty_useProtectedLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
LATE_INIT_PROPERTY_CLASS.getClassName());
String propertyName = "protectedLateInitProp";
FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -272,7 +287,7 @@
}
// Protected late init property have protected getter
- checkMethodIsAbsent(classSubject,
+ checkMethodIsRemoved(classSubject,
LATE_INIT_PROPERTY_CLASS.getGetterForProperty(propertyName));
});
}
@@ -283,7 +298,7 @@
"properties/LateInitPropertyKt", "lateInitProperty_useInternalLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
LATE_INIT_PROPERTY_CLASS.getClassName());
String propertyName = "internalLateInitProp";
FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -291,7 +306,7 @@
assertTrue(fieldSubject.getField().accessFlags.isPublic());
// Internal late init property have protected getter
- checkMethodIsAbsent(classSubject,
+ checkMethodIsRemoved(classSubject,
LATE_INIT_PROPERTY_CLASS.getGetterForProperty(propertyName));
});
}
@@ -302,7 +317,7 @@
"properties/LateInitPropertyKt", "lateInitProperty_usePublicLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
LATE_INIT_PROPERTY_CLASS.getClassName());
String propertyName = "publicLateInitProp";
FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -310,7 +325,7 @@
assertTrue(fieldSubject.getField().accessFlags.isPublic());
// Internal late init property have protected getter
- checkMethodIsAbsent(classSubject,
+ checkMethodIsRemoved(classSubject,
LATE_INIT_PROPERTY_CLASS.getGetterForProperty(propertyName));
});
}
@@ -321,12 +336,12 @@
"properties/UserDefinedPropertyKt", "userDefinedProperty_noUseOfProperties");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
USER_DEFINED_PROPERTY_CLASS.getClassName());
for (String propertyName : USER_DEFINED_PROPERTY_CLASS.properties.keySet()) {
- checkMethodIsAbsent(classSubject,
+ checkMethodIsRemoved(classSubject,
USER_DEFINED_PROPERTY_CLASS.getGetterForProperty(propertyName));
- checkMethodIsAbsent(classSubject,
+ checkMethodIsRemoved(classSubject,
USER_DEFINED_PROPERTY_CLASS.getSetterForProperty(propertyName));
}
});
@@ -338,22 +353,22 @@
"properties/UserDefinedPropertyKt", "userDefinedProperty_useProperties");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject classSubject = checkClassExists(dexInspector,
+ ClassSubject classSubject = checkClassIsKept(dexInspector,
USER_DEFINED_PROPERTY_CLASS.getClassName());
String propertyName = "durationInSeconds";
// The 'wrapper' property is not assigned to a backing field, it only relies on the wrapped
// property.
checkFieldIsAbsent(classSubject, "int", "durationInSeconds");
- FieldSubject fieldSubject = checkFieldIsPresent(classSubject, "int",
+ FieldSubject fieldSubject = checkFieldIsKept(classSubject, "int",
"durationInMilliSeconds");
MethodSignature getter = USER_DEFINED_PROPERTY_CLASS.getGetterForProperty(propertyName);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(classSubject, getter);
+ checkMethodIsRemoved(classSubject, getter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(classSubject, getter);
+ checkMethodIsKept(classSubject, getter);
}
});
}
@@ -364,12 +379,12 @@
"properties.CompanionPropertiesKt", "companionProperties_usePrimitiveProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector,
+ ClassSubject outerClass = checkClassIsKept(dexInspector,
"properties.CompanionProperties");
- ClassSubject companionClass = checkClassExists(dexInspector,
+ ClassSubject companionClass = checkClassIsKept(dexInspector,
COMPANION_PROPERTY_CLASS.getClassName());
String propertyName = "primitiveProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, "int", propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = COMPANION_PROPERTY_CLASS
@@ -379,8 +394,8 @@
// Getter and setter cannot be inlined because we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(companionClass, getter);
- checkMethodIsPresent(companionClass, setter);
+ checkMethodIsKept(companionClass, getter);
+ checkMethodIsKept(companionClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -395,12 +410,12 @@
"properties.CompanionPropertiesKt", "companionProperties_usePrivateProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector,
+ ClassSubject outerClass = checkClassIsKept(dexInspector,
"properties.CompanionProperties");
- ClassSubject companionClass = checkClassExists(dexInspector,
+ ClassSubject companionClass = checkClassIsKept(dexInspector,
COMPANION_PROPERTY_CLASS.getClassName());
String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = COMPANION_PROPERTY_CLASS
@@ -413,8 +428,8 @@
// non-null, thus the getter/setter can be inlined if their code is small enough.
// Because the backing field is private, they will call into an accessor (static) method. If
// access relaxation is enabled, this accessor can be removed.
- checkMethodIsAbsent(companionClass, getter);
- checkMethodIsAbsent(companionClass, setter);
+ checkMethodIsRemoved(companionClass, getter);
+ checkMethodIsRemoved(companionClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -429,12 +444,12 @@
"properties.CompanionPropertiesKt", "companionProperties_useInternalProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector,
+ ClassSubject outerClass = checkClassIsKept(dexInspector,
"properties.CompanionProperties");
- ClassSubject companionClass = checkClassExists(dexInspector,
+ ClassSubject companionClass = checkClassIsKept(dexInspector,
COMPANION_PROPERTY_CLASS.getClassName());
String propertyName = "internalProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = COMPANION_PROPERTY_CLASS
@@ -444,8 +459,8 @@
// Getter and setter cannot be inlined because we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(companionClass, getter);
- checkMethodIsPresent(companionClass, setter);
+ checkMethodIsKept(companionClass, getter);
+ checkMethodIsKept(companionClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -460,12 +475,12 @@
"properties.CompanionPropertiesKt", "companionProperties_usePublicProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector,
+ ClassSubject outerClass = checkClassIsKept(dexInspector,
"properties.CompanionProperties");
- ClassSubject companionClass = checkClassExists(dexInspector,
+ ClassSubject companionClass = checkClassIsKept(dexInspector,
COMPANION_PROPERTY_CLASS.getClassName());
String propertyName = "publicProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = COMPANION_PROPERTY_CLASS
@@ -475,8 +490,8 @@
// Getter and setter cannot be inlined because we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(companionClass, getter);
- checkMethodIsPresent(companionClass, setter);
+ checkMethodIsKept(companionClass, getter);
+ checkMethodIsKept(companionClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -492,10 +507,10 @@
"companionLateInitProperties_usePrivateLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
- ClassSubject companionClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+ ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -506,8 +521,8 @@
// non-null, thus the getter/setter can be inlined if their code is small enough.
// Because the backing field is private, they will call into an accessor (static) method. If
// access relaxation is enabled, this accessor can be removed.
- checkMethodIsAbsent(companionClass, getter);
- checkMethodIsAbsent(companionClass, setter);
+ checkMethodIsRemoved(companionClass, getter);
+ checkMethodIsRemoved(companionClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -523,10 +538,10 @@
"companionLateInitProperties_useInternalLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
- ClassSubject companionClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+ ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "internalLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -534,8 +549,8 @@
// Getter and setter cannot be inlined because we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(companionClass, getter);
- checkMethodIsPresent(companionClass, setter);
+ checkMethodIsKept(companionClass, getter);
+ checkMethodIsKept(companionClass, setter);
assertTrue(fieldSubject.getField().accessFlags.isPublic());
});
}
@@ -547,10 +562,10 @@
"companionLateInitProperties_usePublicLateInitProp");
runTest(PACKAGE_NAME, mainClass, disableClassInliner, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject outerClass = checkClassExists(dexInspector, testedClass.getOuterClassName());
- ClassSubject companionClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+ ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "publicLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(outerClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -558,8 +573,8 @@
// Getter and setter cannot be inlined because we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(companionClass, getter);
- checkMethodIsPresent(companionClass, setter);
+ checkMethodIsKept(companionClass, getter);
+ checkMethodIsKept(companionClass, setter);
assertTrue(fieldSubject.getField().accessFlags.isPublic());
});
}
@@ -571,9 +586,9 @@
"properties.ObjectPropertiesKt", "objectProperties_usePrimitiveProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "primitiveProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, "int", propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, "int", propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -581,8 +596,8 @@
// Getter and setter cannot be inlined when we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -598,9 +613,9 @@
"properties.ObjectPropertiesKt", "objectProperties_usePrivateProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -625,9 +640,9 @@
"properties.ObjectPropertiesKt", "objectProperties_useInternalProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "internalProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -635,8 +650,8 @@
// Getter and setter cannot be inlined when we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -652,9 +667,9 @@
"properties.ObjectPropertiesKt", "objectProperties_usePublicProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "publicProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -662,8 +677,8 @@
// Getter and setter cannot be inlined when we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
} else {
@@ -679,9 +694,9 @@
"properties.ObjectPropertiesKt", "objectProperties_useLateInitPrivateProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -706,9 +721,9 @@
"properties.ObjectPropertiesKt", "objectProperties_useLateInitInternalProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "internalLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -716,8 +731,8 @@
// Getter and setter cannot be inlined when we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
assertTrue(fieldSubject.getField().accessFlags.isPublic());
});
}
@@ -729,9 +744,9 @@
"properties.ObjectPropertiesKt", "objectProperties_useLateInitPublicProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "publicLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -739,8 +754,8 @@
// Getter and setter cannot be inlined when we don't know if null check semantic is
// preserved.
- checkMethodIsPresent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
assertTrue(fieldSubject.getField().accessFlags.isPublic());
});
}
@@ -752,9 +767,9 @@
"properties.FilePropertiesKt", "fileProperties_usePrimitiveProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "primitiveProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, "int", propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, "int", propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -762,12 +777,12 @@
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(objectClass, getter);
- checkMethodIsAbsent(objectClass, setter);
+ checkMethodIsRemoved(objectClass, getter);
+ checkMethodIsRemoved(objectClass, setter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
}
});
}
@@ -779,9 +794,9 @@
"properties.FilePropertiesKt", "fileProperties_usePrivateProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -805,9 +820,9 @@
"properties.FilePropertiesKt", "fileProperties_useInternalProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "internalProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
// We expect getter to be inlined when access (of the backing field) is relaxed to public.
@@ -816,10 +831,10 @@
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(objectClass, getter);
+ checkMethodIsRemoved(objectClass, getter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(objectClass, getter);
+ checkMethodIsKept(objectClass, getter);
}
});
}
@@ -831,9 +846,9 @@
"properties.FilePropertiesKt", "fileProperties_usePublicProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "publicProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
// We expect getter to be inlined when access (of the backing field) is relaxed to public.
@@ -843,10 +858,10 @@
if (allowAccessModification) {
assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsAbsent(objectClass, getter);
+ checkMethodIsRemoved(objectClass, getter);
} else {
assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsPresent(objectClass, getter);
+ checkMethodIsKept(objectClass, getter);
}
});
}
@@ -858,9 +873,9 @@
"properties.FilePropertiesKt", "fileProperties_useLateInitPrivateProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject fileClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject fileClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "privateLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(fileClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(fileClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
@@ -884,9 +899,9 @@
"properties.FilePropertiesKt", "fileProperties_useLateInitInternalProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "internalLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
assertTrue(fieldSubject.getField().accessFlags.isPublic());
@@ -894,10 +909,10 @@
MemberNaming.MethodSignature setter = testedClass.getSetterForProperty(propertyName);
// Field is public and getter is small so we expect to always inline it.
- checkMethodIsAbsent(objectClass, getter);
+ checkMethodIsRemoved(objectClass, getter);
// Setter has null check of new value, thus may not be inlined.
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsKept(objectClass, setter);
});
}
@@ -908,16 +923,16 @@
"properties.FilePropertiesKt", "fileProperties_useLateInitPublicProp");
runTest(PACKAGE_NAME, mainClass, (app) -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject objectClass = checkClassExists(dexInspector, testedClass.getClassName());
+ ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
String propertyName = "publicLateInitProp";
- FieldSubject fieldSubject = checkFieldIsPresent(objectClass, JAVA_LANG_STRING, propertyName);
+ FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
assertTrue(fieldSubject.getField().accessFlags.isStatic());
MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
MemberNaming.MethodSignature setter = testedClass.getSetterForProperty(propertyName);
- checkMethodIsAbsent(objectClass, getter);
- checkMethodIsPresent(objectClass, setter);
+ checkMethodIsRemoved(objectClass, getter);
+ checkMethodIsKept(objectClass, setter);
assertTrue(fieldSubject.getField().accessFlags.isPublic());
});
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index 2b1c33f..5a30cfd 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -36,9 +36,9 @@
final String extraRules = keepAllMembers(mainClassName);
runTest(FOLDER, mainClassName, extraRules, app -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject clazz = checkClassExists(dexInspector, ex1.getClassName());
+ ClassSubject clazz = checkClassIsKept(dexInspector, ex1.getClassName());
- MethodSubject testMethod = checkMethodIsPresent(clazz, testMethodSignature);
+ MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
DexCode dexCode = getDexCode(testMethod);
long count = Arrays.stream(dexCode.instructions)
.filter(SimplifyIfNotNullKotlinTest::isIf).count();
@@ -62,9 +62,9 @@
final String extraRules = keepAllMembers(mainClassName);
runTest(FOLDER, mainClassName, extraRules, app -> {
DexInspector dexInspector = new DexInspector(app);
- ClassSubject clazz = checkClassExists(dexInspector, ex2.getClassName());
+ ClassSubject clazz = checkClassIsKept(dexInspector, ex2.getClassName());
- MethodSubject testMethod = checkMethodIsPresent(clazz, testMethodSignature);
+ MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
DexCode dexCode = getDexCode(testMethod);
long count = Arrays.stream(dexCode.instructions)
.filter(SimplifyIfNotNullKotlinTest::isIf).count();