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 9f5c43b25b9..e77a220a01a 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 @@ -19,6 +19,7 @@ package org.jetbrains.jet.descriptors.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer; +import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; @@ -226,11 +227,10 @@ public class DescriptorDeserializer { @NotNull private CallableMemberDescriptor loadFunction(@NotNull Callable proto) { int flags = proto.getFlags(); - SimpleFunctionDescriptorImpl function = new SimpleFunctionDescriptorImpl( - containingDeclaration, - getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION), - nameResolver.getName(proto.getName()), - memberKind(Flags.MEMBER_KIND.get(flags)) + DeserializedSimpleFunctionDescriptor function = new DeserializedSimpleFunctionDescriptor( + containingDeclaration, proto, + annotationDeserializer, + nameResolver ); List typeParameters = new ArrayList(proto.getTypeParameterCount()); DescriptorDeserializer local = createChildDeserializer(function, proto.getTypeParameterList(), typeParameters); @@ -274,6 +274,17 @@ public class DescriptorDeserializer { @NotNull private List getAnnotations(@NotNull Callable proto, int flags, @NotNull AnnotatedCallableKind kind) { + return getAnnotations(containingDeclaration, proto, flags, kind, annotationDeserializer, nameResolver); + } + + public static List getAnnotations( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull Callable proto, + int flags, + @NotNull AnnotatedCallableKind kind, + @NotNull AnnotationDeserializer annotationDeserializer, + @NotNull NameResolver nameResolver + ) { assert containingDeclaration instanceof ClassOrNamespaceDescriptor : "Only members in classes or namespaces should be serialized: " + containingDeclaration; return Flags.HAS_ANNOTATIONS.get(flags) @@ -282,7 +293,7 @@ public class DescriptorDeserializer { : Collections.emptyList(); } - private static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) { + public static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) { switch (memberKind) { case DECLARATION: return CallableMemberDescriptor.Kind.DECLARATION; 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 new file mode 100644 index 00000000000..9702539fb88 --- /dev/null +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedSimpleFunctionDescriptor.java @@ -0,0 +1,118 @@ +/* + * Copyright 2010-2013 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.annotations.NotNull; +import org.jetbrains.jet.descriptors.serialization.DescriptorDeserializer; +import org.jetbrains.jet.descriptors.serialization.Flags; +import org.jetbrains.jet.descriptors.serialization.NameResolver; +import org.jetbrains.jet.descriptors.serialization.ProtoBuf; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; +import org.jetbrains.jet.lang.resolve.name.Name; + +import java.util.List; + +public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescriptorImpl { + + private final ProtoBuf.Callable functionProto; + private final NameResolver nameResolver; + + private DeserializedSimpleFunctionDescriptor( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull List annotations, + @NotNull Name name, + @NotNull Kind kind, + @NotNull ProtoBuf.Callable functionProto, + @NotNull NameResolver nameResolver + ) { + super(containingDeclaration, annotations, name, kind); + this.functionProto = functionProto; + this.nameResolver = nameResolver; + } + + private DeserializedSimpleFunctionDescriptor( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull SimpleFunctionDescriptor original, + @NotNull List annotations, + @NotNull Name name, + @NotNull Kind kind, + @NotNull ProtoBuf.Callable functionProto, + @NotNull NameResolver nameResolver) { + super(containingDeclaration, original, annotations, name, kind); + this.functionProto = functionProto; + this.nameResolver = nameResolver; + } + + public DeserializedSimpleFunctionDescriptor( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull ProtoBuf.Callable functionProto, + @NotNull AnnotationDeserializer annotationDeserializer, + @NotNull NameResolver nameResolver + ) { + this(containingDeclaration, + DescriptorDeserializer.getAnnotations(containingDeclaration, functionProto, functionProto.getFlags(), + AnnotationDeserializer.AnnotatedCallableKind.FUNCTION, annotationDeserializer, + nameResolver), + nameResolver.getName(functionProto.getName()), + DescriptorDeserializer.memberKind(Flags.MEMBER_KIND.get(functionProto.getFlags())), + functionProto, + nameResolver); + } + + @Override + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal, Kind kind) { + if (preserveOriginal) { + return new DeserializedSimpleFunctionDescriptor( + newOwner, + getOriginal(), + getAnnotations(), + getName(), + kind, + functionProto, + nameResolver + ); + } + else { + return new DeserializedSimpleFunctionDescriptor( + newOwner, + getAnnotations(), + getName(), + kind, + functionProto, + nameResolver + ); + } + } + + @NotNull + @Override + public DeserializedSimpleFunctionDescriptor getOriginal() { + return (DeserializedSimpleFunctionDescriptor) super.getOriginal(); + } + + public ProtoBuf.Callable getFunctionProto() { + return functionProto; + } + + public NameResolver getNameResolver() { + return nameResolver; + } +} diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java index d56f960c95e..daba8bf062b 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -41,7 +41,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme super(containingDeclaration, annotations, name, kind); } - private SimpleFunctionDescriptorImpl( + protected SimpleFunctionDescriptorImpl( @NotNull DeclarationDescriptor containingDeclaration, @NotNull SimpleFunctionDescriptor original, @NotNull List annotations,