Made methods generated from declarations marked with @HiddenDeclaration synthetic in JVM

This commit is contained in:
Valentin Kipyatkov
2015-09-07 20:21:20 +03:00
parent aec661aeff
commit 08e7a9d826
6 changed files with 71 additions and 5 deletions
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.annotations.AnnotationsPackage;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage;
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
import org.jetbrains.kotlin.resolve.jvm.JvmPackage;
@@ -218,6 +219,11 @@ public class AsmUtil {
int flags = getVisibilityAccessFlag(functionDescriptor);
flags |= getVarargsFlag(functionDescriptor);
flags |= getDeprecatedAccessFlag(functionDescriptor);
if (DescriptorUtilPackage.isAnnotatedAsHidden(functionDescriptor)
|| functionDescriptor instanceof PropertyAccessorDescriptor
&& DescriptorUtilPackage.isAnnotatedAsHidden(((PropertyAccessorDescriptor) functionDescriptor).getCorrespondingProperty())) {
flags |= ACC_SYNTHETIC;
}
return flags;
}
+7
View File
@@ -0,0 +1,7 @@
class MyClass() {
@HiddenDeclaration fun test() {}
}
// TESTED_OBJECT_KIND: function
// TESTED_OBJECTS: MyClass, test
// FLAGS: ACC_SYNTHETIC, ACC_PUBLIC, ACC_FINAL
+9
View File
@@ -0,0 +1,9 @@
class MyClass() {
@HiddenDeclaration var test: Int
get() = 0
set(value) {}
}
// TESTED_OBJECT_KIND: function
// TESTED_OBJECTS: MyClass, getTest
// FLAGS: ACC_SYNTHETIC, ACC_PUBLIC, ACC_FINAL
+9
View File
@@ -0,0 +1,9 @@
class MyClass() {
@HiddenDeclaration var test: Int
get() = 0
set(value) {}
}
// TESTED_OBJECT_KIND: function
// TESTED_OBJECTS: MyClass, setTest
// FLAGS: ACC_SYNTHETIC, ACC_PUBLIC, ACC_FINAL
@@ -98,9 +98,14 @@ public abstract class AbstractWriteFlagsTest extends UsefulTestCase {
assertNotNull(outputFile);
ClassReader cr = new ClassReader(outputFile.asByteArray());
TestClassVisitor classVisitor = getClassVisitor(testedObject.kind, testedObject.name);
TestClassVisitor classVisitor = getClassVisitor(testedObject.kind, testedObject.name, false);
cr.accept(classVisitor, ClassReader.SKIP_CODE);
if (!classVisitor.isExists()) {
classVisitor = getClassVisitor(testedObject.kind, testedObject.name, true);
cr.accept(classVisitor, ClassReader.SKIP_CODE);
}
boolean isObjectExists = !Boolean.valueOf(findStringWithPrefixes(testedObject.textData, "// ABSENT: "));
assertEquals("Wrong object existence state: " + testedObject, isObjectExists, classVisitor.isExists());
@@ -158,12 +163,12 @@ public abstract class AbstractWriteFlagsTest extends UsefulTestCase {
}
}
private static TestClassVisitor getClassVisitor(String visitorKind, String testedObjectName) {
private static TestClassVisitor getClassVisitor(String visitorKind, String testedObjectName, boolean allowSynthetic) {
if (visitorKind.equals("class")) {
return new ClassFlagsVisitor();
}
else if (visitorKind.equals("function")) {
return new FunctionFlagsVisitor(testedObjectName);
return new FunctionFlagsVisitor(testedObjectName, allowSynthetic);
}
else if (visitorKind.equals("property")) {
return new PropertyFlagsVisitor(testedObjectName);
@@ -227,14 +232,17 @@ public abstract class AbstractWriteFlagsTest extends UsefulTestCase {
private static class FunctionFlagsVisitor extends TestClassVisitor {
private int access = 0;
private final String funName;
private final boolean allowSynthetic;
public FunctionFlagsVisitor(String name) {
public FunctionFlagsVisitor(String name, boolean allowSynthetic) {
funName = name;
this.allowSynthetic = allowSynthetic;
}
@Override
public MethodVisitor visitMethod(int access, @NotNull String name, @NotNull String desc, String signature, String[] exceptions) {
if (name.equals(funName) && (access & Opcodes.ACC_SYNTHETIC) == 0) {
if (name.equals(funName)) {
if (!allowSynthetic && (access & Opcodes.ACC_SYNTHETIC) != 0) return null;
this.access = access;
isExists = true;
}
@@ -518,6 +518,33 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest {
}
}
@TestMetadata("compiler/testData/writeFlags/hidden")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Hidden extends AbstractWriteFlagsTest {
public void testAllFilesPresentInHidden() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/writeFlags/hidden"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("function.kt")
public void testFunction() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeFlags/hidden/function.kt");
doTest(fileName);
}
@TestMetadata("propertyGetter.kt")
public void testPropertyGetter() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeFlags/hidden/propertyGetter.kt");
doTest(fileName);
}
@TestMetadata("propertySetter.kt")
public void testPropertySetter() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/writeFlags/hidden/propertySetter.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/writeFlags/innerClass")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)