Check header on package part classes in MethodInliner

This commit is contained in:
Alexander Udalov
2014-09-23 16:16:57 +04:00
parent c30aa7db84
commit 4d055d5ab4
@@ -17,13 +17,17 @@
package org.jetbrains.jet.codegen.inline;
import com.google.common.collect.Lists;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.codegen.ClosureCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.kotlin.KotlinBinaryClassCache;
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass;
import org.jetbrains.org.objectweb.asm.Label;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Opcodes;
@@ -535,7 +539,6 @@ public class MethodInliner {
}
}
//TODO: check annotation on class - it's package part
//TODO: check it's external module
//TODO?: assert method exists in facade?
public String changeOwnerForExternalPackage(String type, int opcode) {
@@ -546,7 +549,13 @@ public class MethodInliner {
JvmClassName name = JvmClassName.byInternalName(type);
String packageClassInternalName = PackageClassUtils.getPackageClassInternalName(name.getPackageFqName());
if (type.startsWith(packageClassInternalName + '$')) {
return packageClassInternalName;
VirtualFile virtualFile = InlineCodegenUtil.findVirtualFile(inliningContext.state.getProject(), type);
if (virtualFile != null) {
KotlinJvmBinaryClass klass = KotlinBinaryClassCache.getKotlinBinaryClass(virtualFile);
if (klass != null && klass.getClassHeader().getSyntheticClassKind() == KotlinSyntheticClass.Kind.PACKAGE_PART) {
return packageClassInternalName;
}
}
}
return type;