From 528148a083b36b6f6248128ab48ffa2f36e129f5 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 24 Feb 2014 20:32:20 +0400 Subject: [PATCH] Decompiler: introduce ResolverForDecompiler as dependency for DecompiledDataFactory Extract JDR based implementation of ResolverForDecompiler from DecompiledDataFactory --- .../libraries/DecompiledDataFactory.java | 26 ++++-------- .../ProjectBasedResolverForDecompiler.kt | 41 +++++++++++++++++++ .../plugin/libraries/ResolverForDecompiler.kt | 26 ++++++++++++ 3 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/libraries/ProjectBasedResolverForDecompiler.kt create mode 100644 idea/src/org/jetbrains/jet/plugin/libraries/ResolverForDecompiler.kt diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index 2376050a052..b55cafd1b8f 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -21,13 +21,9 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiManager; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; -import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.MemberComparator; -import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.KotlinBinaryClassCache; import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass; import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader; @@ -50,7 +46,7 @@ public final class DecompiledDataFactory { @NotNull private final Map renderedDescriptorsToRange = new HashMap(); @NotNull - private final JavaDescriptorResolver javaDescriptorResolver; + private final ResolverForDecompiler resolver; @NotNull private final KotlinClassHeader classFileHeader; @NotNull @@ -60,11 +56,9 @@ public final class DecompiledDataFactory { @NotNull private final Project project; - private DecompiledDataFactory(@NotNull VirtualFile classFile, @NotNull Project project) { + private DecompiledDataFactory(@NotNull VirtualFile classFile, @NotNull Project project, @NotNull ResolverForDecompiler resolver) { this.classFile = classFile; this.project = project; - InjectorForJavaDescriptorResolver injector = InjectorForJavaDescriptorResolverUtil.create(project, new BindingTraceContext()); - this.javaDescriptorResolver = injector.getJavaDescriptorResolver(); KotlinJvmBinaryClass kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile); this.classFqName = kotlinClass.getClassName().getFqNameForClassNameWithoutDollars(); @@ -72,11 +66,12 @@ public final class DecompiledDataFactory { KotlinClassHeader header = kotlinClass.getClassHeader(); assert header != null : "Decompiled data factory shouldn't be called on an unsupported file: " + classFile; this.classFileHeader = header; + this.resolver = resolver; } @NotNull static JetDecompiledData createDecompiledData(@NotNull VirtualFile virtualFile, @NotNull Project project) { - return new DecompiledDataFactory(virtualFile, project).build(); + return new DecompiledDataFactory(virtualFile, project, new ProjectBasedResolverForDecompiler(project)).build(); } private JetDecompiledData build() { @@ -84,18 +79,15 @@ public final class DecompiledDataFactory { appendDecompiledTextAndPackageName(packageFqName); KotlinClassHeader.Kind kind = classFileHeader.getKind(); if (kind == KotlinClassHeader.Kind.PACKAGE_FACADE) { - PackageFragmentDescriptor pf = javaDescriptorResolver.getPackageFragment(packageFqName); - if (pf != null) { - for (DeclarationDescriptor member : sortDeclarations(pf.getMemberScope().getAllDescriptors())) { - if (!(member instanceof ClassDescriptor)) { - appendDescriptor(member, ""); - builder.append("\n"); - } + for (DeclarationDescriptor member : sortDeclarations(resolver.resolveDeclarationsInPackage(packageFqName))) { + if (!(member instanceof ClassDescriptor)) { + appendDescriptor(member, ""); + builder.append("\n"); } } } else if (kind == KotlinClassHeader.Kind.CLASS) { - ClassDescriptor cd = javaDescriptorResolver.resolveClass(classFqName); + ClassDescriptor cd = resolver.resolveClass(classFqName); if (cd != null) { appendDescriptor(cd, ""); } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/ProjectBasedResolverForDecompiler.kt b/idea/src/org/jetbrains/jet/plugin/libraries/ProjectBasedResolverForDecompiler.kt new file mode 100644 index 00000000000..f094cbf7d61 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/libraries/ProjectBasedResolverForDecompiler.kt @@ -0,0 +1,41 @@ +/* + * 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.plugin.libraries + +import org.jetbrains.jet.lang.resolve.name.FqName +import org.jetbrains.jet.lang.descriptors.ClassDescriptor +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil +import com.intellij.openapi.project.Project +import org.jetbrains.jet.lang.resolve.BindingTraceContext +import java.util.Collections + +public class ProjectBasedResolverForDecompiler(project: Project) : ResolverForDecompiler { + val javaDescriptorResolver = InjectorForJavaDescriptorResolverUtil.create(project, BindingTraceContext()).getJavaDescriptorResolver()!! + + override fun resolveClass(classFqName: FqName): ClassDescriptor? { + return javaDescriptorResolver.resolveClass(classFqName) + } + + override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection { + val packageFragment = javaDescriptorResolver.getPackageFragment(packageFqName) + if (packageFragment == null) { + return Collections.emptyList() + } + return packageFragment.getMemberScope().getAllDescriptors() + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/ResolverForDecompiler.kt b/idea/src/org/jetbrains/jet/plugin/libraries/ResolverForDecompiler.kt new file mode 100644 index 00000000000..c4df77ff697 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/libraries/ResolverForDecompiler.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.plugin.libraries + +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import org.jetbrains.jet.lang.resolve.name.FqName +import org.jetbrains.jet.lang.descriptors.ClassDescriptor + +trait ResolverForDecompiler { + fun resolveClass(classFqName: FqName): ClassDescriptor? + fun resolveDeclarationsInPackage(packageFqName: FqName): Collection +} \ No newline at end of file