Properly calculate outermost parent class for sam wrapper

#KT-22906 Fixed
This commit is contained in:
Mikhael Bogdanov
2018-02-19 09:37:47 +01:00
parent 6d035f1d28
commit cc4ab832b7
8 changed files with 168 additions and 4 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.codegen;
import kotlin.collections.CollectionsKt;
import kotlin.text.StringsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.backend.common.CodegenUtil;
import org.jetbrains.kotlin.codegen.state.GenerationState;
@@ -26,10 +27,8 @@ import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl;
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtDeclaration;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
@@ -200,9 +199,10 @@ public class SamWrapperCodegen {
outermostOwner = filePartFqName;
}
else {
ClassifierDescriptor outermostClassifier = DescriptorUtils.getParentOfType(contextDescriptor, ClassDescriptor.class);
ClassifierDescriptor outermostClassifier = getOutermostParentClass(contextDescriptor);
if (outermostClassifier == null) throw new IllegalStateException("Can't find outermost parent class for " + contextDescriptor);
outermostOwner = filePartFqName.parent().child(outermostClassifier.getName());
String internalName = typeMapper.mapType(outermostClassifier).getInternalName();
outermostOwner = filePartFqName.parent().child(Name.identifier(StringsKt.substringAfterLast(internalName, '/', internalName)));
}
String shortName = String.format(
@@ -213,4 +213,15 @@ public class SamWrapperCodegen {
);
return outermostOwner.parent().child(Name.identifier(shortName));
}
private static ClassDescriptor getOutermostParentClass(CallableMemberDescriptor contextDescriptor) {
ClassDescriptor parent = DescriptorUtils.getParentOfType(contextDescriptor, ClassDescriptor.class, true);
ClassDescriptor next;
do {
next = DescriptorUtils.getParentOfType(parent, ClassDescriptor.class, true);
if (next != null) parent = next;
}
while (next != null);
return parent;
}
}