001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.lang.resolve.kotlin;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.annotations.Nullable;
021 import org.jetbrains.jet.descriptors.serialization.ClassData;
022 import org.jetbrains.jet.descriptors.serialization.ClassId;
023 import org.jetbrains.jet.descriptors.serialization.DescriptorFinder;
024 import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil;
025 import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
026 import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
027 import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
028 import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
029 import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
030 import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
031 import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
032 import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider;
033 import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader;
034 import org.jetbrains.jet.lang.resolve.name.FqName;
035 import org.jetbrains.jet.lang.resolve.name.Name;
036 import org.jetbrains.jet.lang.resolve.scopes.JetScope;
037 import org.jetbrains.jet.storage.StorageManager;
038
039 import javax.inject.Inject;
040 import java.util.Collection;
041
042 import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqNameToJavaFqName;
043 import static org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kind.CLASS;
044 import static org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kind.PACKAGE_FACADE;
045
046 public final class DeserializedDescriptorResolver {
047 private DescriptorDeserializers deserializers;
048
049 private MemberFilter memberFilter;
050
051 private StorageManager storageManager;
052
053 private JavaPackageFragmentProvider javaPackageFragmentProvider;
054
055 private JavaDescriptorResolver javaDescriptorResolver;
056
057 private ErrorReporter errorReporter;
058
059 @NotNull
060 private final DescriptorFinder javaDescriptorFinder = new DescriptorFinder() {
061 @Nullable
062 @Override
063 public ClassDescriptor findClass(@NotNull ClassId classId) {
064 return javaDescriptorResolver.resolveClass(kotlinFqNameToJavaFqName(classId.asSingleFqName()));
065 }
066
067 @NotNull
068 @Override
069 public Collection<Name> getClassNames(@NotNull FqName packageName) {
070 return javaPackageFragmentProvider.getClassNamesInPackage(packageName);
071 }
072 };
073
074 @Inject
075 public void setDeserializers(DescriptorDeserializers deserializers) {
076 this.deserializers = deserializers;
077 }
078
079 @Inject
080 public void setMemberFilter(MemberFilter memberFilter) {
081 this.memberFilter = memberFilter;
082 }
083
084 @Inject
085 public void setJavaPackageFragmentProvider(JavaPackageFragmentProvider javaPackageFragmentProvider) {
086 this.javaPackageFragmentProvider = javaPackageFragmentProvider;
087 }
088
089 @Inject
090 public void setJavaDescriptorResolver(JavaDescriptorResolver javaDescriptorResolver) {
091 this.javaDescriptorResolver = javaDescriptorResolver;
092 }
093
094 @Inject
095 public void setErrorReporter(ErrorReporter errorReporter) {
096 this.errorReporter = errorReporter;
097 }
098
099 @Inject
100 public void setStorageManager(StorageManager storageManager) {
101 this.storageManager = storageManager;
102 }
103
104 @Nullable
105 public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
106 String[] data = readData(kotlinClass, CLASS);
107 if (data != null) {
108 ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
109 return new DeserializedClassDescriptor(storageManager, deserializers, javaDescriptorFinder,
110 javaPackageFragmentProvider, classData.getNameResolver(), classData.getClassProto());
111 }
112 return null;
113 }
114
115 @Nullable
116 public JetScope createKotlinPackageScope(@NotNull PackageFragmentDescriptor descriptor, @NotNull KotlinJvmBinaryClass kotlinClass) {
117 String[] data = readData(kotlinClass, PACKAGE_FACADE);
118 if (data != null) {
119 return new DeserializedPackageMemberScope(storageManager, descriptor, deserializers,
120 memberFilter, javaDescriptorFinder, JavaProtoBufUtil.readPackageDataFrom(data));
121 }
122 return null;
123 }
124
125 @Nullable
126 private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
127 KotlinClassHeader header = kotlinClass.getClassHeader();
128 if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) {
129 errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion());
130 }
131 else if (header.getKind() == expectedKind) {
132 return header.getAnnotationData();
133 }
134
135 return null;
136 }
137 }