Merge remote branch 'origin/master'
This commit is contained in:
@@ -63,6 +63,8 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
private final Stack<Label> myBreakTargets = new Stack<Label>();
|
private final Stack<Label> myBreakTargets = new Stack<Label>();
|
||||||
private final Stack<StackValue> myStack = new Stack<StackValue>();
|
private final Stack<StackValue> myStack = new Stack<StackValue>();
|
||||||
|
|
||||||
|
private int myLastLineNumber = -1;
|
||||||
|
|
||||||
private static final String[] PRIMITIVE_TYPE_INFO_FIELDS = {
|
private static final String[] PRIMITIVE_TYPE_INFO_FIELDS = {
|
||||||
null,
|
null,
|
||||||
"BOOL_TYPE_INFO",
|
"BOOL_TYPE_INFO",
|
||||||
@@ -116,7 +118,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void gen(JetElement expr) {
|
private void gen(JetElement expr) {
|
||||||
if (expr == null) throw new CompilationException();
|
markLineNumber(expr);
|
||||||
expr.accept(this);
|
expr.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,7 +584,6 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
|
|
||||||
for (int i = 0, statementsSize = statements.size(); i < statementsSize; i++) {
|
for (int i = 0, statementsSize = statements.size(); i < statementsSize; i++) {
|
||||||
JetElement statement = statements.get(i);
|
JetElement statement = statements.get(i);
|
||||||
markLineNumber(statement);
|
|
||||||
if (i == statements.size() - 1) {
|
if (i == statements.size() - 1) {
|
||||||
gen(statement);
|
gen(statement);
|
||||||
}
|
}
|
||||||
@@ -609,10 +610,15 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
private void markLineNumber(JetElement statement) {
|
private void markLineNumber(JetElement statement) {
|
||||||
final Document document = statement.getContainingFile().getViewProvider().getDocument();
|
final Document document = statement.getContainingFile().getViewProvider().getDocument();
|
||||||
if (document != null) {
|
if (document != null) {
|
||||||
int lineNumber = document.getLineNumber(statement.getTextRange().getStartOffset());
|
int lineNumber = document.getLineNumber(statement.getTextRange().getStartOffset()); // 0-based
|
||||||
|
if (lineNumber == myLastLineNumber) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
myLastLineNumber = lineNumber;
|
||||||
|
|
||||||
Label label = new Label();
|
Label label = new Label();
|
||||||
v.visitLabel(label);
|
v.visitLabel(label);
|
||||||
v.visitLineNumber(lineNumber, label);
|
v.visitLineNumber(lineNumber+1, label); // 1-based
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,11 @@ import com.intellij.debugger.PositionManager;
|
|||||||
import com.intellij.debugger.SourcePosition;
|
import com.intellij.debugger.SourcePosition;
|
||||||
import com.intellij.debugger.engine.DebugProcess;
|
import com.intellij.debugger.engine.DebugProcess;
|
||||||
import com.intellij.debugger.requests.ClassPrepareRequestor;
|
import com.intellij.debugger.requests.ClassPrepareRequestor;
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
|
import com.intellij.psi.search.FilenameIndex;
|
||||||
|
import com.intellij.psi.search.ProjectScope;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
import com.sun.jdi.AbsentInformationException;
|
import com.sun.jdi.AbsentInformationException;
|
||||||
import com.sun.jdi.Location;
|
import com.sun.jdi.Location;
|
||||||
@@ -37,11 +40,41 @@ public class JetPositionManager implements PositionManager {
|
|||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public SourcePosition getSourcePosition(@Nullable Location location) throws NoDataException {
|
public SourcePosition getSourcePosition(@Nullable Location location) throws NoDataException {
|
||||||
|
if (location == null) {
|
||||||
|
throw new NoDataException();
|
||||||
|
}
|
||||||
PsiFile psiFile = getPsiFileByLocation(location);
|
PsiFile psiFile = getPsiFileByLocation(location);
|
||||||
|
|
||||||
|
int lineNumber;
|
||||||
|
try {
|
||||||
|
lineNumber = location.lineNumber() - 1;
|
||||||
|
} catch (InternalError e) {
|
||||||
|
lineNumber = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lineNumber >= 0) {
|
||||||
|
return SourcePosition.createFromLine(psiFile, lineNumber);
|
||||||
|
}
|
||||||
|
|
||||||
throw new NoDataException();
|
throw new NoDataException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private PsiFile getPsiFileByLocation(Location location) {
|
private PsiFile getPsiFileByLocation(Location location) throws NoDataException {
|
||||||
|
try {
|
||||||
|
final String sourceName = location.sourceName();
|
||||||
|
final Project project = myDebugProcess.getProject();
|
||||||
|
final PsiFile[] files = FilenameIndex.getFilesByName(project, sourceName, ProjectScope.getAllScope(project));
|
||||||
|
if (files.length == 1 && files[0] instanceof JetFile) {
|
||||||
|
return files[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (AbsentInformationException e) {
|
||||||
|
throw new NoDataException();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
|
||||||
final ReferenceType referenceType = location.declaringType();
|
final ReferenceType referenceType = location.declaringType();
|
||||||
if (referenceType == null) {
|
if (referenceType == null) {
|
||||||
return null;
|
return null;
|
||||||
@@ -49,6 +82,8 @@ public class JetPositionManager implements PositionManager {
|
|||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
return null;
|
return null;
|
||||||
|
*/
|
||||||
|
throw new NoDataException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
Reference in New Issue
Block a user