diff --git a/icons/currentMarker.png b/icons/currentMarker.png new file mode 100644 index 0000000..bdbd6aa --- /dev/null +++ b/icons/currentMarker.png Binary files differ diff --git a/plugin.xml b/plugin.xml index 7f5381a..2536e1b 100644 --- a/plugin.xml +++ b/plugin.xml @@ -183,6 +183,7 @@ markertype="org.ntlab.traceDebugger.dstSideDeltaMarker"> @@ -300,6 +301,7 @@ colorPreferenceValue="198,219,174" highlightPreferenceKey="clhighlight5" highlightPreferenceValue="true" + icon="icons/currentMarker.png" includeOnPreferencePage="true" label="CurrentAnnotation" overviewRulerPreferenceKey="clruler5" diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index 7b8c78a..807d334 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -1,6 +1,8 @@ package org.ntlab.traceDebugger; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; @@ -37,7 +39,7 @@ private static final DebuggingController theInstance = new DebuggingController(); private TracePoint debuggingTp; private TraceBreakPoint selectedTraceBreakPoint; - private IMarker currentLineMarker; + private List currentLineMarkers = new ArrayList<>(); private LoadingTraceFileStatus loadingTraceFileStatus = LoadingTraceFileStatus.NOT_YET; private boolean isRunning = false; public static final String CURRENT_MARKER_ID = "org.ntlab.traceDebugger.currentMarker"; @@ -96,7 +98,8 @@ ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)).reset(); ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)).reset(); ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).reset(); - ((TracePointsView)TraceDebuggerPlugin.getActiveView(TracePointsView.ID)).reset(); + TracePointsView tracePointsView = (TracePointsView)TraceDebuggerPlugin.getActiveView(TracePointsView.ID); + if (tracePointsView != null) tracePointsView.reset(); CallTreeView callTreeView = (CallTreeView)TraceDebuggerPlugin.getActiveView(CallTreeView.ID); if (callTreeView != null) callTreeView.reset(); loadTraceFileOnOtherThread(path); @@ -227,15 +230,32 @@ return true; } +// public void terminateAction() { +// debuggingTp = null; +// if (currentLineMarker != null) { +// try { +// currentLineMarker.delete(); +// } catch (CoreException e) { +// e.printStackTrace(); +// } +// } +// ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)).reset(); +// ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)).reset(); +// ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateImagesForDebug(false); +// isRunning = false; +// } + public void terminateAction() { debuggingTp = null; - if (currentLineMarker != null) { - try { - currentLineMarker.delete(); - } catch (CoreException e) { - e.printStackTrace(); - } - } + if (!(currentLineMarkers.isEmpty())) { + for (IMarker currentLineMarker : currentLineMarkers) { + try { + currentLineMarker.delete(); + } catch (CoreException e) { + e.printStackTrace(); + } + } + } ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)).reset(); ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)).reset(); ((BreakPointView)TraceDebuggerPlugin.getActiveView(BreakPointView.ID)).updateImagesForDebug(false); @@ -453,10 +473,9 @@ } private void refresh(TracePoint from, TracePoint to, boolean isReturned, boolean canDifferentialUpdateVariables) { - MethodExecution me = to.getMethodExecution(); - int lineNo = to.getStatement().getLineNo(); - IMarker marker = createCurrentLineMarker(me, lineNo); - JavaEditorOperator.markAndOpenJavaFile(marker); + List markers = createCurrentLineMarkers(to); + if (!(markers.isEmpty())) JavaEditorOperator.markAndOpenJavaFile(markers.get(0)); + CallStackView callStackView = ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)); callStackView.updateByTracePoint(to); VariableView variableView = ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)); @@ -487,32 +506,49 @@ variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkerManager.getMarkers()); } - public IMarker createCurrentLineMarker(MethodExecution methodExecution, int highlightLineNo) { - IFile file = JavaElementFinder.findIFile(methodExecution); - try { - if (currentLineMarker != null) currentLineMarker.delete(); - currentLineMarker = file.createMarker(CURRENT_MARKER_ID); - Map attributes = new HashMap<>(); - attributes.put(IMarker.TRANSIENT, true); - attributes.put(IMarker.LINE_NUMBER, highlightLineNo); - - IPath path = file.getFullPath(); - ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager(); - manager.connect(path, LocationKind.IFILE, null); - ITextFileBuffer buffer = manager.getTextFileBuffer(path, LocationKind.IFILE); - IDocument document = buffer.getDocument(); + public List createCurrentLineMarkers(TracePoint tp) { + deleteCurrentLineMarkers(); + while (tp != null) { try { - IRegion region = document.getLineInformation(highlightLineNo - 1); - attributes.put(IMarker.CHAR_START, region.getOffset()); - attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); - } catch (BadLocationException e) { + MethodExecution methodExecution = tp.getMethodExecution(); + int highlightLineNo = tp.getStatement().getLineNo(); + IFile file = JavaElementFinder.findIFile(methodExecution); + IMarker currentLineMarker = file.createMarker(CURRENT_MARKER_ID); + currentLineMarkers.add(currentLineMarker); + Map attributes = new HashMap<>(); + attributes.put(IMarker.TRANSIENT, true); + attributes.put(IMarker.LINE_NUMBER, highlightLineNo); + + IPath path = file.getFullPath(); + ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager(); + manager.connect(path, LocationKind.IFILE, null); + ITextFileBuffer buffer = manager.getTextFileBuffer(path, LocationKind.IFILE); + IDocument document = buffer.getDocument(); + try { + IRegion region = document.getLineInformation(highlightLineNo - 1); + attributes.put(IMarker.CHAR_START, region.getOffset()); + attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); + } catch (BadLocationException e) { + e.printStackTrace(); + } + currentLineMarker.setAttributes(attributes); + } catch (CoreException e) { e.printStackTrace(); } - currentLineMarker.setAttributes(attributes); - } catch (CoreException e) { - e.printStackTrace(); + tp = tp.getMethodExecution().getCallerTracePoint(); } - return currentLineMarker; + return currentLineMarkers; + } + + private void deleteCurrentLineMarkers() { + for (IMarker currentLineMarker : currentLineMarkers) { + try { + currentLineMarker.delete(); + } catch (CoreException e) { + e.printStackTrace(); + } + } + currentLineMarkers.clear(); } private TracePoint getTracePointSelectedOnCallStack() { diff --git a/src/org/ntlab/traceDebugger/TracePoints.java b/src/org/ntlab/traceDebugger/TracePoints.java index 45f3a19..b152466 100644 --- a/src/org/ntlab/traceDebugger/TracePoints.java +++ b/src/org/ntlab/traceDebugger/TracePoints.java @@ -16,6 +16,10 @@ return tracePoints.toArray(new TracePoint[tracePoints.size()]); } + public boolean contains(TracePoint tp) { + return tracePoints.contains(tp); + } + public void add(TracePoint tp) { tracePoints.add(tp); } diff --git a/src/org/ntlab/traceDebugger/TracePointsView.java b/src/org/ntlab/traceDebugger/TracePointsView.java index 63f43d8..f561e17 100644 --- a/src/org/ntlab/traceDebugger/TracePointsView.java +++ b/src/org/ntlab/traceDebugger/TracePointsView.java @@ -1,5 +1,7 @@ package org.ntlab.traceDebugger; +import java.util.List; + import org.eclipse.core.resources.IMarker; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; @@ -180,8 +182,10 @@ } public void addTracePoint(TracePoint tp) { - tracePoints.add(tp); - update(); + if (!(tracePoints.contains(tp))) { + tracePoints.add(tp); + update(); + } } public void reset() { @@ -197,9 +201,7 @@ protected void jumpToTheTracePoint(TracePoint tp) { DebuggingController debuggingController = DebuggingController.getInstance(); debuggingController.jumpToTheTracePoint(tp, false); - MethodExecution currentME = tp.getMethodExecution(); - int lineNo = tp.getStatement().getLineNo(); - IMarker marker = DebuggingController.getInstance().createCurrentLineMarker(currentME, lineNo); - JavaEditorOperator.markAndOpenJavaFile(marker); - } + List markers = DebuggingController.getInstance().createCurrentLineMarkers(tp); + if (!(markers.isEmpty())) JavaEditorOperator.markAndOpenJavaFile(markers.get(0)); + } } \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/Variable.java b/src/org/ntlab/traceDebugger/Variable.java index 995cc31..3673307 100644 --- a/src/org/ntlab/traceDebugger/Variable.java +++ b/src/org/ntlab/traceDebugger/Variable.java @@ -39,8 +39,8 @@ public static final String RETURN_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�߂�l" : "return"; public static final String ARG_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "����" : "arg"; public static final String RECEIVER_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "���V�[�o" : "receiver"; - public static final String VALUE_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�R���|�[�l���g" : "value"; - public static final String CONTAINER_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�R���e�i" : "container"; + public static final String VALUE_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�Q�Ɛ�" : "referred"; + public static final String CONTAINER_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�Q�ƌ�" : "referring"; public enum VariableType { USE_VALUE, USE_CONTAINER, USE_RECEIVER, USE_RETURN, diff --git a/src/org/ntlab/traceDebugger/Variables.java b/src/org/ntlab/traceDebugger/Variables.java index 13cd031..61335f7 100644 --- a/src/org/ntlab/traceDebugger/Variables.java +++ b/src/org/ntlab/traceDebugger/Variables.java @@ -295,12 +295,12 @@ } } } - if (parentNodeNameOfUseSide != null) { - setSpecialVariableNodes(parentNodeNameOfUseSide, specialVariablesOfUseSide); - } if (parentNodeNameOfDefSide != null) { setSpecialVariableNodes(parentNodeNameOfDefSide, specialVariablesDefSide); - } + } + if (parentNodeNameOfUseSide != null) { + setSpecialVariableNodes(parentNodeNameOfUseSide, specialVariablesOfUseSide); + } } private void setSpecialVariableNodes(String parentNodeName, List specialVariables) { diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java index 0e593ad..52039b2 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -42,7 +43,7 @@ public class DeltaMarkerManager { private Map> markerIdToMarkers = new HashMap<>(); - private List markersByOrder = new ArrayList<>(); + private List orderedMarkers = new ArrayList<>(); private MethodExecution coordinator; private TracePoint relatedPoint; private Reference relatedPointReference; @@ -68,7 +69,7 @@ } public List getMarkersByOrder() { - return markersByOrder; + return orderedMarkers; } public TreeNode[] getMarkerTreeNodes() { @@ -104,7 +105,7 @@ public IMarker getCoordinatorDeltaMarker() { List markers = markerIdToMarkers.get(COORDINATOR_DELTA_MARKER); if (markers == null || markers.isEmpty()) return null; - return markers.get(0); + return markers.get(0); } public IMarker getBottomDeltaMarker() { @@ -169,6 +170,31 @@ } msg = TraceDebuggerPlugin.isJapanese() ? "�Q�Ǝ��_" : "RelatedPoint"; markAndOpenJavaFileForCreationPoint(relatedPoint, relatedPointReference, msg, DeltaMarkerManager.BOTTOM_DELTA_MARKER); + createMarkerListOrdered(); + } + + private void createMarkerListOrdered() { + orderedMarkers.clear(); + IMarker coordinatorMarker = getCoordinatorDeltaMarker(); + if (coordinatorMarker != null) orderedMarkers.add(coordinatorMarker); + List aliasMarkers = new ArrayList<>(); + List srcSideMarkers = markerIdToMarkers.get(SRC_SIDE_DELTA_MARKER); + if (srcSideMarkers != null) aliasMarkers.addAll(srcSideMarkers); + List dstSideMarkers = markerIdToMarkers.get(DST_SIDE_DELTA_MARKER); + if (dstSideMarkers != null) aliasMarkers.addAll(dstSideMarkers); + Collections.sort(aliasMarkers, new Comparator() { + @Override + public int compare(IMarker o1, IMarker o2) { + TracePoint tp1 = DeltaMarkerManager.getTracePoint(o1); + TracePoint tp2 = DeltaMarkerManager.getTracePoint(o2); + long time1 = tp1.getMethodExecution().getEntryTime(); + long time2 = tp2.getMethodExecution().getEntryTime(); + return (time1 < time2) ? -1 : 1; + } + }); + orderedMarkers.addAll(aliasMarkers); + IMarker bottomMarker = getBottomDeltaMarker(); + if (bottomMarker != null) orderedMarkers.add(bottomMarker); } private void markAndOpenJavaFileForAlias(Alias alias, String message, String markerId) { @@ -271,7 +297,7 @@ markerIdToMarkers.put(markerId, markerList); } markerList.add(marker); - markersByOrder.add(marker); +// orderedMarkers.add(marker); } private void setAttributesForAlias(final Map attributes, Alias alias, IFile file, String markerId) { @@ -997,6 +1023,6 @@ deleteMarkers(markerList); } markerIdToMarkers.clear(); - markersByOrder.clear(); + orderedMarkers.clear(); } } diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java index d9be4d4..4fa7c06 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java @@ -19,8 +19,8 @@ @Override public void addAlias(Alias alias) { - relatedAliases.add(alias); if (alias == null) return; + relatedAliases.add(alias); String objId = alias.getObjectId(); String srcOrDst = ""; if (srcSideIdList.contains(objId) && !(dstSideIdList.contains(objId))) {