Remove JetTypeMapper.map{G,S}etterSignature

Merge their logic with mapSignature()
This commit is contained in:
Alexander Udalov
2013-12-24 19:58:24 +04:00
parent e531bebe06
commit ace326f4cf
6 changed files with 72 additions and 116 deletions
@@ -777,8 +777,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private Type genPropertyOnStack(InstructionAdapter iv, PropertyDescriptor propertyDescriptor, int index) { private Type genPropertyOnStack(InstructionAdapter iv, PropertyDescriptor propertyDescriptor, int index) {
iv.load(index, classAsmType); iv.load(index, classAsmType);
Method //noinspection ConstantConditions
method = typeMapper.mapGetterSignature(propertyDescriptor, OwnerKind.IMPLEMENTATION).getAsmMethod(); Method method = typeMapper.mapSignature(propertyDescriptor.getGetter()).getAsmMethod();
iv.invokevirtual(classAsmType.getInternalName(), method.getName(), method.getDescriptor()); iv.invokevirtual(classAsmType.getInternalName(), method.getName(), method.getDescriptor());
return method.getReturnType(); return method.getReturnType();
@@ -957,7 +957,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
PropertyGetterDescriptor getter = bridge.getGetter(); PropertyGetterDescriptor getter = bridge.getGetter();
assert getter != null; assert getter != null;
functionCodegen.generateMethod(null, typeMapper.mapGetterSignature(bridge, OwnerKind.IMPLEMENTATION), getter, functionCodegen.generateMethod(null, typeMapper.mapSignature(getter), getter,
new FunctionGenerationStrategy.CodegenBased<PropertyGetterDescriptor>(state, getter) { new FunctionGenerationStrategy.CodegenBased<PropertyGetterDescriptor>(state, getter) {
@Override @Override
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) { public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
@@ -977,7 +977,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
PropertySetterDescriptor setter = bridge.getSetter(); PropertySetterDescriptor setter = bridge.getSetter();
assert setter != null; assert setter != null;
functionCodegen.generateMethod(null, typeMapper.mapSetterSignature(bridge, OwnerKind.IMPLEMENTATION), setter, functionCodegen.generateMethod(null, typeMapper.mapSignature(setter), setter,
new FunctionGenerationStrategy.CodegenBased<PropertySetterDescriptor>(state, setter) { new FunctionGenerationStrategy.CodegenBased<PropertySetterDescriptor>(state, setter) {
@Override @Override
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) { public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
@@ -1443,9 +1443,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
int flags = ACC_PUBLIC; // TODO. int flags = ACC_PUBLIC; // TODO.
TraitImplDelegateInfo delegateInfo = getTraitImplDelegateInfo(fun); Method methodToGenerate = typeMapper.mapSignature(fun).getAsmMethod();
Method methodToGenerate = delegateInfo.methodToGenerate; Method methodInTrait = typeMapper.mapSignature(fun.getOriginal()).getAsmMethod();
Method methodInTrait = delegateInfo.methodInTrait;
PsiElement origin = descriptorToDeclaration(bindingContext, fun); PsiElement origin = descriptorToDeclaration(bindingContext, fun);
MethodVisitor mv = v.newMethod(origin, flags, methodToGenerate.getName(), methodToGenerate.getDescriptor(), null, null); MethodVisitor mv = v.newMethod(origin, flags, methodToGenerate.getName(), methodToGenerate.getDescriptor(), null, null);
@@ -1483,44 +1482,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
FunctionCodegen.generateBridgeIfNeeded(context, state, v, methodToGenerate, fun); FunctionCodegen.generateBridgeIfNeeded(context, state, v, methodToGenerate, fun);
} }
private static class TraitImplDelegateInfo {
private final Method methodToGenerate;
private final Method methodInTrait;
private TraitImplDelegateInfo(@NotNull Method methodToGenerate, @NotNull Method methodInTrait) {
this.methodToGenerate = methodToGenerate;
this.methodInTrait = methodInTrait;
}
}
@NotNull
private TraitImplDelegateInfo getTraitImplDelegateInfo(@NotNull FunctionDescriptor fun) {
if (fun instanceof PropertyAccessorDescriptor) {
PropertyDescriptor property = ((PropertyAccessorDescriptor) fun).getCorrespondingProperty();
PropertyDescriptor original = property.getOriginal();
if (fun instanceof PropertyGetterDescriptor) {
JvmMethodSignature toGenerate = typeMapper.mapGetterSignature(property, OwnerKind.IMPLEMENTATION);
JvmMethodSignature inTrait = typeMapper.mapGetterSignature(original, OwnerKind.IMPLEMENTATION);
return new TraitImplDelegateInfo(
toGenerate.getAsmMethod(), inTrait.getAsmMethod());
}
else if (fun instanceof PropertySetterDescriptor) {
JvmMethodSignature toGenerate = typeMapper.mapSetterSignature(property, OwnerKind.IMPLEMENTATION);
JvmMethodSignature inTrait = typeMapper.mapSetterSignature(original, OwnerKind.IMPLEMENTATION);
return new TraitImplDelegateInfo(
toGenerate.getAsmMethod(), inTrait.getAsmMethod());
}
else {
throw new IllegalStateException("Accessor is neither getter, nor setter, what is it? " + fun);
}
}
else {
Method function = typeMapper.mapSignature(fun).getAsmMethod();
Method functionOriginal = typeMapper.mapSignature(fun.getOriginal()).getAsmMethod();
return new TraitImplDelegateInfo(function, functionOriginal);
}
}
private void generateDelegatorToConstructorCall( private void generateDelegatorToConstructorCall(
InstructionAdapter iv, ExpressionCodegen codegen, InstructionAdapter iv, ExpressionCodegen codegen,
ConstructorDescriptor constructorDescriptor ConstructorDescriptor constructorDescriptor
@@ -253,9 +253,9 @@ public class PropertyCodegen extends GenerationStateAware {
//TODO: Now it's not enough information to properly resolve property from bytecode without generated getter and setter //TODO: Now it's not enough information to properly resolve property from bytecode without generated getter and setter
//if (!defaultGetter || isExternallyAccessible(propertyDescriptor)) { //if (!defaultGetter || isExternallyAccessible(propertyDescriptor)) {
JvmMethodSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind);
PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter(); PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter();
getterDescriptor = getterDescriptor != null ? getterDescriptor : DescriptorFactory.createDefaultGetter(propertyDescriptor); getterDescriptor = getterDescriptor != null ? getterDescriptor : DescriptorFactory.createDefaultGetter(propertyDescriptor);
JvmMethodSignature signature = typeMapper.mapSignature(getterDescriptor, kind);
if (kind != OwnerKind.TRAIT_IMPL || !defaultGetter) { if (kind != OwnerKind.TRAIT_IMPL || !defaultGetter) {
FunctionGenerationStrategy strategy; FunctionGenerationStrategy strategy;
@@ -283,10 +283,9 @@ public class PropertyCodegen extends GenerationStateAware {
//TODO: Now it's not enough information to properly resolve property from bytecode without generated getter and setter //TODO: Now it's not enough information to properly resolve property from bytecode without generated getter and setter
if (/*!defaultSetter || isExternallyAccessible(propertyDescriptor) &&*/ propertyDescriptor.isVar()) { if (/*!defaultSetter || isExternallyAccessible(propertyDescriptor) &&*/ propertyDescriptor.isVar()) {
JvmMethodSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind);
PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter(); PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter();
setterDescriptor = setterDescriptor = setterDescriptor != null ? setterDescriptor : DescriptorFactory.createDefaultSetter(propertyDescriptor);
setterDescriptor != null ? setterDescriptor : DescriptorFactory.createDefaultSetter(propertyDescriptor); JvmMethodSignature signature = typeMapper.mapSignature(setterDescriptor, kind);
if (kind != OwnerKind.TRAIT_IMPL || !defaultSetter) { if (kind != OwnerKind.TRAIT_IMPL || !defaultSetter) {
FunctionGenerationStrategy strategy; FunctionGenerationStrategy strategy;
@@ -405,17 +404,21 @@ public class PropertyCodegen extends GenerationStateAware {
return JvmAbi.SETTER_PREFIX + StringUtil.capitalizeWithJavaBeanConvention(propertyName.asString()); return JvmAbi.SETTER_PREFIX + StringUtil.capitalizeWithJavaBeanConvention(propertyName.asString());
} }
public void genDelegate(PropertyDescriptor delegate, PropertyDescriptor overridden, StackValue field) { public void genDelegate(@NotNull PropertyDescriptor delegate, @NotNull PropertyDescriptor overridden, @NotNull StackValue field) {
ClassDescriptor toClass = (ClassDescriptor) overridden.getContainingDeclaration(); ClassDescriptor toClass = (ClassDescriptor) overridden.getContainingDeclaration();
functionCodegen.genDelegate(delegate.getGetter(), toClass, field, PropertyGetterDescriptor getter = delegate.getGetter();
typeMapper.mapGetterSignature(delegate, OwnerKind.IMPLEMENTATION), if (getter != null) {
typeMapper.mapGetterSignature(overridden.getOriginal(), OwnerKind.IMPLEMENTATION)); //noinspection ConstantConditions
functionCodegen.genDelegate(getter, toClass, field,
typeMapper.mapSignature(getter), typeMapper.mapSignature(overridden.getGetter().getOriginal()));
}
if (delegate.isVar()) { PropertySetterDescriptor setter = delegate.getSetter();
functionCodegen.genDelegate(delegate.getSetter(), toClass, field, if (setter != null) {
typeMapper.mapSetterSignature(delegate, OwnerKind.IMPLEMENTATION), //noinspection ConstantConditions
typeMapper.mapSetterSignature(overridden.getOriginal(), OwnerKind.IMPLEMENTATION)); functionCodegen.genDelegate(setter, toClass, field,
typeMapper.mapSignature(setter), typeMapper.mapSignature(overridden.getSetter().getOriginal()));
} }
} }
} }
@@ -55,6 +55,7 @@ import static org.jetbrains.jet.codegen.AsmUtil.getTraitImplThisParameterType;
import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.CodegenUtil.*;
import static org.jetbrains.jet.codegen.FunctionTypesUtil.getFunctionTraitClassName; import static org.jetbrains.jet.codegen.FunctionTypesUtil.getFunctionTraitClassName;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnnotationClass;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnonymousObject; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnonymousObject;
import static org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor.Kind.CLASS_STATICS; import static org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor.Kind.CLASS_STATICS;
@@ -547,8 +548,17 @@ public class JetTypeMapper extends BindingTraceAware {
@NotNull @NotNull
private static String mapFunctionName(@NotNull FunctionDescriptor descriptor) { private static String mapFunctionName(@NotNull FunctionDescriptor descriptor) {
if (descriptor instanceof PropertyAccessorDescriptor) { if (descriptor instanceof PropertyAccessorDescriptor) {
return getPropertyAccessorName(((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty(), PropertyDescriptor property = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty();
descriptor instanceof PropertyGetterDescriptor); if (isAnnotationClass(property.getContainingDeclaration())) {
return property.getName().asString();
}
if (descriptor instanceof PropertyGetterDescriptor) {
return PropertyCodegen.getterName(property.getName());
}
else {
return PropertyCodegen.setterName(property.getName());
}
} }
else if (isLocalNamedFun(descriptor) || else if (isLocalNamedFun(descriptor) ||
descriptor instanceof AnonymousFunctionDescriptor || descriptor instanceof AnonymousFunctionDescriptor ||
@@ -583,7 +593,12 @@ public class JetTypeMapper extends BindingTraceAware {
writeVoidReturn(sw); writeVoidReturn(sw);
} }
else { else {
writeFormalTypeParameters(f.getTypeParameters(), sw); if (f instanceof PropertyAccessorDescriptor) {
writeFormalTypeParameters(((PropertyAccessorDescriptor) f).getCorrespondingProperty().getTypeParameters(), sw);
}
else {
writeFormalTypeParameters(f.getTypeParameters(), sw);
}
sw.writeParametersStart(); sw.writeParametersStart();
writeThisIfNeeded(f, kind, sw); writeThisIfNeeded(f, kind, sw);
@@ -596,7 +611,12 @@ public class JetTypeMapper extends BindingTraceAware {
sw.writeReturnType(); sw.writeReturnType();
JetType returnType = f.getReturnType(); JetType returnType = f.getReturnType();
assert returnType != null : "Function " + f + " has no return type"; assert returnType != null : "Function " + f + " has no return type";
mapReturnType(returnType, sw); if (f instanceof PropertyGetterDescriptor) {
mapType(returnType, sw, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false);
}
else {
mapReturnType(returnType, sw);
}
sw.writeReturnTypeEnd(); sw.writeReturnTypeEnd();
} }
@@ -629,13 +649,7 @@ public class JetTypeMapper extends BindingTraceAware {
signatureVisitor.writeAsmType(type); signatureVisitor.writeAsmType(type);
signatureVisitor.writeParameterTypeEnd(); signatureVisitor.writeParameterTypeEnd();
} }
else { else if (isAccessor(descriptor) && descriptor.getExpectedThisObject() != null) {
writeThisForAccessorIfNeeded(descriptor, signatureVisitor);
}
}
private void writeThisForAccessorIfNeeded(@NotNull CallableMemberDescriptor descriptor, @NotNull BothSignatureWriter signatureVisitor) {
if (isAccessor(descriptor) && descriptor.getExpectedThisObject() != null) {
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS); signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureVisitor, JetTypeMapperMode.VALUE); mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureVisitor, JetTypeMapperMode.VALUE);
signatureVisitor.writeParameterTypeEnd(); signatureVisitor.writeParameterTypeEnd();
@@ -698,53 +712,6 @@ public class JetTypeMapper extends BindingTraceAware {
} }
} }
@NotNull
public static String getPropertyAccessorName(@NotNull PropertyDescriptor descriptor, boolean isGetter) {
DeclarationDescriptor parentDescriptor = descriptor.getContainingDeclaration();
boolean isAnnotation = parentDescriptor instanceof ClassDescriptor &&
((ClassDescriptor) parentDescriptor).getKind() == ClassKind.ANNOTATION_CLASS;
return isAnnotation ? descriptor.getName().asString() :
isGetter ? PropertyCodegen.getterName(descriptor.getName()) : PropertyCodegen.setterName(descriptor.getName());
}
@NotNull
public JvmMethodSignature mapGetterSignature(PropertyDescriptor descriptor, OwnerKind kind) {
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter);
signatureWriter.writeParametersStart();
writeThisIfNeeded(descriptor, kind, signatureWriter);
writeReceiverIfNeeded(descriptor.getReceiverParameter(), signatureWriter);
signatureWriter.writeReturnType();
mapType(descriptor.getType(), signatureWriter, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false);
signatureWriter.writeReturnTypeEnd();
String name = getPropertyAccessorName(descriptor, true);
return signatureWriter.makeJvmMethodSignature(name);
}
@NotNull
public JvmMethodSignature mapSetterSignature(PropertyDescriptor descriptor, OwnerKind kind) {
assert descriptor.isVar();
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter);
signatureWriter.writeParametersStart();
writeThisIfNeeded(descriptor, kind, signatureWriter);
writeReceiverIfNeeded(descriptor.getReceiverParameter(), signatureWriter);
writeParameter(signatureWriter, descriptor.getType());
writeVoidReturn(signatureWriter);
String name = getPropertyAccessorName(descriptor, false);
return signatureWriter.makeJvmMethodSignature(name);
}
private void writeParameter(@NotNull BothSignatureWriter signatureWriter, @NotNull JetType outType) { private void writeParameter(@NotNull BothSignatureWriter signatureWriter, @NotNull JetType outType) {
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE); signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE);
mapType(outType, signatureWriter, JetTypeMapperMode.VALUE); mapType(outType, signatureWriter, JetTypeMapperMode.VALUE);
@@ -0,0 +1,5 @@
class GenericProperty {
void foo() {
java.util.Map<?, ?> o = a.APackage.getTest();
}
}
@@ -0,0 +1,6 @@
// Tests that type variables of properties are written to the getter signature
package a
val <K, V> test: Map<K, V>
get() = java.util.HashMap()
@@ -31,7 +31,7 @@ import org.jetbrains.jet.jvm.compiler.AbstractCompileJavaAgainstKotlinTest;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("compiler/testData/compileJavaAgainstKotlin") @TestMetadata("compiler/testData/compileJavaAgainstKotlin")
@InnerTestClasses({CompileJavaAgainstKotlinTestGenerated.Class.class, CompileJavaAgainstKotlinTestGenerated.Method.class, CompileJavaAgainstKotlinTestGenerated.StaticFields.class}) @InnerTestClasses({CompileJavaAgainstKotlinTestGenerated.Class.class, CompileJavaAgainstKotlinTestGenerated.Method.class, CompileJavaAgainstKotlinTestGenerated.Property.class, CompileJavaAgainstKotlinTestGenerated.StaticFields.class})
public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAgainstKotlinTest { public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAgainstKotlinTest {
public void testAllFilesPresentInCompileJavaAgainstKotlin() throws Exception { public void testAllFilesPresentInCompileJavaAgainstKotlin() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/compileJavaAgainstKotlin"), Pattern.compile("^(.+)\\.kt$"), true); JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/compileJavaAgainstKotlin"), Pattern.compile("^(.+)\\.kt$"), true);
@@ -188,6 +188,19 @@ public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAg
} }
@TestMetadata("compiler/testData/compileJavaAgainstKotlin/property")
public static class Property extends AbstractCompileJavaAgainstKotlinTest {
public void testAllFilesPresentInProperty() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/compileJavaAgainstKotlin/property"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("GenericProperty.kt")
public void testGenericProperty() throws Exception {
doTest("compiler/testData/compileJavaAgainstKotlin/property/GenericProperty.kt");
}
}
@TestMetadata("compiler/testData/compileJavaAgainstKotlin/staticFields") @TestMetadata("compiler/testData/compileJavaAgainstKotlin/staticFields")
public static class StaticFields extends AbstractCompileJavaAgainstKotlinTest { public static class StaticFields extends AbstractCompileJavaAgainstKotlinTest {
public void testAllFilesPresentInStaticFields() throws Exception { public void testAllFilesPresentInStaticFields() throws Exception {
@@ -226,6 +239,7 @@ public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAg
suite.addTestSuite(CompileJavaAgainstKotlinTestGenerated.class); suite.addTestSuite(CompileJavaAgainstKotlinTestGenerated.class);
suite.addTestSuite(Class.class); suite.addTestSuite(Class.class);
suite.addTestSuite(Method.class); suite.addTestSuite(Method.class);
suite.addTestSuite(Property.class);
suite.addTestSuite(StaticFields.class); suite.addTestSuite(StaticFields.class);
return suite; return suite;
} }