diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 202053b1d23..5ed1aa1497a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -28,7 +28,7 @@ import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.java.*; @@ -50,13 +50,14 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static org.jetbrains.jet.codegen.JvmCodegenUtil.*; -import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; +import static org.jetbrains.jet.codegen.JvmCodegenUtil.getSuperClass; +import static org.jetbrains.jet.codegen.JvmCodegenUtil.isInterface; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.ABI_VERSION_FIELD_NAME; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass; +import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.jet.lang.resolve.java.mapping.PrimitiveTypesUtil.asmTypeForPrimitive; import static org.jetbrains.jet.lang.types.TypeUtils.isNullableType; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -785,7 +786,7 @@ public class AsmUtil { container = container.getContainingDeclaration(); } - JetFile containingFile = BindingContextUtils.getContainingFile(typeMapper.getBindingContext(), originalDescriptor); + JetFile containingFile = DescriptorToSourceUtils.getContainingFile(originalDescriptor); assert containingFile != null : "Containing file should be present for " + classDescriptor; return PackagePartClassUtils.getPackagePartInternalName(containingFile); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/PsiCodegenPredictor.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/PsiCodegenPredictor.java index a0441c48e7b..a68877013b0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/PsiCodegenPredictor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/PsiCodegenPredictor.java @@ -29,8 +29,8 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; @@ -157,7 +157,7 @@ public final class PsiCodegenPredictor { for (ClassDescriptor classDescriptor : trace.getKeys(CodegenBinding.ASM_TYPE)) { Type type = trace.get(CodegenBinding.ASM_TYPE, classDescriptor); if (type != null && classInternalName.equals(type.getInternalName())) { - return BindingContextUtils.getContainingFile(trace.getBindingContext(), classDescriptor); + return DescriptorToSourceUtils.getContainingFile(classDescriptor); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 0864166afb0..0324fd567a6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -31,7 +31,10 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor; import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; @@ -131,7 +134,7 @@ public class JetTypeMapper { boolean insideModule ) { if (insideModule) { - JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor); + JetFile file = DescriptorToSourceUtils.getContainingFile(descriptor); if (file != null) { return PackagePartClassUtils.getPackagePartInternalName(file); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java index 2a32d63790f..5bb2ea6ef3f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Lists; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -62,33 +61,6 @@ public class BindingContextUtils { return null; } - @Nullable - public static JetFile getContainingFile(@NotNull BindingContext context, @NotNull DeclarationDescriptor declarationDescriptor) { - // declarationDescriptor may describe a synthesized element which doesn't have PSI - // To workaround that, we find a top-level parent (which is inside a PackageFragmentDescriptor), which is guaranteed to have PSI - DeclarationDescriptor descriptor = findTopLevelParent(declarationDescriptor); - if (descriptor == null) return null; - - PsiElement declaration = DescriptorToSourceUtils.descriptorToDeclaration(descriptor); - if (declaration == null) return null; - - PsiFile containingFile = declaration.getContainingFile(); - if (!(containingFile instanceof JetFile)) return null; - return (JetFile) containingFile; - } - - @Nullable - private static DeclarationDescriptor findTopLevelParent(@NotNull DeclarationDescriptor declarationDescriptor) { - DeclarationDescriptor descriptor = declarationDescriptor; - if (declarationDescriptor instanceof PropertyAccessorDescriptor) { - descriptor = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty(); - } - while (!(descriptor == null || DescriptorUtils.isTopLevelDeclaration(descriptor))) { - descriptor = descriptor.getContainingDeclaration(); - } - return descriptor; - } - public static void recordFunctionDeclarationToDescriptor(@NotNull BindingTrace trace, @NotNull PsiElement psiElement, @NotNull SimpleFunctionDescriptor function) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorToSourceUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorToSourceUtils.java index 931a63c9457..0c56374af76 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorToSourceUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorToSourceUtils.java @@ -18,12 +18,11 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Lists; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithSource; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.source.SourcePackage; import java.util.ArrayList; @@ -107,6 +106,33 @@ public final class DescriptorToSourceUtils { } private DescriptorToSourceUtils() {} + + @Nullable + public static JetFile getContainingFile(@NotNull DeclarationDescriptor declarationDescriptor) { + // declarationDescriptor may describe a synthesized element which doesn't have PSI + // To workaround that, we find a top-level parent (which is inside a PackageFragmentDescriptor), which is guaranteed to have PSI + DeclarationDescriptor descriptor = findTopLevelParent(declarationDescriptor); + if (descriptor == null) return null; + + PsiElement declaration = descriptorToDeclaration(descriptor); + if (declaration == null) return null; + + PsiFile containingFile = declaration.getContainingFile(); + if (!(containingFile instanceof JetFile)) return null; + return (JetFile) containingFile; + } + + @Nullable + private static DeclarationDescriptor findTopLevelParent(@NotNull DeclarationDescriptor declarationDescriptor) { + DeclarationDescriptor descriptor = declarationDescriptor; + if (declarationDescriptor instanceof PropertyAccessorDescriptor) { + descriptor = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty(); + } + while (!(descriptor == null || DescriptorUtils.isTopLevelDeclaration(descriptor))) { + descriptor = descriptor.getContainingDeclaration(); + } + return descriptor; + } }