Write line numbers for bridge methods (line for class header)

This commit is contained in:
Natalia Ukhorskaya
2014-10-31 15:57:13 +03:00
parent 0047655ed3
commit 4eb93c06b1
6 changed files with 69 additions and 12 deletions
@@ -28,6 +28,7 @@ import com.intellij.util.Function;
import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.backend.common.CodegenUtil;
import org.jetbrains.jet.codegen.binding.CalculatedClosure;
import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.context.*;
@@ -1553,19 +1554,15 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
public void markLineNumber(@NotNull JetElement statement, boolean markEndOffset) {
Document document = statement.getContainingFile().getViewProvider().getDocument();
if (document != null) {
TextRange textRange = statement.getTextRange();
int lineNumber = document.getLineNumber(markEndOffset ? textRange.getEndOffset() : textRange.getStartOffset()); // 0-based
if (lineNumber == myLastLineNumber) {
return;
}
myLastLineNumber = lineNumber;
Label label = new Label();
v.visitLabel(label);
v.visitLineNumber(lineNumber + 1, label); // 1-based
Integer lineNumber = CodegenUtil.getLineNumberForElement(statement, markEndOffset);
if (lineNumber == null || lineNumber == myLastLineNumber) {
return;
}
myLastLineNumber = lineNumber;
Label label = new Label();
v.visitLabel(label);
v.visitLineNumber(lineNumber, label);
}
private void doFinallyOnReturn() {
@@ -25,6 +25,7 @@ import com.intellij.util.containers.ContainerUtil;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.backend.common.CodegenUtil;
import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.bridges.Bridge;
import org.jetbrains.jet.codegen.bridges.BridgesPackage;
@@ -70,6 +71,7 @@ import static org.jetbrains.jet.codegen.JvmSerializationBindings.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalNamedFun;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.callableDescriptorToDeclaration;
import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.classDescriptorToDeclaration;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isFunctionLiteral;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
@@ -780,6 +782,16 @@ public class FunctionCodegen extends ParentCodegenAware {
mv.visitCode();
PsiElement classElement = classDescriptorToDeclaration(owner.getThisDescriptor());
if (classElement != null) {
Integer lineNumber = CodegenUtil.getLineNumberForElement(classElement, false);
if (lineNumber != null) {
Label label = new Label();
mv.visitLabel(label);
mv.visitLineNumber(lineNumber, label);
}
}
Type[] argTypes = bridge.getArgumentTypes();
Type[] originalArgTypes = delegateTo.getArgumentTypes();