Package part and facade origins supported

This commit is contained in:
Andrey Breslav
2014-05-27 20:54:04 +04:00
parent 4fbce3f43e
commit 87b6ad08b5
2 changed files with 12 additions and 3 deletions
@@ -18,11 +18,15 @@ package org.jetbrains.jet.codegen
import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.psi.JetFile
public enum class MemberKind { FIELD; METHOD }
public enum class JvmDeclarationOriginKind {
OTHER
PACKAGE_FACADE
PACKAGE_PART
}
public class JvmDeclarationOrigin(
@@ -43,3 +47,7 @@ public fun OtherOrigin(element: PsiElement?, descriptor: DeclarationDescriptor?)
public fun OtherOrigin(element: PsiElement?): JvmDeclarationOrigin = OtherOrigin(element, null)
public fun OtherOrigin(descriptor: DeclarationDescriptor?): JvmDeclarationOrigin = OtherOrigin(null, descriptor)
public fun PackageFacade(descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.PACKAGE_FACADE, null, descriptor)
public fun PackagePart(file: JetFile, descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.PACKAGE_PART, file, descriptor)
@@ -60,7 +60,8 @@ import org.jetbrains.org.objectweb.asm.Type;
import java.util.*;
import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.CodegenPackage.PackageFacade;
import static org.jetbrains.jet.codegen.CodegenPackage.PackagePart;
import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver;
import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
@@ -91,7 +92,7 @@ public class PackageCodegen {
String className = AsmUtil.internalNameByFqNameWithoutInnerClasses(getPackageClassFqName(fqName));
ClassBuilder v = PackageCodegen.this.state.getFactory()
.newVisitor(
OtherOrigin(packageFragment),
PackageFacade(packageFragment == null ? compiledPackageFragment : packageFragment),
Type.getObjectType(className), PackagePartClassUtils.getPackageFilesWithCallables(files));
v.defineClass(sourceFile, V1_6,
ACC_PUBLIC | ACC_FINAL,
@@ -282,7 +283,7 @@ public class PackageCodegen {
if (!generatePackagePart) return null;
ClassBuilder builder = state.getFactory().newVisitor(OtherOrigin(file, packageFragment), packagePartType, file);
ClassBuilder builder = state.getFactory().newVisitor(PackagePart(file, packageFragment), packagePartType, file);
new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate();