diff --git a/src/org/ntlab/traceDebugger/DeltaMarkerView.java b/src/org/ntlab/traceDebugger/DeltaMarkerView.java index 5951359..62e663e 100644 --- a/src/org/ntlab/traceDebugger/DeltaMarkerView.java +++ b/src/org/ntlab/traceDebugger/DeltaMarkerView.java @@ -4,6 +4,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; @@ -196,6 +197,10 @@ viewer.setInput(deltaMarkerManager.getMarkerTreeNodes()); viewer.expandAll(); viewer.refresh(); +// long endTime = System.nanoTime(); +// long startTime = VariableViewRelatedDelta.startTime; +// MessageDialog.openInformation(null, "�f���^���o���Ԍv��", "Time: " + (endTime - startTime)); + VariableViewRelatedDelta.startTime = 0L; TracePoint coordinatorPoint = getCoordinatorPoint(); TracePoint creationPoint = getCreationPoint(); MethodExecution coordinatorME = coordinatorPoint.getMethodExecution(); diff --git a/src/org/ntlab/traceDebugger/Variable.java b/src/org/ntlab/traceDebugger/Variable.java index 3673307..0156d8d 100644 --- a/src/org/ntlab/traceDebugger/Variable.java +++ b/src/org/ntlab/traceDebugger/Variable.java @@ -1,360 +1,321 @@ -package org.ntlab.traceDebugger; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.jdt.core.Flags; -import org.eclipse.jdt.core.IField; -import org.eclipse.jdt.core.IType; -import org.eclipse.jdt.core.JavaModelException; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; -import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; -import org.ntlab.traceDebugger.analyzerProvider.VariableUpdatePointFinder; - -public class Variable { - private String variableName; - private VariableType variableType; - private String fullyQualifiedVariableName; - private String valueClassName; - private String valueId; - private Variable parent; - private List children = new ArrayList<>(); - private String containerClassName; - private String containerId; - private TracePoint lastUpdatePoint; - private TracePoint before; - private boolean isReturned; - private DeepHierarchy deepHierarchy; - private boolean alreadyCreatedChildHierarchy = false; - private boolean alreadyCreatedGrandChildHierarchy = false; - private Map additionalAttributes = new HashMap<>(); - public static final String NULL_VALUE = "null"; - 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() ? "�Q�Ɛ�" : "referred"; - public static final String CONTAINER_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�Q�ƌ�" : "referring"; - - public enum VariableType { - USE_VALUE, USE_CONTAINER, USE_RECEIVER, USE_RETURN, - DEF_VALUE, DEF_CONTAINER, DEF_RECEIVER, DEF_ARG, - THIS, PARAMETER; - public boolean isContainerSide() { - return this.equals(USE_CONTAINER) || this.equals(DEF_CONTAINER) - || this.equals(USE_RECEIVER) || this.equals(DEF_RECEIVER); - } - public boolean isDef() { - return this.equals(DEF_CONTAINER) || this.equals(DEF_VALUE) - || this.equals(DEF_RECEIVER) || this.equals(DEF_ARG); - } - public boolean isUse() { - return this.equals(USE_CONTAINER) || this.equals(USE_VALUE) - || this.equals(USE_RECEIVER) || this.equals(USE_RETURN); - } - } - - public Variable(String variableName, String containerClassName, String containerId, - String valueClassName, String valueId, TracePoint before, boolean isReturned) { - this(variableName, containerClassName, containerId, valueClassName, valueId, before, isReturned, VariableType.USE_VALUE); - } - - public Variable(String variableName, String containerClassName, String containerId, - String valueClassName, String valueId, TracePoint before, boolean isReturned, VariableType variableType) { - init(variableName, variableName, containerClassName, containerId, valueClassName, valueId, null, before, isReturned, variableType); - } - - public Variable(String variableName, String fullyQualifiedVariableName, String containerClassName, String containerId, - String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned, VariableType variableType) { - init(variableName, fullyQualifiedVariableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, before, isReturned, variableType); - } - - private void init(String variableName, String fullyQualifiedVariableName, String containerClassName, String containerId, - String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned, VariableType variableType) { - this.variableName = variableName; - this.fullyQualifiedVariableName = fullyQualifiedVariableName; - this.containerClassName = containerClassName; - this.containerId = containerId; - this.valueClassName = valueClassName; - this.valueId = valueId; - this.lastUpdatePoint = lastUpdatePoint; - this.before = before; - this.isReturned = isReturned; - this.variableType = variableType; - this.deepHierarchy = checkDeepHierarchy(); - this.alreadyCreatedChildHierarchy = false; - this.alreadyCreatedGrandChildHierarchy = false; - this.children.clear(); - this.additionalAttributes.clear(); - } - - public void update(String valueClassName, String valueId, TracePoint lastUpdatePoint, boolean isReturned) { - init(variableName, fullyQualifiedVariableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, lastUpdatePoint, isReturned, variableType); - } - - public String getVariableName() { - return variableName; - } - - public VariableType getVariableType() { - return variableType; - } - - public String getFullyQualifiedVariableName() { - return fullyQualifiedVariableName; - } - - public String getContainerClassName() { - return containerClassName; - } - - public String getContainerId() { - return containerId; - } - - public String getValueClassName() { - return valueClassName; - } - - public String getValueId() { - return valueId; - } - - public TracePoint getLastUpdatePoint() { - return lastUpdatePoint; - } - - public TracePoint getBeforeTracePoint() { - return before; - } - - public Variable getParent() { - return parent; - } - - public List getChildren() { - return children; - } - - private void addChild(Variable child) { - children.add(child); - child.parent = this; - } - - @Override - public String toString() { - return variableName + ": " + valueClassName + "(" + "id = " + valueId + ")"; - } - -// /** -// * ���̃t�B�[���h���Q�ƌ^�I�u�W�F�N�g���z�񂩂𔻒肵�Ĕ��茋�ʂ�Ԃ�.
-// * (�ϐ��r���[�ɕ\��������f�[�^���ċA�I�ɋ��߂邽�߂�, �Ăяo�����Ŏ��ɂǂ̃��\�b�h���ĂԂ��𔻒f����̂ɗ��p) -// * -// * @param objData -// * @return FIELD: �Q�ƌ^�I�u�W�F�N�g�̏ꍇ, ARRAY: �z��̏ꍇ, NONE: ����ȊO�̏ꍇ -// */ -// private DeepHierarchy checkDeepHierarchy() { -// // note: �t�B�[���h��ID��Type���Ȃ��ꍇ��AType(=ActualType)��"---"�̏ꍇ�͉������Ȃ� -// if (this.getValueId() == null || this.getValueId().isEmpty() -// || this.getValueClassName() == null || this.getValueClassName().isEmpty()) { -// return DeepHierarchy.NONE; -// } -// final String NULL_ACTUAL_TYPE = "---"; // �t�B�[���h�ɑ΂��Ė����I��null����ꂽ�ꍇ��ActualType�̎擾������ -// if (this.getValueClassName().equals(NULL_ACTUAL_TYPE)) return DeepHierarchy.NONE; -// -// final String ARRAY_SIGNATURE_HEAD = "["; // �z��̃V�O�l�`���̐擪�́A�z��̎��������� [ ���A�Ȃ� -// if (this.getValueClassName().startsWith(ARRAY_SIGNATURE_HEAD)) { -// // note: �t�B�[���h��Type���z��^(�@[ �Ŏn�܂�@)�ꍇ (���̔z�񂪎��Še�v�f�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) -// return DeepHierarchy.ARRAY; -// } else { -// String[] primitives = {"byte", "short", "int", "long", "float", "double", "char", "boolean"}; -// if (!Arrays.asList(primitives).contains(this.getValueClassName())) { -// // note: �t�B�[���h��Type���Q�ƌ^(=�I�u�W�F�N�g)�̏ꍇ (���̃I�u�W�F�N�g�������Ă���t�B�[���h�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) -// return DeepHierarchy.FIELD; -// } -// } -// return DeepHierarchy.NONE; -// } - - /** - * ���̃t�B�[���h���Q�ƌ^�I�u�W�F�N�g���z�񂩂𔻒肵�Ĕ��茋�ʂ�Ԃ�.
- * (�ϐ��r���[�ɕ\��������f�[�^���ċA�I�ɋ��߂邽�߂�, �Ăяo�����Ŏ��ɂǂ̃��\�b�h���ĂԂ��𔻒f����̂ɗ��p) - * - * @param objData - * @return FIELD: �Q�ƌ^�I�u�W�F�N�g�̏ꍇ, ARRAY: �z��̏ꍇ, NONE: ����ȊO�̏ꍇ - */ - private DeepHierarchy checkDeepHierarchy() { - // note: �t�B�[���h��ID��Type���Ȃ��ꍇ��AType(=ActualType)��"---"�̏ꍇ�͉������Ȃ� - String id = (variableType.isContainerSide()) ? containerId : valueId; - String className = (variableType.isContainerSide()) ? containerClassName : valueClassName; - if (id == null || id.isEmpty() || className == null || className.isEmpty()) { - return DeepHierarchy.NONE; - } - - final String NULL_ACTUAL_TYPE = "---"; // �t�B�[���h�ɑ΂��Ė����I��null����ꂽ�ꍇ��ActualType�̎擾������ - if (this.getValueClassName().equals(NULL_ACTUAL_TYPE)) return DeepHierarchy.NONE; - - final String ARRAY_SIGNATURE_HEAD = "["; // �z��̃V�O�l�`���̐擪�́A�z��̎��������� [ ���A�Ȃ� - if (this.getValueClassName().startsWith(ARRAY_SIGNATURE_HEAD)) { - // note: �t�B�[���h��Type���z��^(�@[ �Ŏn�܂�@)�ꍇ (���̔z�񂪎��Še�v�f�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) - return DeepHierarchy.ARRAY; - } else { - String[] primitives = {"byte", "short", "int", "long", "float", "double", "char", "boolean"}; - if (!Arrays.asList(primitives).contains(this.getValueClassName())) { - // note: �t�B�[���h��Type���Q�ƌ^(=�I�u�W�F�N�g)�̏ꍇ (���̃I�u�W�F�N�g�������Ă���t�B�[���h�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) - return DeepHierarchy.FIELD; - } - } - return DeepHierarchy.NONE; - } - - public void createNextHierarchyState() { - if (alreadyCreatedGrandChildHierarchy) return; - getDeepHierarchyState(); - for (Variable child : children) { - child.getDeepHierarchyState(); - } - alreadyCreatedGrandChildHierarchy = true; - } - - private void getDeepHierarchyState() { - if (alreadyCreatedChildHierarchy) return; - switch (this.deepHierarchy) { - case FIELD: - getFieldsState(); - Collections.sort(children, new Comparator() { - @Override - public int compare(Variable arg0, Variable arg1) { - // �ϐ����̏����ɕ��ёւ��� - return arg0.getVariableName().compareTo(arg1.getVariableName()); - } - }); - break; - case ARRAY: - getArrayState(); - Collections.sort(children, new Comparator() { - @Override - public int compare(Variable arg0, Variable arg1) { - // �z��C���f�b�N�X�̏����ɕ��ёւ��� - String arg0Name = arg0.variableName; - String arg1Name = arg1.variableName; - int arg0Index = Integer.parseInt(arg0Name.substring(arg0Name.indexOf("[") + 1, arg0Name.lastIndexOf("]"))); - int arg1Index = Integer.parseInt(arg1Name.substring(arg0Name.indexOf("[") + 1, arg1Name.lastIndexOf("]"))); - return (arg0Index < arg1Index) ? -1 : 1; - } - }); - break; - case NONE: - break; - } - alreadyCreatedChildHierarchy = true; - } - - private void getFieldsState() { - // �t�B�[���h��ID��Type���擾���ĕ\�� - IType type = null; - if (variableType.isContainerSide()) { - type = JavaElementFinder.findIType(null, containerClassName); - } else { - type = JavaElementFinder.findIType(null, valueClassName); - } - if (type == null) return; - getFieldsState(type); - getFieldStateForSuperClass(type); // �e�N���X��k���Ă����A�����̃N���X�Œ�`���ꂽ�t�B�[���h�̏����擾���Ă��� (�������������������Ĕ��ɏd���Ȃ�) - } - - /** - * // �e�N���X��k���Ă����A�����̃N���X�Œ�`���ꂽ�t�B�[���h�̏����擾���Ă��� (�������������������Ĕ��ɏd���Ȃ�) - * @param type �N�_�ƂȂ�N���X - */ - private void getFieldStateForSuperClass(IType type) { - try { - while (true) { - String superClassName = type.getSuperclassName(); - if (superClassName == null) break; - String fullyQualifiedSuperClassName = JavaElementFinder.resolveType(type, superClassName); - if (fullyQualifiedSuperClassName == null) break; - type = JavaElementFinder.findIType(null, fullyQualifiedSuperClassName); - if (type == null) break; - getFieldsState(type); - } - } catch (JavaModelException e) { - e.printStackTrace(); - } - } - - private void getFieldsState(IType type) { - try { - for (IField field : type.getFields()) { - if (Flags.isStatic(field.getFlags())) continue; - String fieldName = field.getDeclaringType().getElementName() + "." + field.getElementName(); // ���S����N���X�� - String fullyQualifiedFieldName = field.getDeclaringType().getFullyQualifiedName() + "." + field.getElementName(); // ���S����N���X�� - - // ���̃t�B�[���h�ɂ‚��Ă̍ŐV�̍X�V�����擾(FieldUpdate) - TraceJSON trace = (TraceJSON)TraceDebuggerPlugin.getAnalyzer().getTrace(); -// FieldUpdate fieldUpdate = trace.getRecentlyFieldUpdate(thisObjData.getId(), fieldName, tp); -// FieldUpdate fieldUpdate = trace.getFieldUpdate(id, fullyQualifiedFieldName, before, isReturned); - -// TracePoint updateTracePoint = trace.getFieldUpdateTracePoint(valueId, fullyQualifiedFieldName, before, isReturned); - String nextContainerId = (variableType.isContainerSide()) ? containerId : valueId; - String nextClassName = (variableType.isContainerSide()) ? containerClassName : valueClassName; -// TracePoint updateTracePoint = VariableUpdatePointFinder.getInstance().getPoint(valueId, fullyQualifiedFieldName, before); - TracePoint updateTracePoint = VariableUpdatePointFinder.getInstance().getPoint(nextContainerId, fullyQualifiedFieldName, before); - -// if (updateTracePoint == null) continue; - if (updateTracePoint != null) { - FieldUpdate fieldUpdate = (FieldUpdate)updateTracePoint.getStatement(); - // �t�B�[���h��ID��Type���擾(String) - String nextValueId = (fieldUpdate != null) ? fieldUpdate.getValueObjId() : "---"; - String nextValueClassName = (fieldUpdate != null) ? fieldUpdate.getValueClassName() : NULL_VALUE; -// Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, valueClassName, valueId, fieldType, fieldObjId, updateTracePoint, before, isReturned, VariableType.USE_VALUE); - Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, nextClassName, nextContainerId, nextValueClassName, nextValueId, updateTracePoint, before, isReturned, VariableType.USE_VALUE); - this.addChild(fieldData); - } else { - Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, valueClassName, valueId, NULL_VALUE, "---", updateTracePoint, before, isReturned, VariableType.USE_VALUE); - this.addChild(fieldData); - } - } - } catch (JavaModelException e) { - e.printStackTrace(); - } - } - - private void getArrayState() { - TraceJSON trace = (TraceJSON)TraceDebuggerPlugin.getAnalyzer().getTrace(); - for (int i = 0;; i++){ - // ���̔z��v�f�ɂ‚��Ă̍ŐV�̍X�V�����擾(ArrayUpdate) - ArrayUpdate arrayUpdate = trace.getRecentlyArrayUpdate(valueId, i, before); - if (arrayUpdate == null) { - // �z��̃T�C�Y���擾�ł��Ȃ����߁A�C���f�b�N�X���T�C�Y���߂̂Ƃ��Ɋm���ɔ���������@�Ƃ��ĉ����� - // �������A�z��v�f�̓r���ɖ���`���������ꍇ�ł��A�����Ă��܂��̂����_ - break; - } - String arrayIndexName = variableName + "[" + i + "]"; - - // �z��v�f��ID��Type���擾(String) - String valueObjId = arrayUpdate.getValueObjectId(); - String valueType = arrayUpdate.getValueClassName(); - Variable arrayIndexData = new Variable(arrayIndexName, valueClassName, valueId, valueType, valueObjId, before, isReturned); - this.addChild(arrayIndexData); - } - } - - public void addAdditionalAttribute(String key, Object value) { - additionalAttributes.put(key, value); - } - - public Object getAdditionalAttribute(String key) { - return additionalAttributes.get(key); - } - - private enum DeepHierarchy { - NONE, FIELD, ARRAY; - } +package org.ntlab.traceDebugger; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IField; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; +import org.ntlab.traceDebugger.analyzerProvider.VariableUpdatePointFinder; + +public class Variable { + private String variableName; + private VariableType variableType; + private String fullyQualifiedVariableName; + private String valueClassName; + private String valueId; + private Variable parent; + private List children = new ArrayList<>(); + private String containerClassName; + private String containerId; + private TracePoint lastUpdatePoint; + private TracePoint before; + private boolean isReturned; + private DeepHierarchy deepHierarchy; + private boolean alreadyCreatedChildHierarchy = false; + private boolean alreadyCreatedGrandChildHierarchy = false; + private Map additionalAttributes = new HashMap<>(); + public static final String NULL_VALUE = "null"; + 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() ? "�Q�Ɛ�" : "referred"; + public static final String CONTAINER_VARIABLE_NAME = TraceDebuggerPlugin.isJapanese() ? "�Q�ƌ�" : "referring"; + + public enum VariableType { + USE_VALUE, USE_CONTAINER, USE_RECEIVER, USE_RETURN, + DEF_VALUE, DEF_CONTAINER, DEF_RECEIVER, DEF_ARG, + THIS, PARAMETER; + public boolean isContainerSide() { + return this.equals(USE_CONTAINER) || this.equals(DEF_CONTAINER) + || this.equals(USE_RECEIVER) || this.equals(DEF_RECEIVER); + } + public boolean isDef() { + return this.equals(DEF_CONTAINER) || this.equals(DEF_VALUE) + || this.equals(DEF_RECEIVER) || this.equals(DEF_ARG); + } + public boolean isUse() { + return this.equals(USE_CONTAINER) || this.equals(USE_VALUE) + || this.equals(USE_RECEIVER) || this.equals(USE_RETURN); + } + } + + public Variable(String variableName, String containerClassName, String containerId, + String valueClassName, String valueId, TracePoint before, boolean isReturned) { + this(variableName, containerClassName, containerId, valueClassName, valueId, before, isReturned, VariableType.USE_VALUE); + } + + public Variable(String variableName, String containerClassName, String containerId, + String valueClassName, String valueId, TracePoint before, boolean isReturned, VariableType variableType) { + init(variableName, variableName, containerClassName, containerId, valueClassName, valueId, null, before, isReturned, variableType); + } + + public Variable(String variableName, String fullyQualifiedVariableName, String containerClassName, String containerId, + String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned, VariableType variableType) { + init(variableName, fullyQualifiedVariableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, before, isReturned, variableType); + } + + private void init(String variableName, String fullyQualifiedVariableName, String containerClassName, String containerId, + String valueClassName, String valueId, TracePoint lastUpdatePoint, TracePoint before, boolean isReturned, VariableType variableType) { + this.variableName = variableName; + this.fullyQualifiedVariableName = fullyQualifiedVariableName; + this.containerClassName = containerClassName; + this.containerId = containerId; + this.valueClassName = valueClassName; + this.valueId = valueId; + this.lastUpdatePoint = lastUpdatePoint; + this.before = before; + this.isReturned = isReturned; + this.variableType = variableType; + this.deepHierarchy = checkDeepHierarchy(); + this.alreadyCreatedChildHierarchy = false; + this.alreadyCreatedGrandChildHierarchy = false; + this.children.clear(); + this.additionalAttributes.clear(); + } + + public void update(String valueClassName, String valueId, TracePoint lastUpdatePoint, boolean isReturned) { + init(variableName, fullyQualifiedVariableName, containerClassName, containerId, valueClassName, valueId, lastUpdatePoint, lastUpdatePoint, isReturned, variableType); + } + + public String getVariableName() { + return variableName; + } + + public VariableType getVariableType() { + return variableType; + } + + public String getFullyQualifiedVariableName() { + return fullyQualifiedVariableName; + } + + public String getContainerClassName() { + return containerClassName; + } + + public String getContainerId() { + return containerId; + } + + public String getValueClassName() { + return valueClassName; + } + + public String getValueId() { + return valueId; + } + + public TracePoint getLastUpdatePoint() { + return lastUpdatePoint; + } + + public TracePoint getBeforeTracePoint() { + return before; + } + + public Variable getParent() { + return parent; + } + + public List getChildren() { + return children; + } + + private void addChild(Variable child) { + children.add(child); + child.parent = this; + } + + @Override + public String toString() { + return variableName + ": " + valueClassName + "(" + "id = " + valueId + ")"; + } + + /** + * ���̃t�B�[���h���Q�ƌ^�I�u�W�F�N�g���z�񂩂𔻒肵�Ĕ��茋�ʂ�Ԃ�.
+ * (�ϐ��r���[�ɕ\��������f�[�^���ċA�I�ɋ��߂邽�߂�, �Ăяo�����Ŏ��ɂǂ̃��\�b�h���ĂԂ��𔻒f����̂ɗ��p) + * + * @param objData + * @return FIELD: �Q�ƌ^�I�u�W�F�N�g�̏ꍇ, ARRAY: �z��̏ꍇ, NONE: ����ȊO�̏ꍇ + */ + private DeepHierarchy checkDeepHierarchy() { + // note: �t�B�[���h��ID��Type���Ȃ��ꍇ��AType(=ActualType)��"---"�̏ꍇ�͉������Ȃ� + String id = (variableType.isContainerSide()) ? containerId : valueId; + String className = (variableType.isContainerSide()) ? containerClassName : valueClassName; + if (id == null || id.isEmpty() || className == null || className.isEmpty()) { + return DeepHierarchy.NONE; + } + + final String NULL_ACTUAL_TYPE = "---"; // �t�B�[���h�ɑ΂��Ė����I��null����ꂽ�ꍇ��ActualType�̎擾������ + if (className.equals(NULL_ACTUAL_TYPE)) return DeepHierarchy.NONE; + + final String ARRAY_SIGNATURE_HEAD = "["; // �z��̃V�O�l�`���̐擪�́A�z��̎��������� [ ���A�Ȃ� + if (className.startsWith(ARRAY_SIGNATURE_HEAD)) { + // note: �t�B�[���h��Type���z��^(�@[ �Ŏn�܂�@)�ꍇ (���̔z�񂪎��Še�v�f�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) + return DeepHierarchy.ARRAY; + } else { + String[] primitives = {"byte", "short", "int", "long", "float", "double", "char", "boolean"}; + if (!Arrays.asList(primitives).contains(this.getValueClassName())) { + // note: �t�B�[���h��Type���Q�ƌ^(=�I�u�W�F�N�g)�̏ꍇ (���̃I�u�W�F�N�g�������Ă���t�B�[���h�ɂ‚��Ă���Ȃ�f�[�^�擾�������Ăяo��) + return DeepHierarchy.FIELD; + } + } + return DeepHierarchy.NONE; + } + + public void createNextHierarchyState() { + if (alreadyCreatedGrandChildHierarchy) return; + getDeepHierarchyState(); + for (Variable child : children) { + child.getDeepHierarchyState(); + } + alreadyCreatedGrandChildHierarchy = true; + } + + private void getDeepHierarchyState() { + if (alreadyCreatedChildHierarchy) return; + switch (this.deepHierarchy) { + case FIELD: + getFieldsState(); + Collections.sort(children, new Comparator() { + @Override + public int compare(Variable arg0, Variable arg1) { + // �ϐ����̏����ɕ��ёւ��� + return arg0.getVariableName().compareTo(arg1.getVariableName()); + } + }); + break; + case ARRAY: + getArrayState(); + Collections.sort(children, new Comparator() { + @Override + public int compare(Variable arg0, Variable arg1) { + // �z��C���f�b�N�X�̏����ɕ��ёւ��� + String arg0Name = arg0.variableName; + String arg1Name = arg1.variableName; + int arg0Index = Integer.parseInt(arg0Name.substring(arg0Name.indexOf("[") + 1, arg0Name.lastIndexOf("]"))); + int arg1Index = Integer.parseInt(arg1Name.substring(arg0Name.indexOf("[") + 1, arg1Name.lastIndexOf("]"))); + return (arg0Index < arg1Index) ? -1 : 1; + } + }); + break; + case NONE: + break; + } + alreadyCreatedChildHierarchy = true; + } + + private void getFieldsState() { + // �t�B�[���h��ID��Type���擾���ĕ\�� + IType type = null; + if (variableType.isContainerSide()) { + type = JavaElementFinder.findIType(null, containerClassName); + } else { + type = JavaElementFinder.findIType(null, valueClassName); + } + if (type == null) return; + getFieldsState(type); + getFieldStateForSuperClass(type); // �e�N���X��k���Ă����A�����̃N���X�Œ�`���ꂽ�t�B�[���h�̏����擾���Ă��� (�������������������Ĕ��ɏd���Ȃ�) + } + + /** + * // �e�N���X��k���Ă����A�����̃N���X�Œ�`���ꂽ�t�B�[���h�̏����擾���Ă��� (�������������������Ĕ��ɏd���Ȃ�) + * @param type �N�_�ƂȂ�N���X + */ + private void getFieldStateForSuperClass(IType type) { + try { + while (true) { + String superClassName = type.getSuperclassName(); + if (superClassName == null) break; + String fullyQualifiedSuperClassName = JavaElementFinder.resolveType(type, superClassName); + if (fullyQualifiedSuperClassName == null) break; + type = JavaElementFinder.findIType(null, fullyQualifiedSuperClassName); + if (type == null) break; + getFieldsState(type); + } + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + + private void getFieldsState(IType type) { + try { + for (IField field : type.getFields()) { + if (Flags.isStatic(field.getFlags())) continue; + String fieldName = field.getDeclaringType().getElementName() + "." + field.getElementName(); // ���S����N���X�� + String fullyQualifiedFieldName = field.getDeclaringType().getFullyQualifiedName() + "." + field.getElementName(); // ���S����N���X�� + + // ���̃t�B�[���h�ɂ‚��Ă̍ŐV�̍X�V�����擾(FieldUpdate) + String nextContainerId = (variableType.isContainerSide()) ? containerId : valueId; + String nextClassName = (variableType.isContainerSide()) ? containerClassName : valueClassName; + TracePoint updateTracePoint = VariableUpdatePointFinder.getInstance().getPoint(nextContainerId, fullyQualifiedFieldName, before); + if (updateTracePoint != null) { + FieldUpdate fieldUpdate = (FieldUpdate)updateTracePoint.getStatement(); + // �t�B�[���h��ID��Type���擾(String) + String nextValueId = (fieldUpdate != null) ? fieldUpdate.getValueObjId() : "---"; + String nextValueClassName = (fieldUpdate != null) ? fieldUpdate.getValueClassName() : NULL_VALUE; + Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, nextClassName, nextContainerId, nextValueClassName, nextValueId, updateTracePoint, before, isReturned, VariableType.USE_VALUE); + this.addChild(fieldData); + } else { + Variable fieldData = new Variable(fieldName, fullyQualifiedFieldName, valueClassName, valueId, NULL_VALUE, "---", updateTracePoint, before, isReturned, VariableType.USE_VALUE); + this.addChild(fieldData); + } + } + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + + private void getArrayState() { + for (int i = 0; i < 10; i++) { + String index = String.valueOf(i); + String nextContainerId = (variableType.isContainerSide()) ? containerId : valueId; + String nextClassName = (variableType.isContainerSide()) ? containerClassName : valueClassName; + TracePoint updateTracePoint = VariableUpdatePointFinder.getInstance().getPoint(nextContainerId, index, before); + + String arrayIndexName = "[" + i + "]"; + String fullyArrayIndexName = variableName + arrayIndexName; + String nextValueId = NULL_VALUE; + String nextValueClassName = "---"; + if (updateTracePoint != null) { + ArrayUpdate arrayUpdate = (ArrayUpdate)updateTracePoint.getStatement(); + nextValueId = arrayUpdate.getValueObjectId(); + nextValueClassName = arrayUpdate.getValueClassName(); + } + Variable arrayIndexData = new Variable(arrayIndexName, fullyArrayIndexName, nextClassName, nextContainerId, nextValueClassName, nextValueId, updateTracePoint, before, isReturned, VariableType.USE_VALUE); + this.addChild(arrayIndexData); + } + } + + public void addAdditionalAttribute(String key, Object value) { + additionalAttributes.put(key, value); + } + + public Object getAdditionalAttribute(String key) { + return additionalAttributes.get(key); + } + + private enum DeepHierarchy { + NONE, FIELD, ARRAY; + } } \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/VariableLabelProvider.java b/src/org/ntlab/traceDebugger/VariableLabelProvider.java index e9aecfd..bb57ed5 100644 --- a/src/org/ntlab/traceDebugger/VariableLabelProvider.java +++ b/src/org/ntlab/traceDebugger/VariableLabelProvider.java @@ -1,164 +1,161 @@ -package org.ntlab.traceDebugger; - -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.jface.viewers.ITableColorProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.TreeNode; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.PlatformUI; -import org.ntlab.traceDebugger.Variable.VariableType; -import org.ntlab.traceDebugger.analyzerProvider.DeltaMarkerManager; - -public class VariableLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider { - public static final String SPECIAL_VARIABLE = "SpecialVariable"; - public static final String THIS_VARIABLE = "ThisVariable"; - public static final String FIELD_VARIABLE = "FieldVariable"; - public static final String ARG_VARIABLE = "ArgVariable"; - private Image specialVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(SPECIAL_VARIABLE).createImage(); - private Image thisVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(THIS_VARIABLE).createImage(); - private Image fieldVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(FIELD_VARIABLE).createImage(); - private Image argVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(ARG_VARIABLE).createImage(); - - @Override - public String getColumnText(Object element, int columnIndex) { - if (element instanceof TreeNode) { - Object value = ((TreeNode)element).getValue(); - if (value instanceof String) { - String name = (String)value; - String constructorMsg = TraceDebuggerPlugin.isJapanese() ? "�R���X�g���N�^" : "Constructor"; - switch (columnIndex) { - case 0: { - if (name.contains(constructorMsg)) { - return name.substring(0, name.indexOf(constructorMsg)); - } - return name.substring(0, name.indexOf(":")); - } - case 1: - String valueName = name.substring(name.indexOf(":") + 1); - valueName = valueName.substring(valueName.lastIndexOf(" ") + 1); - boolean isConstructor = name.contains(constructorMsg); - return getReadableName(valueName, isConstructor); - } - } - if (value instanceof Variable) { - Variable variableData = (Variable)value; - String variableName = variableData.getVariableName(); - switch (columnIndex) { - case 0: - if (variableName.contains("[")) { - return variableName.substring(variableName.lastIndexOf("[")); - } else if (variableName.contains(".")) { - return variableName.substring(variableName.lastIndexOf(".") + 1); - } - return variableName; - case 1: - String simpleName; - String id; - if (variableData.getVariableType().isContainerSide()) { - simpleName = variableData.getContainerClassName(); - id = variableData.getContainerId(); - } else { - simpleName = variableData.getValueClassName(); - id = variableData.getValueId(); - } - simpleName = simpleName.substring(simpleName.lastIndexOf(".") + 1); - if (simpleName.equals(Variable.NULL_VALUE)) { - return simpleName; - } else { - return simpleName + " (" + "id = " + id + ")"; - } - } - } - } - return "�e�X�g�p�e�L�X�g" + columnIndex; - } - - @Override - public Image getColumnImage(Object element, int columnIndex) { - if (columnIndex == 0) { - if (element instanceof TreeNode) { - Object value = ((TreeNode)element).getValue(); - if (value instanceof String) { - return specialVariableImage; - } else if (value instanceof Variable) { - Variable variable = (Variable)value; - VariableType variableType = variable.getVariableType(); - if (variableType == VariableType.THIS) { - return thisVariableImage; - } else if (variableType == VariableType.PARAMETER){ - return argVariableImage; - } else if (variableType.isContainerSide()) { - return thisVariableImage; - } else { - return fieldVariableImage; - } - } - } - } - return null; - } - - @Override - public Color getForeground(Object element, int columnIndex) { - return null; - } - - @Override - public Color getBackground(Object element, int columnIndex) { - if (element instanceof TreeNode) { - Object value = ((TreeNode)element).getValue(); - if (value instanceof Variable) { - Variable variable = (Variable)value; - Object markerId = variable.getAdditionalAttribute("markerId"); - if (!(markerId instanceof String)) return null; - switch ((String)markerId) { - case DeltaMarkerManager.SRC_SIDE_DELTA_MARKER: - return DeltaMarkerLabelProvider.SETTER_SIDE_LABEL_COLOR; - case DeltaMarkerManager.DST_SIDE_DELTA_MARKER: - return DeltaMarkerLabelProvider.GETTER_SIDE_LABEL_COLOR; - case DeltaMarkerManager.COORDINATOR_DELTA_MARKER: - return DeltaMarkerLabelProvider.COORDINATOR_LABEL_COLOR; - } - } - } - return null; - } - - private String getReadableName(String name, boolean isConstrutor) { - if (!(name.contains("("))) { - String[] splits = name.split("\\."); - if (splits.length < 2) return name; - return splits[splits.length - 2] + "." + splits[splits.length - 1]; - } - StringBuilder sb = new StringBuilder(); - String receiverTypeAndMethodName = name.substring(0, name.indexOf("(")); - String[] receiverTypeAndMethodNameSplits = receiverTypeAndMethodName.split("\\."); - if (receiverTypeAndMethodNameSplits.length < 2) { - sb.append(receiverTypeAndMethodName); - } else { - if (!isConstrutor) { - sb.append(receiverTypeAndMethodNameSplits[receiverTypeAndMethodNameSplits.length - 2]); - sb.append("."); - } - sb.append(receiverTypeAndMethodNameSplits[receiverTypeAndMethodNameSplits.length - 1]); - } - sb.append("("); - String argsName = name.substring(name.indexOf("(") + 1, name.lastIndexOf(")")); - String delimiter = ""; - for (String argName : argsName.split(",")) { - String[] argNameSplits = argName.split("\\."); - if (argNameSplits.length < 1) { - sb.append(delimiter + argName); - } else { - sb.append(delimiter + argNameSplits[argNameSplits.length - 1]); - } - delimiter = ","; - } - sb.append(")"); - return sb.toString(); - } -} +package org.ntlab.traceDebugger; + +import org.eclipse.jface.viewers.ITableColorProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TreeNode; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.ntlab.traceDebugger.Variable.VariableType; +import org.ntlab.traceDebugger.analyzerProvider.DeltaMarkerManager; + +public class VariableLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider { + public static final String SPECIAL_VARIABLE = "SpecialVariable"; + public static final String THIS_VARIABLE = "ThisVariable"; + public static final String FIELD_VARIABLE = "FieldVariable"; + public static final String ARG_VARIABLE = "ArgVariable"; + private Image specialVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(SPECIAL_VARIABLE).createImage(); + private Image thisVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(THIS_VARIABLE).createImage(); + private Image fieldVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(FIELD_VARIABLE).createImage(); + private Image argVariableImage = TraceDebuggerPlugin.getDefault().getImageRegistry().getDescriptor(ARG_VARIABLE).createImage(); + + @Override + public String getColumnText(Object element, int columnIndex) { + if (element instanceof TreeNode) { + Object value = ((TreeNode)element).getValue(); + if (value instanceof String) { + String name = (String)value; + String constructorMsg = TraceDebuggerPlugin.isJapanese() ? "�R���X�g���N�^" : "Constructor"; + switch (columnIndex) { + case 0: { + if (name.contains(constructorMsg)) { + return name.substring(0, name.indexOf(constructorMsg)); + } + return name.substring(0, name.indexOf(":")); + } + case 1: + String valueName = name.substring(name.indexOf(":") + 1); + valueName = valueName.substring(valueName.lastIndexOf(" ") + 1); + boolean isConstructor = name.contains(constructorMsg); + return getReadableName(valueName, isConstructor); + } + } + if (value instanceof Variable) { + Variable variableData = (Variable)value; + String variableName = variableData.getVariableName(); + switch (columnIndex) { + case 0: + if (variableName.contains("[")) { + return variableName.substring(variableName.lastIndexOf("[")); + } else if (variableName.contains(".")) { + return variableName.substring(variableName.lastIndexOf(".") + 1); + } + return variableName; + case 1: + String simpleName; + String id; + if (variableData.getVariableType().isContainerSide()) { + simpleName = variableData.getContainerClassName(); + id = variableData.getContainerId(); + } else { + simpleName = variableData.getValueClassName(); + id = variableData.getValueId(); + } + simpleName = simpleName.substring(simpleName.lastIndexOf(".") + 1); + simpleName = simpleName.replace(";", "[]"); // �z��̍ۂ̕\�� + if (simpleName.equals(Variable.NULL_VALUE)) { + return simpleName; + } else { + return simpleName + " (" + "id = " + id + ")"; + } + } + } + } + return "�e�X�g�p�e�L�X�g" + columnIndex; + } + + @Override + public Image getColumnImage(Object element, int columnIndex) { + if (columnIndex == 0) { + if (element instanceof TreeNode) { + Object value = ((TreeNode)element).getValue(); + if (value instanceof String) { + return specialVariableImage; + } else if (value instanceof Variable) { + Variable variable = (Variable)value; + VariableType variableType = variable.getVariableType(); + if (variableType == VariableType.THIS) { + return thisVariableImage; + } else if (variableType == VariableType.PARAMETER){ + return argVariableImage; + } else if (variableType.isContainerSide()) { + return thisVariableImage; + } else { + return fieldVariableImage; + } + } + } + } + return null; + } + + @Override + public Color getForeground(Object element, int columnIndex) { + return null; + } + + @Override + public Color getBackground(Object element, int columnIndex) { + if (element instanceof TreeNode) { + Object value = ((TreeNode)element).getValue(); + if (value instanceof Variable) { + Variable variable = (Variable)value; + Object markerId = variable.getAdditionalAttribute("markerId"); + if (!(markerId instanceof String)) return null; + switch ((String)markerId) { + case DeltaMarkerManager.SRC_SIDE_DELTA_MARKER: + return DeltaMarkerLabelProvider.SETTER_SIDE_LABEL_COLOR; + case DeltaMarkerManager.DST_SIDE_DELTA_MARKER: + return DeltaMarkerLabelProvider.GETTER_SIDE_LABEL_COLOR; + case DeltaMarkerManager.COORDINATOR_DELTA_MARKER: + return DeltaMarkerLabelProvider.COORDINATOR_LABEL_COLOR; + } + } + } + return null; + } + + private String getReadableName(String name, boolean isConstrutor) { + if (!(name.contains("("))) { + String[] splits = name.split("\\."); + if (splits.length < 2) return name; + return splits[splits.length - 2] + "." + splits[splits.length - 1]; + } + StringBuilder sb = new StringBuilder(); + String receiverTypeAndMethodName = name.substring(0, name.indexOf("(")); + String[] receiverTypeAndMethodNameSplits = receiverTypeAndMethodName.split("\\."); + if (receiverTypeAndMethodNameSplits.length < 2) { + sb.append(receiverTypeAndMethodName); + } else { + if (!isConstrutor) { + sb.append(receiverTypeAndMethodNameSplits[receiverTypeAndMethodNameSplits.length - 2]); + sb.append("."); + } + sb.append(receiverTypeAndMethodNameSplits[receiverTypeAndMethodNameSplits.length - 1]); + } + sb.append("("); + String argsName = name.substring(name.indexOf("(") + 1, name.lastIndexOf(")")); + String delimiter = ""; + for (String argName : argsName.split(",")) { + String[] argNameSplits = argName.split("\\."); + if (argNameSplits.length < 1) { + sb.append(delimiter + argName); + } else { + sb.append(delimiter + argNameSplits[argNameSplits.length - 1]); + } + delimiter = ","; + } + sb.append(")"); + return sb.toString(); + } +} diff --git a/src/org/ntlab/traceDebugger/VariableViewRelatedDelta.java b/src/org/ntlab/traceDebugger/VariableViewRelatedDelta.java index 135cb77..380e2e1 100644 --- a/src/org/ntlab/traceDebugger/VariableViewRelatedDelta.java +++ b/src/org/ntlab/traceDebugger/VariableViewRelatedDelta.java @@ -33,6 +33,8 @@ private IAction deltaActionForContainerToComponent; private IAction deltaActionForThisToAnother; public static final String ID = "org.ntlab.traceDebugger.variableViewRelatedDelta"; + + public static long startTime = 0L; public VariableViewRelatedDelta() { // TODO Auto-generated constructor stub @@ -75,7 +77,8 @@ deltaActionForContainerToComponent = new Action() { @Override - public void run() { + public void run() { +// startTime = System.nanoTime(); DeltaMarkerView newDeltaMarkerView = (DeltaMarkerView)TraceDebuggerPlugin.createNewView(DeltaMarkerView.ID, IWorkbenchPage.VIEW_ACTIVATE); newDeltaMarkerView.extractDeltaForContainerToComponent(selectedVariable); } @@ -84,6 +87,7 @@ deltaActionForThisToAnother = new Action() { @Override public void run() { +// startTime = System.nanoTime(); TracePoint before = selectedVariable.getBeforeTracePoint(); String thisId = before.getMethodExecution().getThisObjId(); String thisClassName = before.getMethodExecution().getThisClassName(); @@ -107,6 +111,10 @@ if (variableType.equals(VariableType.USE_VALUE)) { String containerId = selectedVariable.getContainerId(); String fieldName = selectedVariable.getFullyQualifiedVariableName(); + if (fieldName.contains("[")) { + // �z��v�f�̏ꍇ�͍Ō�̃C���f�b�N�X�̕��������𗘗p���� + fieldName = fieldName.substring(fieldName.lastIndexOf("[") + 1, fieldName.lastIndexOf("]")); + } return VariableUpdatePointFinder.getInstance().getPoint(containerId, fieldName, before); } else if (variableType.equals(VariableType.USE_RETURN)) { return findJumpPointWithReturnValue(variable, before); diff --git a/src/org/ntlab/traceDebugger/Variables.java b/src/org/ntlab/traceDebugger/Variables.java index 61335f7..915b369 100644 --- a/src/org/ntlab/traceDebugger/Variables.java +++ b/src/org/ntlab/traceDebugger/Variables.java @@ -1,366 +1,391 @@ -package org.ntlab.traceDebugger; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.jdt.core.IMethod; -import org.eclipse.jdt.core.IType; -import org.eclipse.jdt.core.JavaModelException; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldAccess; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; -import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; -import org.ntlab.traceDebugger.Variable.VariableType; - -public class Variables { - private static final Variables theInstance = new Variables(); - private List roots = new ArrayList<>(); - private List rootTreeNodes = new ArrayList<>(); - private Map> containerIdToDifferentialUpdateTracePoints = new HashMap<>(); // �ϐ������X�V�ӏ����L�� - public static final String VARIABLE_TYPE_KEY = "variableType"; - - public static Variables getInstance() { - return theInstance; - } - - public List getVariablesTreeNodesList() { - return rootTreeNodes; - } - - private void createVariablesTreeNodeList(MyTreeNode parentNode, List addingNodes, int index, Variable addingVariableData) { - MyTreeNode newNode = new MyTreeNode(addingVariableData); - newNode.setParent(parentNode); - addingNodes.add(index, newNode); - List childNodes = new ArrayList<>(); - addingNodes.get(index).setChildList(childNodes); - for (int i = 0; i < addingVariableData.getChildren().size(); i++) { - Variable child = addingVariableData.getChildren().get(i); - createVariablesTreeNodeList(newNode, childNodes, i, child); - } - } - - public void updateAllObjectDataByMethodExecution(MethodExecution methodExecution) { - if (methodExecution == null) return; - List statements = methodExecution.getStatements(); - int lastOrder = statements.size() - 1; - TracePoint tp = methodExecution.getTracePoint(lastOrder); - updateAllObjectData(null, tp, false, null); - } - - public void updateAllObjectDataByTracePoint(TracePoint from, TracePoint to, boolean isReturned, TracePoint before) { - updateAllObjectData(from, to, isReturned, before); - } - - private void updateAllObjectData(TracePoint from, TracePoint to, boolean isReturned, TracePoint before) { - resetData(); - MethodExecution me = to.getMethodExecution(); - updateRootThisState(me, to, isReturned, before); - updateArgsState(me, to, isReturned, before); - for (int i = 0; i < roots.size(); i++) { - Variable rootVariableData = roots.get(i); - createVariablesTreeNodeList(null, rootTreeNodes, i, rootVariableData); - } - createSpecialVariables(from, to, isReturned); - } - - private void updateRootThisState(MethodExecution methodExecution, TracePoint tp, boolean isReturned, TracePoint before) { - String thisObjId = methodExecution.getThisObjId(); - String thisClassName = methodExecution.getThisClassName(); - if (before == null) before = tp; - Variable variable = new Variable("this", null, null, thisClassName, thisObjId, before, isReturned, VariableType.THIS); - roots.add(variable); - variable.createNextHierarchyState(); - } - - private void updateArgsState(MethodExecution methodExecution, TracePoint tp, boolean isReturned, TracePoint before) { - // methodExecution������arguments���擾(ArrayList)���A����arguments�̃T�C�Y���擾(int) - List args = methodExecution.getArguments(); - if (before == null) before = tp; - if (args.size() > 0) { - IType type = JavaElementFinder.findIType(methodExecution); - String methodSignature = methodExecution.getSignature(); - IMethod method = JavaElementFinder.findIMethod(type, methodSignature); - String[] argNames = getParameterNames(method); // ������IMethod���牼���������擾���� - for (int i = 0; i < args.size(); i++) { - String argName = (argNames.length == args.size()) ? argNames[i] : "arg" + i; // ���Ȃ��Ƃ������̌����s��v�̂Ƃ��͐����������������Ă��Ȃ� - ObjectReference arg = args.get(i); - String argId = arg.getId(); - String argType = arg.getActualType(); - Variable argData = new Variable(argName, null, null, argType, argId, before, isReturned, VariableType.PARAMETER); - argData.createNextHierarchyState(); - roots.add(argData); - } - } - } - - private String[] getParameterNames(IMethod method) { - String[] argNames = new String[0]; - if (method != null) { - try { - argNames = method.getParameterNames(); - } catch (JavaModelException e) { - e.printStackTrace(); - } - } - return argNames; - } - - public void addAdditionalAttributes(final Set idSet, final Map additionalAttributes) { - for (Variable root : roots) { - addAdditionalAttributes(root, idSet, additionalAttributes); - } - } - - private void addAdditionalAttributes(Variable variable, final Set idSet, final Map additionalAttributes) { - if (variable == null) return; - VariableType variableType = variable.getVariableType(); - String id = variableType.isContainerSide() ? variable.getContainerId() : variable.getValueId(); - if (id.equals("0")) return; - if (idSet.contains(id)) { - for (Map.Entry entry : additionalAttributes.entrySet()) { - variable.addAdditionalAttribute(entry.getKey(), entry.getValue()); - } - } - for (Variable child : variable.getChildren()) { - addAdditionalAttributes(child, idSet, additionalAttributes); - } - } - - public void addDifferentialUpdatePoint(TracePoint tp) { - Statement statement = tp.getStatement(); - String containerId = null; - if (statement instanceof FieldUpdate) { - FieldUpdate fu = (FieldUpdate)statement; - containerId = fu.getContainerObjId(); - } else if (statement instanceof ArrayUpdate) { - ArrayUpdate au = (ArrayUpdate)statement; - containerId = au.getArrayObjectId(); - } - if (containerId == null) return; - List tracePoints = containerIdToDifferentialUpdateTracePoints.get(containerId); - if (tracePoints == null) { - tracePoints = new ArrayList(); - containerIdToDifferentialUpdateTracePoints.put(containerId, tracePoints); - } - tracePoints.add(tp.duplicate()); - } - - public void updateForDifferential(TracePoint from, TracePoint to, boolean isReturned) { - updateForDifferential(); - resetSpecialValues(); - createSpecialVariables(from, to, isReturned); - } - - private void updateForDifferential() { - for (Variable variable : roots) { - updateForDifferential(variable, new HashSet()); - } - containerIdToDifferentialUpdateTracePoints.clear(); - } - - private void updateForDifferential(Variable variable, Set hasCheckedObjectIdSet) { - Set containerIdList = containerIdToDifferentialUpdateTracePoints.keySet(); - String containerId = variable.getContainerId(); - if (containerIdList.contains(containerId)) { - for (TracePoint tp : containerIdToDifferentialUpdateTracePoints.get(containerId)) { - Statement statement = tp.getStatement(); - if (statement instanceof FieldUpdate) { - FieldUpdate fu = (FieldUpdate)statement; - if (variable.getFullyQualifiedVariableName().equals(fu.getFieldName())) { - updateForDifferentialField(variable, fu.getValueClassName(), fu.getValueObjId(), tp); - } - } else if (statement instanceof ArrayUpdate) { - ArrayUpdate au = (ArrayUpdate)statement; - String fullyQualifiedVariableName = variable.getFullyQualifiedVariableName(); - if (fullyQualifiedVariableName.contains("[" + au.getIndex() + "]")) { - updateForDifferentialField(variable, au.getValueClassName(), au.getValueObjectId(), tp); - } - } - } - } - HashSet hasCheckedObjectIdSetOnNext = new HashSet<>(hasCheckedObjectIdSet); - hasCheckedObjectIdSetOnNext.add(variable.getContainerId()); - for (Variable child : variable.getChildren()) { - if (hasCheckedObjectIdSetOnNext.contains(child.getContainerId())) continue; - updateForDifferential(child, hasCheckedObjectIdSetOnNext); - } - } - - private void updateForDifferentialField(Variable variable, String valueClassName, String valueId, TracePoint lastUpdatePoint) { - variable.update(valueClassName, valueId, lastUpdatePoint, false); - variable.createNextHierarchyState(); - MyTreeNode node = getTreeNodeFor(variable, rootTreeNodes); - List childList = node.getChildList(); - childList.clear(); - for (int i = 0; i < variable.getChildren().size(); i++) { - Variable childVariable = variable.getChildren().get(i); - createVariablesTreeNodeList(node, childList, i, childVariable); - } - } - - private void createSpecialVariables(TracePoint from, TracePoint to, boolean isReturned) { -// List list = new ArrayList<>(); - List specialVariablesOfUseSide = new ArrayList<>(); - List specialVariablesDefSide = new ArrayList<>(); - String parentNodeNameOfUseSide = null; - String parentNodeNameOfDefSide = null; - if (from != null) { - // ���s�����use�v�f - Statement fromStatement = from.getStatement(); - if (fromStatement instanceof FieldAccess) { - FieldAccess fa = (FieldAccess)fromStatement; - String containerClassName = fa.getContainerClassName(); - String containerObjId = fa.getContainerObjId(); - String valueClassName = fa.getValueClassName(); - String valueObjId = fa.getValueObjId(); - Variable container = new Variable(Variable.CONTAINER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_CONTAINER); - Variable value = new Variable(Variable.VALUE_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_VALUE); - specialVariablesOfUseSide.add(container); - specialVariablesOfUseSide.add(value); - parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�t�B�[���h�Q�ƌ�:" : "after field get of:"; - parentNodeNameOfUseSide += fa.getFieldName(); - } else if (fromStatement instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation)fromStatement; - MethodExecution calledME = mi.getCalledMethodExecution(); - ObjectReference returnValue = calledME.getReturnValue(); - if (returnValue != null) { - String containerClassName = calledME.getThisClassName(); - String containerObjId = calledME.getThisObjId(); - String valueClassName = returnValue.getActualType(); - String valueObjId = returnValue.getId(); - Variable receiver = new Variable(Variable.RECEIVER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_RECEIVER); - Variable returned = new Variable(Variable.RETURN_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_RETURN); - specialVariablesOfUseSide.add(receiver); - specialVariablesOfUseSide.add(returned); - if (calledME.isConstructor()) { - parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo���� �R���X�g���N�^:" : "after invocation of Constructor:"; - parentNodeNameOfUseSide += calledME.getSignature(); - } else { - parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo����:" : "after invocation of:"; - parentNodeNameOfUseSide += calledME.getSignature(); - } - } - } - } - - if (to != null) { - // ���s���O��def�v�f - Statement toStatement = to.getStatement(); - if (toStatement instanceof FieldUpdate) { - FieldUpdate fu = (FieldUpdate)toStatement; - String containerClassName = fu.getContainerClassName(); - String containerObjId = fu.getContainerObjId(); - String valueClassName = fu.getValueClassName(); - String valueObjId = fu.getValueObjId(); - Variable container = new Variable(Variable.CONTAINER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_CONTAINER); - Variable value = new Variable(Variable.VALUE_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_VALUE); - specialVariablesDefSide.add(container); - specialVariablesDefSide.add(value); - parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�t�B�[���h����O:" : "before field set of:"; - parentNodeNameOfDefSide += fu.getFieldName(); - } else if (toStatement instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation)toStatement; - MethodExecution calledME = mi.getCalledMethodExecution(); - List args = calledME.getArguments(); - String valueClassName = ""; - String valueObjId = ""; - if (args.size() > 0) { - valueClassName = args.get(0).getActualType(); - valueObjId = args.get(0).getId(); - } - String containerClassName = calledME.getThisClassName(); - String containerObjId = calledME.getThisObjId(); - Variable receiver = new Variable(Variable.RECEIVER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_RECEIVER); - specialVariablesDefSide.add(receiver); - for (ObjectReference obj : args) { - valueClassName = obj.getActualType(); - valueObjId = obj.getId(); - Variable arg = new Variable(Variable.ARG_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_ARG); - specialVariablesDefSide.add(arg); - } - if (calledME.isConstructor()) { - parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo���O �R���X�g���N�^:" : "before invocation of Constructor:"; - parentNodeNameOfDefSide += calledME.getSignature(); - } else { - parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo���O:" : "before invocation of:"; - parentNodeNameOfDefSide += calledME.getSignature(); - } - } - } - if (parentNodeNameOfDefSide != null) { - setSpecialVariableNodes(parentNodeNameOfDefSide, specialVariablesDefSide); - } - if (parentNodeNameOfUseSide != null) { - setSpecialVariableNodes(parentNodeNameOfUseSide, specialVariablesOfUseSide); - } - } - - private void setSpecialVariableNodes(String parentNodeName, List specialVariables) { - MyTreeNode parentNode = new MyTreeNode(parentNodeName); - rootTreeNodes.add(0, parentNode); - MyTreeNode[] children = new MyTreeNode[specialVariables.size()]; - for (int i = 0; i < specialVariables.size(); i++) { - Variable variable = specialVariables.get(i); - variable.createNextHierarchyState(); - roots.add(0, variable); - MyTreeNode variableNode = new MyTreeNode(variable); - children[i] = variableNode; - variableNode.setParent(parentNode); - createChildNodesOfSpecialVariableNode(variableNode); - } - parentNode.setChildren(children); - } - - private void createChildNodesOfSpecialVariableNode(MyTreeNode variableNode) { - List childList = new ArrayList<>(); - variableNode.setChildList(childList); - Variable variable = (Variable)variableNode.getValue(); - for (int i = 0; i < variable.getChildren().size(); i++) { - Variable childVariable = variable.getChildren().get(i); - createVariablesTreeNodeList(variableNode, childList, i, childVariable); - } - } - - public void resetData() { - roots.clear(); - rootTreeNodes.clear(); - containerIdToDifferentialUpdateTracePoints.clear(); - } - - private void resetSpecialValues() { - for (int i = roots.size() - 1; i >= 0; i--) { - Variable root = roots.get(i); - String variableName = root.getVariableName(); - if (variableName.equals(Variable.CONTAINER_VARIABLE_NAME) - || variableName.equals(Variable.VALUE_VARIABLE_NAME) - || variableName.equals(Variable.RECEIVER_VARIABLE_NAME) - || variableName.equals(Variable.ARG_VARIABLE_NAME) - || variableName.equals(Variable.RETURN_VARIABLE_NAME)) { - roots.remove(i); - } - } - for (int i = rootTreeNodes.size() - 1; i >= 0; i--) { - MyTreeNode node = rootTreeNodes.get(i); - if (node.getValue() instanceof String) { - rootTreeNodes.remove(i); - } - } - } - - private MyTreeNode getTreeNodeFor(Variable variable, List nodes) { - for (MyTreeNode node : nodes) { - if (node.getValue().equals(variable)) return node; - MyTreeNode deep = getTreeNodeFor(variable, node.getChildList()); - if (deep != null) return deep; - } - return null; - } -} +package org.ntlab.traceDebugger; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayAccess; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldAccess; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; +import org.ntlab.traceDebugger.Variable.VariableType; + +public class Variables { + private static final Variables theInstance = new Variables(); + private List roots = new ArrayList<>(); + private List rootTreeNodes = new ArrayList<>(); + private Map> containerIdToDifferentialUpdateTracePoints = new HashMap<>(); // �ϐ������X�V�ӏ����L�� + public static final String VARIABLE_TYPE_KEY = "variableType"; + + public static Variables getInstance() { + return theInstance; + } + + public List getVariablesTreeNodesList() { + return rootTreeNodes; + } + + private void createVariablesTreeNodeList(MyTreeNode parentNode, List addingNodes, int index, Variable addingVariableData) { + MyTreeNode newNode = new MyTreeNode(addingVariableData); + newNode.setParent(parentNode); + addingNodes.add(index, newNode); + List childNodes = new ArrayList<>(); + addingNodes.get(index).setChildList(childNodes); + for (int i = 0; i < addingVariableData.getChildren().size(); i++) { + Variable child = addingVariableData.getChildren().get(i); + createVariablesTreeNodeList(newNode, childNodes, i, child); + } + } + + public void updateAllObjectDataByMethodExecution(MethodExecution methodExecution) { + if (methodExecution == null) return; + List statements = methodExecution.getStatements(); + int lastOrder = statements.size() - 1; + TracePoint tp = methodExecution.getTracePoint(lastOrder); + updateAllObjectData(null, tp, false, null); + } + + public void updateAllObjectDataByTracePoint(TracePoint from, TracePoint to, boolean isReturned, TracePoint before) { + updateAllObjectData(from, to, isReturned, before); + } + + private void updateAllObjectData(TracePoint from, TracePoint to, boolean isReturned, TracePoint before) { + resetData(); + MethodExecution me = to.getMethodExecution(); + updateRootThisState(me, to, isReturned, before); + updateArgsState(me, to, isReturned, before); + for (int i = 0; i < roots.size(); i++) { + Variable rootVariableData = roots.get(i); + createVariablesTreeNodeList(null, rootTreeNodes, i, rootVariableData); + } + createSpecialVariables(from, to, isReturned); + } + + private void updateRootThisState(MethodExecution methodExecution, TracePoint tp, boolean isReturned, TracePoint before) { + String thisObjId = methodExecution.getThisObjId(); + String thisClassName = methodExecution.getThisClassName(); + if (before == null) before = tp; + Variable variable = new Variable("this", null, null, thisClassName, thisObjId, before, isReturned, VariableType.THIS); + roots.add(variable); + variable.createNextHierarchyState(); + } + + private void updateArgsState(MethodExecution methodExecution, TracePoint tp, boolean isReturned, TracePoint before) { + // methodExecution������arguments���擾(ArrayList)���A����arguments�̃T�C�Y���擾(int) + List args = methodExecution.getArguments(); + if (before == null) before = tp; + if (args.size() > 0) { + IType type = JavaElementFinder.findIType(methodExecution); + String methodSignature = methodExecution.getSignature(); + IMethod method = JavaElementFinder.findIMethod(type, methodSignature); + String[] argNames = getParameterNames(method); // ������IMethod���牼���������擾���� + for (int i = 0; i < args.size(); i++) { + String argName = (argNames.length == args.size()) ? argNames[i] : "arg" + i; // ���Ȃ��Ƃ������̌����s��v�̂Ƃ��͐����������������Ă��Ȃ� + ObjectReference arg = args.get(i); + String argId = arg.getId(); + String argType = arg.getActualType(); + Variable argData = new Variable(argName, null, null, argType, argId, before, isReturned, VariableType.PARAMETER); + argData.createNextHierarchyState(); + roots.add(argData); + } + } + } + + private String[] getParameterNames(IMethod method) { + String[] argNames = new String[0]; + if (method != null) { + try { + argNames = method.getParameterNames(); + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + return argNames; + } + + public void addAdditionalAttributes(final Set idSet, final Map additionalAttributes) { + for (Variable root : roots) { + addAdditionalAttributes(root, idSet, additionalAttributes); + } + } + + private void addAdditionalAttributes(Variable variable, final Set idSet, final Map additionalAttributes) { + if (variable == null) return; + VariableType variableType = variable.getVariableType(); + String id = variableType.isContainerSide() ? variable.getContainerId() : variable.getValueId(); + if (id.equals("0")) return; + if (idSet.contains(id)) { + for (Map.Entry entry : additionalAttributes.entrySet()) { + variable.addAdditionalAttribute(entry.getKey(), entry.getValue()); + } + } + for (Variable child : variable.getChildren()) { + addAdditionalAttributes(child, idSet, additionalAttributes); + } + } + + public void addDifferentialUpdatePoint(TracePoint tp) { + Statement statement = tp.getStatement(); + String containerId = null; + if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + containerId = fu.getContainerObjId(); + } else if (statement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)statement; + containerId = au.getArrayObjectId(); + } + if (containerId == null) return; + List tracePoints = containerIdToDifferentialUpdateTracePoints.get(containerId); + if (tracePoints == null) { + tracePoints = new ArrayList(); + containerIdToDifferentialUpdateTracePoints.put(containerId, tracePoints); + } + tracePoints.add(tp.duplicate()); + } + + public void updateForDifferential(TracePoint from, TracePoint to, boolean isReturned) { + updateForDifferential(); + resetSpecialValues(); + createSpecialVariables(from, to, isReturned); + } + + private void updateForDifferential() { + for (Variable variable : roots) { + updateForDifferential(variable, new HashSet()); + } + containerIdToDifferentialUpdateTracePoints.clear(); + } + + private void updateForDifferential(Variable variable, Set hasCheckedObjectIdSet) { + Set containerIdList = containerIdToDifferentialUpdateTracePoints.keySet(); + String containerId = variable.getContainerId(); + if (containerIdList.contains(containerId)) { + for (TracePoint tp : containerIdToDifferentialUpdateTracePoints.get(containerId)) { + Statement statement = tp.getStatement(); + if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + if (variable.getFullyQualifiedVariableName().equals(fu.getFieldName())) { + updateForDifferentialField(variable, fu.getValueClassName(), fu.getValueObjId(), tp); + } + } else if (statement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)statement; + String fullyQualifiedVariableName = variable.getFullyQualifiedVariableName(); + if (fullyQualifiedVariableName.contains("[" + au.getIndex() + "]")) { + updateForDifferentialField(variable, au.getValueClassName(), au.getValueObjectId(), tp); + } + } + } + } + HashSet hasCheckedObjectIdSetOnNext = new HashSet<>(hasCheckedObjectIdSet); + hasCheckedObjectIdSetOnNext.add(variable.getContainerId()); + for (Variable child : variable.getChildren()) { + if (hasCheckedObjectIdSetOnNext.contains(child.getContainerId())) continue; + updateForDifferential(child, hasCheckedObjectIdSetOnNext); + } + } + + private void updateForDifferentialField(Variable variable, String valueClassName, String valueId, TracePoint lastUpdatePoint) { + variable.update(valueClassName, valueId, lastUpdatePoint, false); + variable.createNextHierarchyState(); + MyTreeNode node = getTreeNodeFor(variable, rootTreeNodes); + List childList = node.getChildList(); + childList.clear(); + for (int i = 0; i < variable.getChildren().size(); i++) { + Variable childVariable = variable.getChildren().get(i); + createVariablesTreeNodeList(node, childList, i, childVariable); + } + } + + private void createSpecialVariables(TracePoint from, TracePoint to, boolean isReturned) { +// List list = new ArrayList<>(); + List specialVariablesOfUseSide = new ArrayList<>(); + List specialVariablesDefSide = new ArrayList<>(); + String parentNodeNameOfUseSide = null; + String parentNodeNameOfDefSide = null; + if (from != null) { + // ���s�����use�v�f + Statement fromStatement = from.getStatement(); + if (fromStatement instanceof FieldAccess) { + FieldAccess fa = (FieldAccess)fromStatement; + String containerClassName = fa.getContainerClassName(); + String containerObjId = fa.getContainerObjId(); + String valueClassName = fa.getValueClassName(); + String valueObjId = fa.getValueObjId(); + Variable container = new Variable(Variable.CONTAINER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_CONTAINER); + Variable value = new Variable(Variable.VALUE_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_VALUE); + specialVariablesOfUseSide.add(container); + specialVariablesOfUseSide.add(value); + parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�t�B�[���h�Q�ƌ�:" : "after field get of:"; + parentNodeNameOfUseSide += fa.getFieldName(); + } else if (fromStatement instanceof ArrayAccess) { + ArrayAccess aa = (ArrayAccess)fromStatement; + String arrayClassName = aa.getArrayClassName(); + String arrayObjId = aa.getArrayObjectId(); + String valueClassName = aa.getValueClassName(); + String valueObjId = aa.getValueObjectId(); + Variable array = new Variable(Variable.CONTAINER_VARIABLE_NAME, arrayClassName, arrayObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_CONTAINER); + Variable value = new Variable(Variable.VALUE_VARIABLE_NAME, arrayClassName, arrayObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_VALUE); + specialVariablesOfUseSide.add(array); + specialVariablesOfUseSide.add(value); + parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�z��v�f�Q�ƌ�:" : "after array get of:"; + parentNodeNameOfUseSide += aa.getArrayClassName().replace(";", "") + "[" + aa.getIndex() + "]"; + } else if (fromStatement instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation)fromStatement; + MethodExecution calledME = mi.getCalledMethodExecution(); + ObjectReference returnValue = calledME.getReturnValue(); + if (returnValue != null) { + String containerClassName = calledME.getThisClassName(); + String containerObjId = calledME.getThisObjId(); + String valueClassName = returnValue.getActualType(); + String valueObjId = returnValue.getId(); + Variable receiver = new Variable(Variable.RECEIVER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_RECEIVER); + Variable returned = new Variable(Variable.RETURN_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, from, isReturned, VariableType.USE_RETURN); + specialVariablesOfUseSide.add(receiver); + specialVariablesOfUseSide.add(returned); + if (calledME.isConstructor()) { + parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo���� �R���X�g���N�^:" : "after invocation of Constructor:"; + parentNodeNameOfUseSide += calledME.getSignature(); + } else { + parentNodeNameOfUseSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo����:" : "after invocation of:"; + parentNodeNameOfUseSide += calledME.getSignature(); + } + } + } + } + + if (to != null) { + // ���s���O��def�v�f + Statement toStatement = to.getStatement(); + if (toStatement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)toStatement; + String containerClassName = fu.getContainerClassName(); + String containerObjId = fu.getContainerObjId(); + String valueClassName = fu.getValueClassName(); + String valueObjId = fu.getValueObjId(); + Variable container = new Variable(Variable.CONTAINER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_CONTAINER); + Variable value = new Variable(Variable.VALUE_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_VALUE); + specialVariablesDefSide.add(container); + specialVariablesDefSide.add(value); + parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�t�B�[���h����O:" : "before field set of:"; + parentNodeNameOfDefSide += fu.getFieldName(); + } else if (toStatement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)toStatement; + String arrayClassName = au.getArrayClassName(); + String arrayObjId = au.getArrayObjectId(); + String valueClassName = au.getValueClassName(); + String valueObjId = au.getValueObjectId(); + Variable array = new Variable(Variable.CONTAINER_VARIABLE_NAME, arrayClassName, arrayObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_CONTAINER); + Variable value = new Variable(Variable.VALUE_VARIABLE_NAME, arrayClassName, arrayObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_VALUE); + specialVariablesDefSide.add(array); + specialVariablesDefSide.add(value); + parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�z��v�f����O:" : "before array set of:"; + parentNodeNameOfDefSide += au.getArrayClassName().replace(";", "") + "[" + au.getIndex() + "]"; + } else if (toStatement instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation)toStatement; + MethodExecution calledME = mi.getCalledMethodExecution(); + List args = calledME.getArguments(); + String valueClassName = ""; + String valueObjId = ""; + if (args.size() > 0) { + valueClassName = args.get(0).getActualType(); + valueObjId = args.get(0).getId(); + } + String containerClassName = calledME.getThisClassName(); + String containerObjId = calledME.getThisObjId(); + Variable receiver = new Variable(Variable.RECEIVER_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_RECEIVER); + specialVariablesDefSide.add(receiver); + for (ObjectReference obj : args) { + valueClassName = obj.getActualType(); + valueObjId = obj.getId(); + Variable arg = new Variable(Variable.ARG_VARIABLE_NAME, containerClassName, containerObjId, valueClassName, valueObjId, to, isReturned, VariableType.DEF_ARG); + specialVariablesDefSide.add(arg); + } + if (calledME.isConstructor()) { + parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo���O �R���X�g���N�^:" : "before invocation of Constructor:"; + parentNodeNameOfDefSide += calledME.getSignature(); + } else { + parentNodeNameOfDefSide = TraceDebuggerPlugin.isJapanese() ? "�Ăяo���O:" : "before invocation of:"; + parentNodeNameOfDefSide += calledME.getSignature(); + } + } + } + if (parentNodeNameOfDefSide != null) { + setSpecialVariableNodes(parentNodeNameOfDefSide, specialVariablesDefSide); + } + if (parentNodeNameOfUseSide != null) { + setSpecialVariableNodes(parentNodeNameOfUseSide, specialVariablesOfUseSide); + } + } + + private void setSpecialVariableNodes(String parentNodeName, List specialVariables) { + MyTreeNode parentNode = new MyTreeNode(parentNodeName); + rootTreeNodes.add(0, parentNode); + MyTreeNode[] children = new MyTreeNode[specialVariables.size()]; + for (int i = 0; i < specialVariables.size(); i++) { + Variable variable = specialVariables.get(i); + variable.createNextHierarchyState(); + roots.add(0, variable); + MyTreeNode variableNode = new MyTreeNode(variable); + children[i] = variableNode; + variableNode.setParent(parentNode); + createChildNodesOfSpecialVariableNode(variableNode); + } + parentNode.setChildren(children); + } + + private void createChildNodesOfSpecialVariableNode(MyTreeNode variableNode) { + List childList = new ArrayList<>(); + variableNode.setChildList(childList); + Variable variable = (Variable)variableNode.getValue(); + for (int i = 0; i < variable.getChildren().size(); i++) { + Variable childVariable = variable.getChildren().get(i); + createVariablesTreeNodeList(variableNode, childList, i, childVariable); + } + } + + public void resetData() { + roots.clear(); + rootTreeNodes.clear(); + containerIdToDifferentialUpdateTracePoints.clear(); + } + + private void resetSpecialValues() { + for (int i = roots.size() - 1; i >= 0; i--) { + Variable root = roots.get(i); + String variableName = root.getVariableName(); + if (variableName.equals(Variable.CONTAINER_VARIABLE_NAME) + || variableName.equals(Variable.VALUE_VARIABLE_NAME) + || variableName.equals(Variable.RECEIVER_VARIABLE_NAME) + || variableName.equals(Variable.ARG_VARIABLE_NAME) + || variableName.equals(Variable.RETURN_VARIABLE_NAME)) { + roots.remove(i); + } + } + for (int i = rootTreeNodes.size() - 1; i >= 0; i--) { + MyTreeNode node = rootTreeNodes.get(i); + if (node.getValue() instanceof String) { + rootTreeNodes.remove(i); + } + } + } + + private MyTreeNode getTreeNodeFor(Variable variable, List nodes) { + for (MyTreeNode node : nodes) { + if (node.getValue().equals(variable)) return node; + MyTreeNode deep = getTreeNodeFor(variable, node.getChildList()); + if (deep != null) return deep; + } + return null; + } +} diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java b/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java index 614676f..3f3dfc3 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/VariableUpdatePointFinder.java @@ -1,185 +1,194 @@ -package org.ntlab.traceDebugger.analyzerProvider; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ThreadInstance; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; -import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; - -public class VariableUpdatePointFinder { - private static VariableUpdatePointFinder theInstance = new VariableUpdatePointFinder(); - private Trace trace; - 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 - private Map> changeOtherCollectionPoints = new HashMap<>(); // �悹������̃R���N�V����ID���L�[�ɂ�����悹�������n�_�̃|�C���g - - public void setTrace(Trace trace) { - this.trace = trace; - init(); - } - - public static VariableUpdatePointFinder getInstance() { - return theInstance; - } - - private void init() { - reset(); - registerUpdatePoints(); - System.out.println(updatePoints); - System.out.println(definitionInvocationPoints); - sort(updatePoints); - sort(definitionInvocationPoints); - System.out.println(updatePoints); - System.out.println(definitionInvocationPoints); - } - - private void registerUpdatePoints() { - for (Map.Entry entry : trace.getAllThreads().entrySet()) { - ThreadInstance thread = entry.getValue(); - for (MethodExecution me : thread.getRoot()) { - TracePoint start = me.getEntryPoint(); - while (start.stepFull()) { - Statement statement = start.getStatement(); - if (statement instanceof FieldUpdate) { - registerFieldUpdatePoint(start, (FieldUpdate)statement); - } else if (statement instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation)statement; - MethodExecution calledME = mi.getCalledMethodExecution(); - String methodName = calledME.getSignature(); - List args = calledME.getArguments(); - if (methodName.contains(".add(") || methodName.contains(".addElement(")) { - registerdefinitionInvocationPoint(start, calledME); - } else if (methodName.contains(".iterator(") || methodName.contains("Iterator(")) { - registerIteratorPoint(start, calledME); - } else if (args.size() == 1 && args.get(0).getActualType().startsWith("java.util.")) { - ObjectReference returnValue = calledME.getReturnValue(); - if (calledME.getThisClassName().startsWith("java.util.") && !(calledME.getThisObjId().equals("0"))) { - String toCollectionId = calledME.getThisObjId(); - registerChangeOtherCollectionPoint(start, toCollectionId); - } else if (returnValue != null && returnValue.getActualType().startsWith("java.util.")) { - String toCollectionId = returnValue.getId(); - registerChangeOtherCollectionPoint(start, toCollectionId); - } - } - } - } - } - } - } - - private void registerFieldUpdatePoint(TracePoint tp, FieldUpdate fu) { - String objectId = fu.getContainerObjId(); - String fieldName = fu.getFieldName(); - register(updatePoints, objectId, fieldName, tp); - } - - private void registerdefinitionInvocationPoint(TracePoint tp, MethodExecution calledME) { - List args = calledME.getArguments(); - 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 registerChangeOtherCollectionPoint(TracePoint tp, String toCollectionId) { - List tracePoints = changeOtherCollectionPoints.get(toCollectionId); - if (tracePoints == null) { - tracePoints = new ArrayList(); - changeOtherCollectionPoints.put(toCollectionId, tracePoints); - } - tracePoints.add(tp.duplicate()); - } - - private void register(Map>> map, String key1, String key2, TracePoint tp) { - Map> innerMap = map.get(key1); - if (innerMap == null) { - innerMap = new HashMap<>(); - map.put(key1, innerMap); - } - List tracePoints = innerMap.get(key2); - if (tracePoints == null) { - tracePoints = new ArrayList<>(); - innerMap.put(key2, tracePoints); - } - tracePoints.add(tp.duplicate()); - } - - private void sort(Map>> map) { - for (Map> innerMap : map.values()) { - for (List tracePoints : innerMap.values()) { - Collections.sort(tracePoints, new Comparator() { - @Override - public int compare(TracePoint arg0, TracePoint arg1) { - long time0 = arg0.getStatement().getTimeStamp(); - long time1 = arg1.getStatement().getTimeStamp(); - return (time0 < time1) ? -1 : 1; - } - }); - } - } - } - - public TracePoint getPoint(String objectId, String fieldName, TracePoint before) { - return getPoint(updatePoints, objectId, fieldName, before); - } - - public TracePoint getDefinitionInvocationPoint(String receiverId, String argId, TracePoint before) { - return getPoint(definitionInvocationPoints, receiverId, argId, before); - } - - public TracePoint getIteratorPoint(String iteratorId) { - return gettingIteratorPoints.get(iteratorId); - } - - public TracePoint getTransferCollectionPoint(String toCollectionId, TracePoint before) { - List tracePoints = changeOtherCollectionPoints.get(toCollectionId); - long beforeTime = before.getStatement().getTimeStamp(); - TracePoint tmp = null; - for (TracePoint tp : tracePoints) { - long time = tp.getStatement().getTimeStamp(); - if (time >= beforeTime) return tmp; - tmp = tp; - } - return tmp; - } - - private TracePoint getPoint(Map>> map, String key1, String key2, TracePoint before) { - Map> innerMap = map.get(key1); - if (innerMap == null) return null; - List tracePoints = innerMap.get(key2); - if (tracePoints == null) return null; - long beforeTime = before.getStatement().getTimeStamp(); - TracePoint tmp = null; - for (TracePoint tp : tracePoints) { - long time = tp.getStatement().getTimeStamp(); - if (time >= beforeTime) return tmp; - tmp = tp; - } - return tmp; - } - - private void reset() { - updatePoints.clear(); - definitionInvocationPoints.clear(); - gettingIteratorPoints.clear(); - changeOtherCollectionPoints.clear(); - } -} +package org.ntlab.traceDebugger.analyzerProvider; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ThreadInstance; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; + +public class VariableUpdatePointFinder { + private static VariableUpdatePointFinder theInstance = new VariableUpdatePointFinder(); + private Trace trace; + 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 + private Map> changeOtherCollectionPoints = new HashMap<>(); // �悹������̃R���N�V����ID���L�[�ɂ�����悹�������n�_�̃|�C���g + + public void setTrace(Trace trace) { + this.trace = trace; + init(); + } + + public static VariableUpdatePointFinder getInstance() { + return theInstance; + } + + private void init() { + reset(); + registerUpdatePoints(); + System.out.println(updatePoints); + System.out.println(definitionInvocationPoints); + sort(updatePoints); + sort(definitionInvocationPoints); + System.out.println(updatePoints); + System.out.println(definitionInvocationPoints); + } + + private void registerUpdatePoints() { + for (Map.Entry entry : trace.getAllThreads().entrySet()) { + ThreadInstance thread = entry.getValue(); + for (MethodExecution me : thread.getRoot()) { + TracePoint start = me.getEntryPoint(); + while (start.stepFull()) { + Statement statement = start.getStatement(); + if (statement instanceof FieldUpdate) { + registerFieldUpdatePoint(start, (FieldUpdate)statement); + } else if (statement instanceof ArrayUpdate) { + registerArrayUpdatePoint(start, (ArrayUpdate)statement); + } else if (statement instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation)statement; + MethodExecution calledME = mi.getCalledMethodExecution(); + String methodName = calledME.getSignature(); + List args = calledME.getArguments(); + if (methodName.contains(".add(") || methodName.contains(".addElement(")) { + registerdefinitionInvocationPoint(start, calledME); + } else if (methodName.contains(".iterator(") || methodName.contains("Iterator(")) { + registerIteratorPoint(start, calledME); + } else if (args.size() == 1 && args.get(0).getActualType().startsWith("java.util.")) { + ObjectReference returnValue = calledME.getReturnValue(); + if (calledME.getThisClassName().startsWith("java.util.") && !(calledME.getThisObjId().equals("0"))) { + String toCollectionId = calledME.getThisObjId(); + registerChangeOtherCollectionPoint(start, toCollectionId); + } else if (returnValue != null && returnValue.getActualType().startsWith("java.util.")) { + String toCollectionId = returnValue.getId(); + registerChangeOtherCollectionPoint(start, toCollectionId); + } + } + } + } + } + } + } + + private void registerFieldUpdatePoint(TracePoint tp, FieldUpdate fu) { + String objectId = fu.getContainerObjId(); + String fieldName = fu.getFieldName(); + register(updatePoints, objectId, fieldName, tp); + } + + private void registerArrayUpdatePoint(TracePoint tp, ArrayUpdate au) { + String objectId = au.getArrayObjectId(); + String index = String.valueOf(au.getIndex()); + register(updatePoints, objectId, index, tp); + } + + private void registerdefinitionInvocationPoint(TracePoint tp, MethodExecution calledME) { + List args = calledME.getArguments(); + 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 registerChangeOtherCollectionPoint(TracePoint tp, String toCollectionId) { + List tracePoints = changeOtherCollectionPoints.get(toCollectionId); + if (tracePoints == null) { + tracePoints = new ArrayList(); + changeOtherCollectionPoints.put(toCollectionId, tracePoints); + } + tracePoints.add(tp.duplicate()); + } + + private void register(Map>> map, String key1, String key2, TracePoint tp) { + Map> innerMap = map.get(key1); + if (innerMap == null) { + innerMap = new HashMap<>(); + map.put(key1, innerMap); + } + List tracePoints = innerMap.get(key2); + if (tracePoints == null) { + tracePoints = new ArrayList<>(); + innerMap.put(key2, tracePoints); + } + tracePoints.add(tp.duplicate()); + } + + private void sort(Map>> map) { + for (Map> innerMap : map.values()) { + for (List tracePoints : innerMap.values()) { + Collections.sort(tracePoints, new Comparator() { + @Override + public int compare(TracePoint arg0, TracePoint arg1) { + long time0 = arg0.getStatement().getTimeStamp(); + long time1 = arg1.getStatement().getTimeStamp(); + return (time0 < time1) ? -1 : 1; + } + }); + } + } + } + + public TracePoint getPoint(String objectId, String fieldName, TracePoint before) { + return getPoint(updatePoints, objectId, fieldName, before); + } + + public TracePoint getDefinitionInvocationPoint(String receiverId, String argId, TracePoint before) { + return getPoint(definitionInvocationPoints, receiverId, argId, before); + } + + public TracePoint getIteratorPoint(String iteratorId) { + return gettingIteratorPoints.get(iteratorId); + } + + public TracePoint getTransferCollectionPoint(String toCollectionId, TracePoint before) { + List tracePoints = changeOtherCollectionPoints.get(toCollectionId); + long beforeTime = before.getStatement().getTimeStamp(); + TracePoint tmp = null; + for (TracePoint tp : tracePoints) { + long time = tp.getStatement().getTimeStamp(); + if (time >= beforeTime) return tmp; + tmp = tp; + } + return tmp; + } + + private TracePoint getPoint(Map>> map, String key1, String key2, TracePoint before) { + Map> innerMap = map.get(key1); + if (innerMap == null) return null; + List tracePoints = innerMap.get(key2); + if (tracePoints == null) return null; + long beforeTime = before.getStatement().getTimeStamp(); + TracePoint tmp = null; + for (TracePoint tp : tracePoints) { + long time = tp.getStatement().getTimeStamp(); + if (time >= beforeTime) return tmp; + tmp = tp; + } + return tmp; + } + + private void reset() { + updatePoints.clear(); + definitionInvocationPoints.clear(); + gettingIteratorPoints.clear(); + changeOtherCollectionPoints.clear(); + } +}