2014-10-13 6 views
0

Я создал плагин, где мне нужно найти изменения внутри метода. Я использовал JavaCore.addElementChangedListener для прослушивания изменений, происходящих в java-файле. но я не могу получить изменения внутри метода. Я хочу получить изменения внутри метода. Я прошел через How to capture changes inside methods in an Eclipse plugin, но я не могу получить поддеревья и изменения. На самом деле я не могу получить реальную концепцию. не могли бы вы помочь мне получить изменения в методе?Как определить модификацию метода внутри java-файла?

+0

Что, в частности, являются «изменения», которые вам хочу найти? Это может быть вам понятно, но нам это непонятно. Вы имеете в виду изменения в локальных полях? К частям вашей модели данных? Что-то еще? –

+0

Если пользователь меняет какую-либо логику внутри метода, мне нужно имя метода, в котором произошли изменения. –

+0

@AndrzejDoyle: это любой способ получить имя метода? мне сейчас очень нужно. пожалуйста, помогите мне с этим –

ответ

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; 
    } 

}

 Смежные вопросы

  • Нет связанных вопросов^_^