From 9b0ff6b4d86b40596a543f1a0b64c833d82f0dac Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Wed, 18 Jan 2012 21:27:03 +0100 Subject: [PATCH] better location diagnostic of internal errors --- .../jet/codegen/ClassBodyCodegen.java | 3 +++ .../jet/codegen/CompilationException.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index a277a4b5444..6d353c1bf46 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -73,6 +73,9 @@ public abstract class ClassBodyCodegen { else if (declaration instanceof JetNamedFunction) { try { genNamedFunction((JetNamedFunction) declaration, functionCodegen); + } + catch(CompilationException e) { + throw e; } catch (RuntimeException e) { throw new RuntimeException("Error generating method " + myClass.getName() + "." + declaration.getName() + " in " + context, e); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java index 84f336f74a5..a52fe8b9c78 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java @@ -1,7 +1,15 @@ package org.jetbrains.jet.codegen; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.resolve.DescriptorRenderer; +import org.objectweb.asm.Label; + +import static com.intellij.openapi.compiler.CompilerMessageCategory.ERROR; /** * @author alex.tkachman @@ -17,4 +25,23 @@ public class CompilationException extends RuntimeException { public PsiElement getElement() { return element; } + + @Override + public String toString() { + PsiFile psiFile = element.getContainingFile(); + TextRange textRange = element.getTextRange(); + Document document = psiFile.getViewProvider().getDocument(); + int line; + int col; + if (document != null) { + line = document.getLineNumber(textRange.getStartOffset()); + col = textRange.getStartOffset() - document.getLineStartOffset(line) + 1; + } + else { + line = -1; + col = -1; + } + + return "Internal error: (" + (line+1) + "," + col + ") " + getCause().toString(); + } }