Я создал плагин, где мне нужно найти изменения внутри метода. Я использовал JavaCore.addElementChangedListener для прослушивания изменений, происходящих в java-файле. но я не могу получить изменения внутри метода. Я хочу получить изменения внутри метода. Я прошел через How to capture changes inside methods in an Eclipse plugin, но я не могу получить поддеревья и изменения. На самом деле я не могу получить реальную концепцию. не могли бы вы помочь мне получить изменения в методе?Как определить модификацию метода внутри java-файла?
0
A
ответ
1
Наконец-то, как я нашел решение для определения изменений, происходящих внутри метода, но оно дает одновременно. Я храню его в хэш-карте, как указано в ответе How to capture changes inside methods in an Eclipse plugin, и используя IResourceChangeEvent.POST_CHANGE, мы можем получить коллекцию изменений, произошедших до того, как пользователь сохранит файл.
public void elementChanged(ElementChangedEvent event) {
IJavaElementDelta delta= event.getDelta();
if (delta != null) {
delta.getCompilationUnitAST().accept(new ASTVisitor() {
@Override
public boolean visit(MethodDeclaration node) {
String name = ((TypeDeclaration) node.getParent()).getName()
.getFullyQualifiedName() + "." + node.getName().getFullyQualifiedName();
boolean changedmethodvalue = false;
if (subtrees.containsKey(name)){
changedmethodvalue = !node.subtreeMatch(new ASTMatcher(),subtrees.get(Name));
if(changedmethodvalue){
System.out.println("method changed"+Name+":"+changedmethodvalue);
/**
* Store the changed method inside the hash map for future reflection.
*/
changed.put(Name, (IMethod) node.resolveBinding().getJavaElement());
/**
* setting up the hash map value each time changes happened.
*
*/
ModificationStore.setChanged(changed);
}
}
else{
// No earlier entry found, definitely changed
methodHasChanged = true;
System.out.println("A new method is added");
}
}
/**
* updating the subtree structure
*/
subtrees.put(mName, node);
return true;
}
});
}
}
}
Когда пользователь запускает опцию сохранения, мы можем получить коллекцию имени метода и его местоположение с хэш-карта
public class InvokeSynchronizer implements IResourceDeltaVisitor{
private static HashMap<String, IMethod> methodtoinvoke = new HashMap<String, IMethod>();
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED:
System.out.println("ADDED: ");
break;
case IResourceDelta.CHANGED:
/**
* methodtoinvoke is a hash map values got from the modification store class.
*/
methodtoinvoke=ModificationStore.getChanged();
Iterator it = methodtoinvoke.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
// System.out.println(pairs.getKey() + " = " + pairs.getValue());
IMethod methods=(IMethod) pairs.getValue();
//IResource resource=(IResource) methods;
System.out.println("I resource value"+res);
System.out.println("\nlocation of the method:"+methods.getParent().getResource().toString());
System.out.println("\n\nmethod name ::"+methods.getElementName());
it.remove(); // avoids a ConcurrentModificationException
}}
return true;
}
}
Что, в частности, являются «изменения», которые вам хочу найти? Это может быть вам понятно, но нам это непонятно. Вы имеете в виду изменения в локальных полях? К частям вашей модели данных? Что-то еще? –
Если пользователь меняет какую-либо логику внутри метода, мне нужно имя метода, в котором произошли изменения. –
@AndrzejDoyle: это любой способ получить имя метода? мне сейчас очень нужно. пожалуйста, помогите мне с этим –