From 5e9e0acc34a2911bb1f9fda4c5a8330310f22380 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 14 Feb 2014 20:31:56 +0400 Subject: [PATCH] Introduced trait for deserialized callable and implementations. --- .../jetbrains/jet/codegen/PackageCodegen.java | 4 +- .../jet/codegen/inline/InlineCodegenUtil.java | 2 +- .../serialization/DescriptorDeserializer.java | 7 +- .../DeserializedCallableMemberDescriptor.kt | 26 ++++++++ .../DeserializedPropertyDescriptor.kt | 54 +++++++++++++++ .../DeserializedSimpleFunctionDescriptor.java | 28 ++++---- .../recursiveProcessor/declarations.txt | 66 +++++++++---------- .../lang/descriptors/CallableDescriptor.java | 3 + .../impl/PropertyDescriptorImpl.java | 17 ++++- 9 files changed, 154 insertions(+), 53 deletions(-) create mode 100644 compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedCallableMemberDescriptor.kt create mode 100644 compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPropertyDescriptor.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java index acecc7caec4..57c429e27a3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java @@ -390,10 +390,10 @@ public class PackageCodegen extends GenerationStateAware { DeclarationDescriptor parent = deserializedFunction.getContainingDeclaration(); assert parent instanceof PackageFragmentDescriptor : "parent should be package, but was: " + parent; - assert deserializedFunction.getFunctionProto().hasExtension(JavaProtoBuf.implClassName) + assert deserializedFunction.getProto().hasExtension(JavaProtoBuf.implClassName) : "implClassName extension is absent for " + deserializedFunction; Name shortName = deserializedFunction.getNameResolver() - .getName(deserializedFunction.getFunctionProto().getExtension(JavaProtoBuf.implClassName)); + .getName(deserializedFunction.getProto().getExtension(JavaProtoBuf.implClassName)); FqName packagePartFqName = ((PackageFragmentDescriptor) parent).getFqName().child(shortName); return JvmClassName.byFqNameWithoutInnerClasses(packagePartFqName).getInternalName(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegenUtil.java index e7cd9124d02..6af1bf27f70 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegenUtil.java @@ -85,7 +85,7 @@ public class InlineCodegenUtil { VirtualFile file; DeclarationDescriptor parentDeclaration = deserializedDescriptor.getContainingDeclaration(); if (parentDeclaration instanceof PackageFragmentDescriptor) { - ProtoBuf.Callable proto = deserializedDescriptor.getFunctionProto(); + ProtoBuf.Callable proto = deserializedDescriptor.getProto(); if (!proto.hasExtension(JavaProtoBuf.implClassName)) { throw new IllegalStateException("Function in namespace should have implClassName property in proto: " + deserializedDescriptor); } diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index e7a56f5993b..966fd64a82d 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -136,14 +136,17 @@ public class DescriptorDeserializer { private PropertyDescriptor loadProperty(@NotNull final Callable proto) { final int flags = proto.getFlags(); - PropertyDescriptorImpl property = new PropertyDescriptorImpl( + DeserializedPropertyDescriptor property = new DeserializedPropertyDescriptor( + null, containingDeclaration, getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY), modality(Flags.MODALITY.get(flags)), visibility(Flags.VISIBILITY.get(flags)), Flags.CALLABLE_KIND.get(flags) == Callable.CallableKind.VAR, nameResolver.getName(proto.getName()), - memberKind(Flags.MEMBER_KIND.get(flags)) + memberKind(Flags.MEMBER_KIND.get(flags)), + proto, + nameResolver ); List typeParameters = new ArrayList(proto.getTypeParameterCount()); diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedCallableMemberDescriptor.kt b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedCallableMemberDescriptor.kt new file mode 100644 index 00000000000..1cd9379bf68 --- /dev/null +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedCallableMemberDescriptor.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.descriptors.serialization.descriptors + +import org.jetbrains.jet.descriptors.serialization.ProtoBuf +import org.jetbrains.jet.descriptors.serialization.NameResolver +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor + +public trait DeserializedCallableMemberDescriptor: CallableMemberDescriptor { + public val proto: ProtoBuf.Callable + public val nameResolver: NameResolver +} \ No newline at end of file diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPropertyDescriptor.kt b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPropertyDescriptor.kt new file mode 100644 index 00000000000..65380840f60 --- /dev/null +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPropertyDescriptor.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.descriptors.serialization.descriptors + +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import org.jetbrains.jet.lang.descriptors.Modality +import org.jetbrains.jet.lang.resolve.name.Name +import org.jetbrains.jet.lang.descriptors.annotations.Annotations +import org.jetbrains.jet.lang.descriptors.Visibility +import org.jetbrains.jet.descriptors.serialization.NameResolver +import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl +import org.jetbrains.jet.descriptors.serialization.ProtoBuf +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind + +public class DeserializedPropertyDescriptor( + original: PropertyDescriptor?, + containingDeclaration: DeclarationDescriptor, + annotations: Annotations, + modality: Modality, + visibility: Visibility, + isVar: Boolean, + name: Name, + kind: Kind, + override public val proto: ProtoBuf.Callable, + override public val nameResolver: NameResolver +) : DeserializedCallableMemberDescriptor, + PropertyDescriptorImpl(original, containingDeclaration, annotations, modality, visibility, isVar, name, kind) { + + override fun createSubstitutedCopy( + newOwner: DeclarationDescriptor, + newModality: Modality, + newVisibility: Visibility, + original: PropertyDescriptor?, + kind: Kind + ): PropertyDescriptorImpl { + return DeserializedPropertyDescriptor( + original, newOwner, getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, proto, nameResolver) + } +} \ No newline at end of file diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedSimpleFunctionDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedSimpleFunctionDescriptor.java index d5624e05b21..54f227b8bde 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedSimpleFunctionDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedSimpleFunctionDescriptor.java @@ -29,9 +29,9 @@ import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.resolve.name.Name; -public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescriptorImpl { +public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescriptorImpl implements DeserializedCallableMemberDescriptor { - private final ProtoBuf.Callable functionProto; + private final ProtoBuf.Callable proto; private final NameResolver nameResolver; private DeserializedSimpleFunctionDescriptor( @@ -40,10 +40,10 @@ public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescript @NotNull Annotations annotations, @NotNull Name name, @NotNull Kind kind, - @NotNull ProtoBuf.Callable functionProto, + @NotNull ProtoBuf.Callable proto, @NotNull NameResolver nameResolver) { super(containingDeclaration, original, annotations, name, kind); - this.functionProto = functionProto; + this.proto = proto; this.nameResolver = nameResolver; } @@ -55,7 +55,7 @@ public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescript getAnnotations(), getName(), kind, - functionProto, + proto, nameResolver ); } @@ -66,21 +66,25 @@ public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescript return (DeserializedSimpleFunctionDescriptor) super.getOriginal(); } - public ProtoBuf.Callable getFunctionProto() { - return functionProto; + @NotNull + @Override + public ProtoBuf.Callable getProto() { + return proto; } + @NotNull + @Override public NameResolver getNameResolver() { return nameResolver; } public static DeserializedSimpleFunctionDescriptor create( @NotNull DeclarationDescriptor containingDeclaration, - @NotNull ProtoBuf.Callable functionProto, + @NotNull ProtoBuf.Callable proto, @NotNull Deserializers deserializers, @NotNull NameResolver nameResolver ) { - Annotations annotations = DescriptorDeserializer.getAnnotations(containingDeclaration, functionProto, functionProto.getFlags(), + Annotations annotations = DescriptorDeserializer.getAnnotations(containingDeclaration, proto, proto.getFlags(), Deserializers.AnnotatedCallableKind.FUNCTION, deserializers.getAnnotationDeserializer(), nameResolver); @@ -88,9 +92,9 @@ public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescript containingDeclaration, null, annotations, - nameResolver.getName(functionProto.getName()), - DescriptorDeserializer.memberKind(Flags.MEMBER_KIND.get(functionProto.getFlags())), - functionProto, + nameResolver.getName(proto.getName()), + DescriptorDeserializer.memberKind(Flags.MEMBER_KIND.get(proto.getFlags())), + proto, nameResolver); } } diff --git a/compiler/testData/recursiveProcessor/declarations.txt b/compiler/testData/recursiveProcessor/declarations.txt index dfe5a08d4cf..c2ee0da495e 100644 --- a/compiler/testData/recursiveProcessor/declarations.txt +++ b/compiler/testData/recursiveProcessor/declarations.txt @@ -50,46 +50,46 @@ Trait.traitFunc:SimpleFunctionDescriptor Trait.traitProp:PropertyDescriptor Trait:ClassDescriptorWithResolutionScopes a:ValueParameterDescriptor -fake .equals:SimpleFunctionDescriptor -fake .hashCode:SimpleFunctionDescriptor -fake .toString:SimpleFunctionDescriptor -fake .equals:SimpleFunctionDescriptor -fake .hashCode:SimpleFunctionDescriptor -fake .toString:SimpleFunctionDescriptor -fake .equals:SimpleFunctionDescriptor -fake .hashCode:SimpleFunctionDescriptor +fake .equals:DeserializedCallableMemberDescriptor +fake .hashCode:DeserializedCallableMemberDescriptor +fake .toString:DeserializedCallableMemberDescriptor +fake .equals:DeserializedCallableMemberDescriptor +fake .hashCode:DeserializedCallableMemberDescriptor +fake .toString:DeserializedCallableMemberDescriptor +fake .equals:DeserializedCallableMemberDescriptor +fake .hashCode:DeserializedCallableMemberDescriptor fake .nestedFunc:SimpleFunctionDescriptor -fake .toString:SimpleFunctionDescriptor +fake .toString:DeserializedCallableMemberDescriptor fake .:PropertyGetterDescriptor -fake .equals:SimpleFunctionDescriptor -fake .hashCode:SimpleFunctionDescriptor +fake .equals:DeserializedCallableMemberDescriptor +fake .hashCode:DeserializedCallableMemberDescriptor fake .objFunc:SimpleFunctionDescriptor fake .objProp:PropertyDescriptor -fake .toString:SimpleFunctionDescriptor +fake .toString:DeserializedCallableMemberDescriptor fake Class.:PropertyGetterDescriptor -fake Class.equals:SimpleFunctionDescriptor -fake Class.hashCode:SimpleFunctionDescriptor -fake Class.toString:SimpleFunctionDescriptor +fake Class.equals:DeserializedCallableMemberDescriptor +fake Class.hashCode:DeserializedCallableMemberDescriptor +fake Class.toString:DeserializedCallableMemberDescriptor fake Class.traitFunc:SimpleFunctionDescriptor fake Class.traitProp:PropertyDescriptor -fake NestedClass.equals:SimpleFunctionDescriptor -fake NestedClass.hashCode:SimpleFunctionDescriptor -fake NestedClass.toString:SimpleFunctionDescriptor -fake NestedObject.equals:SimpleFunctionDescriptor -fake NestedObject.hashCode:SimpleFunctionDescriptor -fake NestedObject.toString:SimpleFunctionDescriptor -fake NestedTrait.equals:SimpleFunctionDescriptor -fake NestedTrait.hashCode:SimpleFunctionDescriptor -fake NestedTrait.toString:SimpleFunctionDescriptor -fake Object.equals:SimpleFunctionDescriptor -fake Object.hashCode:SimpleFunctionDescriptor -fake Object.toString:SimpleFunctionDescriptor -fake Outer.equals:SimpleFunctionDescriptor -fake Outer.hashCode:SimpleFunctionDescriptor -fake Outer.toString:SimpleFunctionDescriptor -fake Trait.equals:SimpleFunctionDescriptor -fake Trait.hashCode:SimpleFunctionDescriptor -fake Trait.toString:SimpleFunctionDescriptor +fake NestedClass.equals:DeserializedCallableMemberDescriptor +fake NestedClass.hashCode:DeserializedCallableMemberDescriptor +fake NestedClass.toString:DeserializedCallableMemberDescriptor +fake NestedObject.equals:DeserializedCallableMemberDescriptor +fake NestedObject.hashCode:DeserializedCallableMemberDescriptor +fake NestedObject.toString:DeserializedCallableMemberDescriptor +fake NestedTrait.equals:DeserializedCallableMemberDescriptor +fake NestedTrait.hashCode:DeserializedCallableMemberDescriptor +fake NestedTrait.toString:DeserializedCallableMemberDescriptor +fake Object.equals:DeserializedCallableMemberDescriptor +fake Object.hashCode:DeserializedCallableMemberDescriptor +fake Object.toString:DeserializedCallableMemberDescriptor +fake Outer.equals:DeserializedCallableMemberDescriptor +fake Outer.hashCode:DeserializedCallableMemberDescriptor +fake Outer.toString:DeserializedCallableMemberDescriptor +fake Trait.equals:DeserializedCallableMemberDescriptor +fake Trait.hashCode:DeserializedCallableMemberDescriptor +fake Trait.toString:DeserializedCallableMemberDescriptor func.this:ReceiverParameterDescriptor innerTest.:PropertyGetterDescriptor innerTest.:PropertyGetterDescriptor diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java index caaca466de5..8709d1688ce 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.descriptors; +import jet.runtime.typeinfo.KotlinSignature; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.types.JetType; @@ -52,6 +53,8 @@ public interface CallableDescriptor extends DeclarationDescriptorWithVisibility, boolean hasStableParameterNames(); + // Workaround for KT-4609 Wildcard types (super/extends) shouldn't be loaded as nullable + @KotlinSignature("fun getOverriddenDescriptors(): Set") @NotNull Set getOverriddenDescriptors(); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java index b84c82ff4b9..9299e016454 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/PropertyDescriptorImpl.java @@ -52,7 +52,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorImpl implements Pr private PropertySetterDescriptor setter; private boolean setterProjectedOut; - private PropertyDescriptorImpl( + protected PropertyDescriptorImpl( @Nullable PropertyDescriptor original, @NotNull DeclarationDescriptor containingDeclaration, @NotNull Annotations annotations, @@ -216,8 +216,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorImpl implements Pr private PropertyDescriptor doSubstitute(TypeSubstitutor originalSubstitutor, DeclarationDescriptor newOwner, Modality newModality, Visibility newVisibility, boolean preserveOriginal, boolean copyOverrides, Kind kind) { - PropertyDescriptorImpl substitutedDescriptor = new PropertyDescriptorImpl(preserveOriginal ? getOriginal() : null, newOwner, - getAnnotations(), newModality, newVisibility, isVar(), getName(), kind); + PropertyDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner, newModality, newVisibility, preserveOriginal ? getOriginal() : null, kind); List substitutedTypeParameters = Lists.newArrayList(); TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(getTypeParameters(), originalSubstitutor, substitutedDescriptor, substitutedTypeParameters); @@ -291,6 +290,18 @@ public class PropertyDescriptorImpl extends VariableDescriptorImpl implements Pr return substitutedDescriptor; } + @NotNull + protected PropertyDescriptorImpl createSubstitutedCopy( + @NotNull DeclarationDescriptor newOwner, + @NotNull Modality newModality, + @NotNull Visibility newVisibility, + @Nullable PropertyDescriptor original, + @NotNull Kind kind + ) { + return new PropertyDescriptorImpl(original, newOwner, + getAnnotations(), newModality, newVisibility, isVar(), getName(), kind); + } + @NotNull private static Visibility convertVisibility(Visibility orig, Visibility candidate) { if (candidate == Visibilities.INHERITED) {