Minor refactorings in JetTypeMapper: renames, inlines, etc.

This commit is contained in:
Alexander Udalov
2014-04-18 21:09:43 +04:00
parent d913dfb1aa
commit 55836884d5
@@ -57,7 +57,6 @@ import static org.jetbrains.jet.codegen.CodegenUtil.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.isVarCapturedInClosure; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.isVarCapturedInClosure;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
import static org.jetbrains.org.objectweb.asm.Opcodes.*; import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class JetTypeMapper extends BindingTraceAware { public class JetTypeMapper extends BindingTraceAware {
@@ -91,53 +90,43 @@ public class JetTypeMapper extends BindingTraceAware {
@NotNull @NotNull
public Type mapOwner(@NotNull DeclarationDescriptor descriptor, boolean isInsideModule) { public Type mapOwner(@NotNull DeclarationDescriptor descriptor, boolean isInsideModule) {
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); DeclarationDescriptor container = descriptor.getContainingDeclaration();
if (containingDeclaration instanceof PackageFragmentDescriptor) { if (container instanceof JavaClassStaticsPackageFragmentDescriptor) {
return asmTypeForPackage((PackageFragmentDescriptor) containingDeclaration, descriptor, isInsideModule); return mapClass(((JavaClassStaticsPackageFragmentDescriptor) container).getCorrespondingClass());
} }
else if (containingDeclaration instanceof ClassDescriptor) { else if (container instanceof PackageFragmentDescriptor) {
return mapClass((ClassDescriptor) containingDeclaration); return Type.getObjectType(internalNameForPackage((PackageFragmentDescriptor) container, descriptor, isInsideModule));
} }
else if (containingDeclaration instanceof ScriptDescriptor) { else if (container instanceof ClassDescriptor) {
return asmTypeForScriptDescriptor(bindingContext, (ScriptDescriptor) containingDeclaration); return mapClass((ClassDescriptor) container);
}
else if (container instanceof ScriptDescriptor) {
return asmTypeForScriptDescriptor(bindingContext, (ScriptDescriptor) container);
} }
else { else {
throw new UnsupportedOperationException("Don't know how to map owner for " + descriptor); throw new UnsupportedOperationException("Don't know how to map owner for " + descriptor);
} }
} }
@NotNull
private Type asmTypeForPackage(
@NotNull PackageFragmentDescriptor packageFragment,
@NotNull DeclarationDescriptor descriptor,
boolean insideModule
) {
return Type.getObjectType(internalNameForPackage(packageFragment, descriptor, insideModule));
}
@NotNull @NotNull
private String internalNameForPackage( private String internalNameForPackage(
@NotNull PackageFragmentDescriptor packageFragment, @NotNull PackageFragmentDescriptor packageFragment,
@NotNull DeclarationDescriptor descriptor, @NotNull DeclarationDescriptor descriptor,
boolean insideModule boolean insideModule
) { ) {
if (packageFragment instanceof JavaClassStaticsPackageFragmentDescriptor) {
JavaClassStaticsPackageFragmentDescriptor javaPackageFragment = (JavaClassStaticsPackageFragmentDescriptor) packageFragment;
return mapClass(javaPackageFragment.getCorrespondingClass()).getInternalName();
}
// It's not a package created for Java class statics
if (insideModule) { if (insideModule) {
JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor); JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor);
if (file != null) { if (file != null) {
return PackageCodegen.getPackagePartInternalName(file); return PackageCodegen.getPackagePartInternalName(file);
} }
if (descriptor instanceof DeserializedCallableMemberDescriptor && IncrementalCompilation.ENABLED) { if (descriptor instanceof DeserializedCallableMemberDescriptor && IncrementalCompilation.ENABLED) {
// //
// TODO calls from other modules/libraries should use facade: KT-4590 // TODO calls from other modules/libraries should use facade: KT-4590
return PackageCodegen.getPackagePartInternalName((DeserializedCallableMemberDescriptor) descriptor); return PackageCodegen.getPackagePartInternalName((DeserializedCallableMemberDescriptor) descriptor);
} }
} }
return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/'); return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/');
} }
@@ -428,8 +417,7 @@ public class JetTypeMapper extends BindingTraceAware {
} }
else if (functionParent instanceof PackageFragmentDescriptor) { else if (functionParent instanceof PackageFragmentDescriptor) {
assert !superCall; assert !superCall;
owner = asmTypeForPackage((PackageFragmentDescriptor) functionParent, functionDescriptor, owner = mapOwner(functionDescriptor, isCallInsideSameModuleAsDeclared(functionDescriptor, context));
isCallInsideSameModuleAsDeclared(functionDescriptor, context));
ownerForDefaultImpl = ownerForDefaultParam = owner; ownerForDefaultImpl = ownerForDefaultParam = owner;
invokeOpcode = INVOKESTATIC; invokeOpcode = INVOKESTATIC;
thisClass = null; thisClass = null;
@@ -634,9 +622,9 @@ public class JetTypeMapper extends BindingTraceAware {
@Nullable @Nullable
public String mapFieldSignature(@NotNull JetType backingFieldType) { public String mapFieldSignature(@NotNull JetType backingFieldType) {
BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE); BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE);
mapType(backingFieldType, signatureVisitor, JetTypeMapperMode.VALUE); mapType(backingFieldType, sw, JetTypeMapperMode.VALUE);
return signatureVisitor.makeJavaGenericSignature(); return sw.makeJavaGenericSignature();
} }
private void writeThisIfNeeded( private void writeThisIfNeeded(
@@ -690,18 +678,22 @@ public class JetTypeMapper extends BindingTraceAware {
sw.writeClassBoundEnd(); sw.writeClassBoundEnd();
for (JetType jetType : typeParameterDescriptor.getUpperBounds()) { for (JetType jetType : typeParameterDescriptor.getUpperBounds()) {
if (jetType.getConstructor().getDeclarationDescriptor() instanceof ClassDescriptor) { ClassifierDescriptor classifier = jetType.getConstructor().getDeclarationDescriptor();
if (classifier instanceof ClassDescriptor) {
if (isInterface(jetType)) { if (isInterface(jetType)) {
sw.writeInterfaceBound(); sw.writeInterfaceBound();
mapType(jetType, sw, JetTypeMapperMode.TYPE_PARAMETER); mapType(jetType, sw, JetTypeMapperMode.TYPE_PARAMETER);
sw.writeInterfaceBoundEnd(); sw.writeInterfaceBoundEnd();
} }
} }
if (jetType.getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor) { else if (classifier instanceof TypeParameterDescriptor) {
sw.writeInterfaceBound(); sw.writeInterfaceBound();
mapType(jetType, sw, JetTypeMapperMode.TYPE_PARAMETER); mapType(jetType, sw, JetTypeMapperMode.TYPE_PARAMETER);
sw.writeInterfaceBoundEnd(); sw.writeInterfaceBoundEnd();
} }
else {
throw new UnsupportedOperationException("Unknown classifier: " + classifier);
}
} }
} }
@@ -791,25 +783,25 @@ public class JetTypeMapper extends BindingTraceAware {
@NotNull @NotNull
public JvmMethodSignature mapScriptSignature(@NotNull ScriptDescriptor script, @NotNull List<ScriptDescriptor> importedScripts) { public JvmMethodSignature mapScriptSignature(@NotNull ScriptDescriptor script, @NotNull List<ScriptDescriptor> importedScripts) {
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
signatureWriter.writeParametersStart(); sw.writeParametersStart();
for (ScriptDescriptor importedScript : importedScripts) { for (ScriptDescriptor importedScript : importedScripts) {
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE); sw.writeParameterType(JvmMethodParameterKind.VALUE);
ClassDescriptor descriptor = bindingContext.get(CLASS_FOR_SCRIPT, importedScript); ClassDescriptor descriptor = bindingContext.get(CLASS_FOR_SCRIPT, importedScript);
assert descriptor != null; assert descriptor != null;
mapType(descriptor.getDefaultType(), signatureWriter, JetTypeMapperMode.VALUE); mapType(descriptor.getDefaultType(), sw, JetTypeMapperMode.VALUE);
signatureWriter.writeParameterTypeEnd(); sw.writeParameterTypeEnd();
} }
for (ValueParameterDescriptor valueParameter : script.getScriptCodeDescriptor().getValueParameters()) { for (ValueParameterDescriptor valueParameter : script.getScriptCodeDescriptor().getValueParameters()) {
writeParameter(signatureWriter, valueParameter.getType()); writeParameter(sw, valueParameter.getType());
} }
writeVoidReturn(signatureWriter); writeVoidReturn(sw);
return signatureWriter.makeJvmMethodSignature("<init>"); return sw.makeJvmMethodSignature("<init>");
} }
@NotNull @NotNull
@@ -839,28 +831,4 @@ public class JetTypeMapper extends BindingTraceAware {
} }
return null; return null;
} }
@NotNull
private static JvmMethodSignature erasedInvokeSignature(@NotNull FunctionDescriptor descriptor) {
BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
int paramCount = descriptor.getValueParameters().size();
if (descriptor.getReceiverParameter() != null) {
paramCount++;
}
sw.writeParametersStart();
for (int i = 0; i < paramCount; ++i) {
sw.writeParameterType(JvmMethodParameterKind.VALUE);
sw.writeAsmType(OBJECT_TYPE);
sw.writeParameterTypeEnd();
}
sw.writeReturnType();
sw.writeAsmType(OBJECT_TYPE);
sw.writeReturnTypeEnd();
return sw.makeJvmMethodSignature("invoke");
}
} }