diff --git a/src/org/ntlab/traceDebugger/JavaElementFinder.java b/src/org/ntlab/traceDebugger/JavaElementFinder.java index 896af8e..08877a5 100644 --- a/src/org/ntlab/traceDebugger/JavaElementFinder.java +++ b/src/org/ntlab/traceDebugger/JavaElementFinder.java @@ -28,6 +28,12 @@ String declaringClassName = methodExecution.getDeclaringClassName(); declaringClassName = declaringClassName.replace(".", ""); ClassInfo info = trace.getClassInfo(declaringClassName); + if (info == null) { + // �����N���X�̏ꍇ�͂��̊O�̃N���X����ClassInfo���擾���� (Java�̃\�[�X�t�@�C�����擾���邽��) + StringBuilder tmp = new StringBuilder(); + tmp.append(declaringClassName.substring(0, declaringClassName.lastIndexOf("."))); + info = trace.getClassInfo(tmp.toString()); + } if (info == null) return null; String tmp = info.getPath(); diff --git a/src/org/ntlab/traceDebugger/VariableView.java b/src/org/ntlab/traceDebugger/VariableView.java index 3220c87..3fe5b62 100644 --- a/src/org/ntlab/traceDebugger/VariableView.java +++ b/src/org/ntlab/traceDebugger/VariableView.java @@ -16,7 +16,6 @@ import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; -import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeViewerListener; @@ -34,6 +33,7 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.part.ViewPart; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; import org.ntlab.traceDebugger.Variable.VariableType; import org.ntlab.traceDebugger.analyzerProvider.Alias; @@ -43,8 +43,6 @@ public class VariableView extends ViewPart { private TreeViewer viewer; private IAction jumpAction; -// private IAction deltaAction; -// private IAction deltaActionForCollection; private IAction deltaActionForContainerToComponent; private IAction deltaActionForThisToAnother; private Variable selectedVariable; @@ -145,7 +143,16 @@ } else if (variableType.equals(VariableType.USE_RETURN)) { String receiverId = selectedVariable.getContainerId(); String valueId = selectedVariable.getValueId(); - tp = VariableUpdatePointFinder.getInstance().getDefinitionInvocationPoint(receiverId, valueId, before); + String receiverClassName = selectedVariable.getContainerClassName(); + VariableUpdatePointFinder finder = VariableUpdatePointFinder.getInstance(); + if (receiverClassName.contains("Iterator") + || receiverClassName.contains("Collections$UnmodifiableCollection$1")) { + tp = finder.getIteratorPoint(receiverId); + if (tp == null) return; + MethodInvocation mi = ((MethodInvocation)tp.getStatement()); + receiverId = mi.getCalledMethodExecution().getThisObjId(); + } + tp = finder.getDefinitionInvocationPoint(receiverId, valueId, before); } if (tp == null) return; DebuggingController controller = DebuggingController.getInstance(); @@ -154,16 +161,6 @@ }; jumpAction.setText("Jump to Definition"); jumpAction.setToolTipText("Jump to Definition"); - -// deltaAction = new Action() { -// @Override -// public void run() { -// DeltaMarkerView newDeltaMarkerView = (DeltaMarkerView)TraceDebuggerPlugin.createNewView(DeltaMarkerView.ID, IWorkbenchPage.VIEW_ACTIVATE); -// newDeltaMarkerView.extractDelta(selectedVariable, true); -// } -// }; -// deltaAction.setText("Extract Delta"); -// deltaAction.setToolTipText("Extract Delta"); deltaActionForContainerToComponent = new Action() { @Override @@ -184,28 +181,6 @@ }; deltaActionForThisToAnother.setText("Extract Delta"); deltaActionForThisToAnother.setToolTipText("Extract Delta"); - -// deltaActionForCollection = new Action() { -// @Override -// public void run() { -//// InputDialog inputContainerIdDialog = new InputDialog(null, "Extract Delta for Collection", "Input cotainer id", "87478208", null); -// InputDialog inputContainerIdDialog = new InputDialog(null, "Extract Delta for Collection", "Input cotainer id", "155140910", null); -// if (inputContainerIdDialog.open() != InputDialog.OK) return; -// String containerId = inputContainerIdDialog.getValue(); -//// InputDialog inputContainerTypeDialog = new InputDialog(null, "Extract Delta for Collection", "Input cotainer type", "java.util.LinkedHashSet", null); -// InputDialog inputContainerTypeDialog = new InputDialog(null, "Extract Delta for Collection", "Input cotainer type", "java.util.ArrayList", null); -// if (inputContainerTypeDialog.open() != InputDialog.OK) return; -// String containerType = inputContainerTypeDialog.getValue(); -// String valueId = selectedVariable.getValueId(); -// String valueType = selectedVariable.getValueClassName(); -// TracePoint tp = DebuggingController.getInstance().getCurrentTp(); -// Variable variable = new Variable("tmp", containerType, containerId, valueType, valueId, tp, false); -// DeltaMarkerView newDeltaMarkerView = (DeltaMarkerView)TraceDebuggerPlugin.createNewView(DeltaMarkerView.ID, IWorkbenchPage.VIEW_ACTIVATE); -// newDeltaMarkerView.extractDelta(variable, true); -// } -// }; -// deltaActionForCollection.setText("Extract Delta for Collection"); -// deltaActionForCollection.setToolTipText("Extract Delta for Collection"); } private void createToolBar() { diff --git a/src/org/ntlab/traceDebugger/Variables.java b/src/org/ntlab/traceDebugger/Variables.java index e8c3754..c290f45 100644 --- a/src/org/ntlab/traceDebugger/Variables.java +++ b/src/org/ntlab/traceDebugger/Variables.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -160,12 +161,12 @@ private void updateForDifferential() { for (Variable variable : roots) { - updateForDifferential(variable); + updateForDifferential(variable, new HashSet()); } containerIdToDifferentialUpdateTracePoints.clear(); } - private void updateForDifferential(Variable variable) { + private void updateForDifferential(Variable variable, Set hasCheckedObjectIdSet) { Set containerIdList = containerIdToDifferentialUpdateTracePoints.keySet(); String containerId = variable.getContainerId(); if (containerIdList.contains(containerId)) { @@ -185,8 +186,11 @@ } } } + HashSet hasCheckedObjectIdSetOnNext = new HashSet<>(hasCheckedObjectIdSet); + hasCheckedObjectIdSetOnNext.add(variable.getContainerId()); for (Variable child : variable.getChildren()) { - updateForDifferential(child); + if (hasCheckedObjectIdSetOnNext.contains(child.getContainerId())) continue; + updateForDifferential(child, hasCheckedObjectIdSetOnNext); } } diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java b/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java index 8f558ce..d431199 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java @@ -19,14 +19,15 @@ public class VariableUpdatePointFinder { private static VariableUpdatePointFinder theInstance = new VariableUpdatePointFinder(); private Trace trace; - private Map>> updatePoints = new HashMap<>(); - private Map>> definitionInvocationPoints = new HashMap<>(); + private Map>> updatePoints = new HashMap<>(); // �R���e�iID�ƃt�B�[���h�����L�[�ɂ����ϐ��X�V�|�C���g + private Map>> definitionInvocationPoints = new HashMap<>(); // ���V�[�oID�ƈ���ID���L�[�ɂ����R���N�V�����ւ̒lj��|�C���g + private Map gettingIteratorPoints = new HashMap<>(); // �C�e���[�^��ID���L�[�ɂ�����擾�����|�C���g public void setTrace(Trace trace) { this.trace = trace; init(); } - + public static VariableUpdatePointFinder getInstance() { return theInstance; } @@ -49,34 +50,56 @@ while (start.stepFull()) { Statement statement = start.getStatement(); if (statement instanceof FieldUpdate) { - registerFieldUpdatePoints(start, (FieldUpdate)statement); + registerFieldUpdatePoint(start, (FieldUpdate)statement); } else if (statement instanceof MethodInvocation) { - registerdefinitionInvocationPoints(start, (MethodInvocation)statement); + MethodInvocation mi = (MethodInvocation)statement; + MethodExecution calledME = mi.getCalledMethodExecution(); + String methodName = calledME.getSignature(); + if (methodName.contains(".add(") || methodName.contains(".addElement(")) { + registerdefinitionInvocationPoint(start, calledME); + } else if (methodName.contains(".iterator(") || methodName.contains("Iterator(")) { + registerIteratorPoint(start, calledME); + } } } } } } - private void registerFieldUpdatePoints(TracePoint tp, FieldUpdate fu) { + private void registerFieldUpdatePoint(TracePoint tp, FieldUpdate fu) { String objectId = fu.getContainerObjId(); String fieldName = fu.getFieldName(); register(updatePoints, objectId, fieldName, tp); } - private void registerdefinitionInvocationPoints(TracePoint tp, MethodInvocation mi) { - MethodExecution calledME = mi.getCalledMethodExecution(); - String methodName = calledME.getSignature(); +// private void registerdefinitionInvocationPoints(TracePoint tp, MethodInvocation mi) { +// MethodExecution calledME = mi.getCalledMethodExecution(); +// String methodName = calledME.getSignature(); +// List args = calledME.getArguments(); +// if (methodName.contains(".add(") || methodName.contains(".addElement(")) { +// if (args.size() == 1) { +// String receiverId = calledME.getThisObjId(); +// String argId = args.get(0).getId(); +// register(definitionInvocationPoints, receiverId, argId, tp); +// } +// } +// } + + private void registerdefinitionInvocationPoint(TracePoint tp, MethodExecution calledME) { List args = calledME.getArguments(); - if (methodName.contains(".add(") || methodName.contains(".addElement(")) { - if (args.size() == 1) { - String receiverId = calledME.getThisObjId(); - String argId = args.get(0).getId(); - register(definitionInvocationPoints, receiverId, argId, tp); - } + if (args.size() == 1) { + String receiverId = calledME.getThisObjId(); + String argId = args.get(0).getId(); + register(definitionInvocationPoints, receiverId, argId, tp); } } + private void registerIteratorPoint(TracePoint tp, MethodExecution calledME) { + ObjectReference returnIteratorValue = calledME.getReturnValue(); + String iteratorId = returnIteratorValue.getId(); + gettingIteratorPoints.put(iteratorId, tp.duplicate()); + } + private void register(Map>> map, String key1, String key2, TracePoint tp) { Map> innerMap = map.get(key1); if (innerMap == null) { @@ -114,6 +137,10 @@ return getPoint(definitionInvocationPoints, receiverId, argId, before); } + public TracePoint getIteratorPoint(String iteratorId) { + return gettingIteratorPoints.get(iteratorId); + } + private TracePoint getPoint(Map>> map, String key1, String key2, TracePoint before) { Map> innerMap = map.get(key1); if (innerMap == null) return null; @@ -127,5 +154,5 @@ tmp = tp; } return tmp; - } + } }