Introduce method for getting element with context for better error reports

This commit is contained in:
Nikolay Krasko
2013-08-15 17:35:43 +04:00
parent 491150cf22
commit e984ce2aa8
2 changed files with 27 additions and 1 deletions
@@ -20,6 +20,7 @@ import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.intellij.psi.impl.CheckUtil;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
@@ -946,4 +947,28 @@ public class JetPsiUtil {
}
return element;
}
@NotNull
public static String getElementTextWithContext(@NotNull JetElement element) {
if (element instanceof JetFile) {
return element.getContainingFile().getText();
}
// Find parent for element among file children
PsiElement inFileParent = PsiTreeUtil.findFirstParent(element, new Condition<PsiElement>() {
@Override
public boolean value(PsiElement parentCandidate) {
return parentCandidate != null && parentCandidate.getParent() instanceof JetFile;
}
});
assert inFileParent != null : "For non-file element we should always be able to find parent in file children";
int startContextOffset = inFileParent.getTextRange().getStartOffset();
int elementContextOffset = element.getTextRange().getStartOffset();
int inFileParentOffset = elementContextOffset - startContextOffset;
return new StringBuilder(inFileParent.getText()).insert(inFileParentOffset, "<caret>").toString();
}
}
@@ -341,7 +341,8 @@ public class ResolveSession implements KotlinCodeAnalyzer {
@Override
public DeclarationDescriptor visitJetElement(JetElement element, Void data) {
throw new IllegalArgumentException("Unsupported declaration type: " + element + " " + element.getText());
throw new IllegalArgumentException("Unsupported declaration type: " + element + " " +
JetPsiUtil.getElementTextWithContext(element));
}
}, null);
if (result == null) {