2016-04-24 16 views
6

Ich habe einen Code hier:Wie bekomme ich den Superklassen-Knoten 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();" 
    } 
} 

Wie Sie habe ich den Fehler erwähnt sehen können. Ich versuche, in Eclipse jdt ui einen Quickfix dafür zu erstellen. Aber ich kann den Superklassenknoten der Klasse B, die Class TestOverride ist, nicht abrufen.

habe ich versucht, den folgenden Code

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

In ich hier nur als Parent TestOverride bekam. Aber wenn ich dies überprüft habe, ist das nicht vom Typ TypeDeclaration, es ist auch nicht vom Typ SimpleName.

Meine Abfrage ist, wie bekomme ich die Klasse TestOverride Knoten?

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

Sich wirklich Sie die 'TestOverride' Knoten benötigen, wenn Sie die' Return super.foo nur einfügen(); 'nennen? – sevenforce

Antwort

3

Sie mit bindings arbeiten müssen. Um Bindungen zur Verfügung zu haben, bedeutet dies resolveBinding() nicht zurück null, possibly additional steps Ich habe geschrieben sind notwendig.

mit den Bindungen umgehen diese Besucher in der richtigen Richtung helfen sollen immer:

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

danke für die Antwort. Aber wie soll ich den Knoten daraus machen? – Midhun

+0

@Midhun Wenn Sie den Superklassenknoten 'TestOverride' meinen, bin ich nicht sicher für was Sie diesen Knoten brauchen. – sevenforce

+0

Ich brauche es, um seine erklärten Methoden zu bekommen, da ich ein Anfänger bin, weiß ich nicht, ob es andere Wege gibt, es zu bekommen. – Midhun