2016-04-24 23 views
6

Ho un codice qui:Come ottengo il nodo Superclasses in Eclipse jdt ui?

public class TestOverride { 
    int foo() { 
     return -1; 
    } 
} 

class B extends TestOverride { 
    @Override 
    int foo() { 
     // error - quick fix to add "return super.foo();" 
    } 
} 

Come potete vedere ho citato l'errore. Sto cercando di creare un quickfix per questo in eclipse jdt ui. Ma non riesco a ottenere il nodo superclasse della classe B che è Class TestOverride.

Ho provato il seguente codice

if(selectedNode instanceof MethodDeclaration) { 
    ASTNode type = selectedNode.getParent(); 
    if(type instanceof TypeDeclaration) { 
     ASTNode parentClass = ((TypeDeclaration) type).getSuperclassType(); 
    } 
} 

Qui ho ottenuto ParentClass come solo TestOverride. Ma quando ho controllato questo non è del tipo TypeDeclaration, non è nemmeno di tipo SimpleName.

La mia query è come ottengo il nodo TestOverride di classe?

EDIT

for (IMethodBinding parentMethodBinding :superClassBinding.getDeclaredMethods()){ 
    if (methodBinding.overrides(parentMethodBinding)){ 
     ReturnStatement rs = ast.newReturnStatement(); 
     SuperMethodInvocation smi = ast.newSuperMethodInvocation(); 
     rs.setExpression(smi); 
     Block oldBody = methodDecl.getBody(); 
     ListRewrite listRewrite = rewriter.getListRewrite(oldBody, Block.STATEMENTS_PROPERTY); 
     listRewrite.insertFirst(rs, null); 
} 
+0

Avete veramente bisogno il nodo 'TestOverride' se basta inserire il super.foo' ritorno(); 'chiamare? – sevenforce

risposta

3

Si dovrà lavorare con bindings. Per avere collegamenti disponibili, ciò significa che resolveBinding() non restituisce null, possibly additional steps I post sono necessari.

a lavorare con il binding questo visitatore dovrebbe aiutare ottenere nella giusta direzione:

class TypeHierarchyVisitor extends ASTVisitor { 
    public boolean visit(MethodDeclaration node) { 
     // e.g. foo() 
     IMethodBinding methodBinding = node.resolveBinding(); 

     // e.g. class B 
     ITypeBinding classBinding = methodBinding.getDeclaringClass(); 

     // e.g. class TestOverride 
     ITypeBinding superclassBinding = classBinding.getSuperclass(); 
     if (superclassBinding != null) { 
      for (IMethodBinding parentBinding: superclassBinding.getDeclaredMethods()) { 
       if (methodBinding.overrides(parentBinding)) { 
        // now you know `node` overrides a method and 
        // you can add the `super` statement 
       } 
      } 
     } 
     return super.visit(node); 
    } 
} 
+0

grazie per la risposta. Ma come dovrei ottenere il nodo da questo. – Midhun

+0

@Midhun Se intendi il nodo della superclasse 'TestOverride', non sono sicuro di quello che ti serve quel nodo. – sevenforce

+0

Ne ho bisogno per ottenere i suoi metodi dichiarati, dal momento che sono un principiante non so se c'è un altro modo per ottenerlo. – Midhun