Made methods generated from declarations marked with @HiddenDeclaration synthetic in JVM
This commit is contained in:
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor;
|
|||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationsPackage;
|
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.inline.InlineUtil;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPackage;
|
import org.jetbrains.kotlin.resolve.jvm.JvmPackage;
|
||||||
@@ -218,6 +219,11 @@ public class AsmUtil {
|
|||||||
int flags = getVisibilityAccessFlag(functionDescriptor);
|
int flags = getVisibilityAccessFlag(functionDescriptor);
|
||||||
flags |= getVarargsFlag(functionDescriptor);
|
flags |= getVarargsFlag(functionDescriptor);
|
||||||
flags |= getDeprecatedAccessFlag(functionDescriptor);
|
flags |= getDeprecatedAccessFlag(functionDescriptor);
|
||||||
|
if (DescriptorUtilPackage.isAnnotatedAsHidden(functionDescriptor)
|
||||||
|
|| functionDescriptor instanceof PropertyAccessorDescriptor
|
||||||
|
&& DescriptorUtilPackage.isAnnotatedAsHidden(((PropertyAccessorDescriptor) functionDescriptor).getCorrespondingProperty())) {
|
||||||
|
flags |= ACC_SYNTHETIC;
|
||||||
|
}
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class MyClass() {
|
||||||
|
@HiddenDeclaration fun test() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTED_OBJECT_KIND: function
|
||||||
|
// TESTED_OBJECTS: MyClass, test
|
||||||
|
// FLAGS: ACC_SYNTHETIC, ACC_PUBLIC, ACC_FINAL
|
||||||
@@ -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
|
||||||
@@ -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);
|
assertNotNull(outputFile);
|
||||||
|
|
||||||
ClassReader cr = new ClassReader(outputFile.asByteArray());
|
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);
|
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: "));
|
boolean isObjectExists = !Boolean.valueOf(findStringWithPrefixes(testedObject.textData, "// ABSENT: "));
|
||||||
assertEquals("Wrong object existence state: " + testedObject, isObjectExists, classVisitor.isExists());
|
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")) {
|
if (visitorKind.equals("class")) {
|
||||||
return new ClassFlagsVisitor();
|
return new ClassFlagsVisitor();
|
||||||
}
|
}
|
||||||
else if (visitorKind.equals("function")) {
|
else if (visitorKind.equals("function")) {
|
||||||
return new FunctionFlagsVisitor(testedObjectName);
|
return new FunctionFlagsVisitor(testedObjectName, allowSynthetic);
|
||||||
}
|
}
|
||||||
else if (visitorKind.equals("property")) {
|
else if (visitorKind.equals("property")) {
|
||||||
return new PropertyFlagsVisitor(testedObjectName);
|
return new PropertyFlagsVisitor(testedObjectName);
|
||||||
@@ -227,14 +232,17 @@ public abstract class AbstractWriteFlagsTest extends UsefulTestCase {
|
|||||||
private static class FunctionFlagsVisitor extends TestClassVisitor {
|
private static class FunctionFlagsVisitor extends TestClassVisitor {
|
||||||
private int access = 0;
|
private int access = 0;
|
||||||
private final String funName;
|
private final String funName;
|
||||||
|
private final boolean allowSynthetic;
|
||||||
|
|
||||||
public FunctionFlagsVisitor(String name) {
|
public FunctionFlagsVisitor(String name, boolean allowSynthetic) {
|
||||||
funName = name;
|
funName = name;
|
||||||
|
this.allowSynthetic = allowSynthetic;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MethodVisitor visitMethod(int access, @NotNull String name, @NotNull String desc, String signature, String[] exceptions) {
|
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;
|
this.access = access;
|
||||||
isExists = true;
|
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")
|
@TestMetadata("compiler/testData/writeFlags/innerClass")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user