Update JetExceptionFilter behavior for top level closures

Now JetExceptionFilter can determine the source file looking at the class FQ
name for sure
This commit is contained in:
Alexander Udalov
2014-09-24 19:27:31 +04:00
parent 43c26d0947
commit e2273a3d85
5 changed files with 62 additions and 85 deletions
@@ -52,7 +52,7 @@ public class CodegenBinding {
public static final WritableSlice<ScriptDescriptor, ClassDescriptor> CLASS_FOR_SCRIPT = Slices.createSimpleSlice();
public static final WritableSlice<ClassDescriptor, Type> ASM_TYPE = Slices.createCollectiveSlice();
public static final WritableSlice<ClassDescriptor, Type> ASM_TYPE = Slices.createSimpleSlice();
public static final WritableSlice<ClassDescriptor, Boolean> ENUM_ENTRY_CLASS_NEED_SUBCLASS = Slices.createSimpleSetSlice();
@@ -16,30 +16,18 @@
package org.jetbrains.jet.codegen.binding;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.AsmUtil;
import org.jetbrains.jet.codegen.ClassBuilderFactories;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
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.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.kotlin.PackagePartClassUtils;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.org.objectweb.asm.Type;
import java.util.ArrayList;
import java.util.Collection;
import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.descriptorToDeclaration;
public final class PsiCodegenPredictor {
@@ -126,39 +114,4 @@ public final class PsiCodegenPredictor {
return parentInternalName + (parentDeclaration == null ? "/" : "$") + name.asString();
}
@Nullable
public static JetFile getFileForPackagePartName(@NotNull Collection<JetFile> allPackageFiles, @NotNull JvmClassName className) {
for (JetFile file : allPackageFiles) {
String internalName = PackagePartClassUtils.getPackagePartInternalName(file);
JvmClassName jvmClassName = JvmClassName.byInternalName(internalName);
if (jvmClassName.equals(className)) {
return file;
}
}
return null;
}
@Nullable
public static JetFile getFileForCodegenNamedClass(
@NotNull ModuleDescriptor module,
@NotNull BindingContext context,
@NotNull Collection<JetFile> allPackageFiles,
@NotNull String classInternalName
) {
Project project = allPackageFiles.iterator().next().getProject();
GenerationState state = new GenerationState(project, ClassBuilderFactories.THROW_EXCEPTION, module, context,
new ArrayList<JetFile>(allPackageFiles));
state.beforeCompile();
BindingTrace trace = state.getBindingTrace();
for (ClassDescriptor classDescriptor : trace.getKeys(CodegenBinding.ASM_TYPE)) {
Type type = trace.get(CodegenBinding.ASM_TYPE, classDescriptor);
if (type != null && classInternalName.equals(type.getInternalName())) {
return DescriptorToSourceUtils.getContainingFile(classDescriptor);
}
}
return null;
}
}