[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| 
Re: [Dltk-dev] [pdt-dev] Check if any class in the superclasshierarchy implements an interface
 | 
After some debugging i've noticed some strange behavior in the PHPIndexingVisitorExtension:
The following code throws a ModelException when being executed on a SourceModule containing a PHP 5 namespace,
and works as expected (no exception) without the namespace declaration:
public boolean endvisit(TypeDeclaration s) {
        try {            
            if (s instanceof ClassDeclaration) {
                IType type = sourceModule.getType(s.getName());
                ITypeHierarchy hierarchy = type.newSupertypeHierarchy(new NullProgressMonitor());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
}
The PHP class looks like this:
<?php
namespace My\Test\Space;
class SomeClass  {
    public function foobar() {
        
    }
}
Without the namespace declaration, the call to newSupertypeHierarchy() works and returns an ITypeHierarchy, but with
the namespace i'm getting:
SomeClass [in SomeClass.php [in <default> [in src [in test]]]] does not exist
What's the difference for the newSupertypeHierarchy() call when it's being used inside a namespace?
The full stack trace of the exception:
org.eclipse.dltk.core.ModelException: SomeClass [in SomeClass.php [in <default> [in src [in test]]]] does not exist
    at org.eclipse.dltk.internal.core.ModelOperation.runOperation(ModelOperation.java:760)
    at org.eclipse.dltk.internal.core.SourceType.newSupertypeHierarchy(SourceType.java:404)
    at org.eclipse.dltk.internal.core.SourceType.newSupertypeHierarchy(SourceType.java:369)
    at com.dubture.symfony.core.index.SymfonyIndexingVisitorExtension.endvisit(SymfonyIndexingVisitorExtension.java:353)
    at org.eclipse.php.internal.core.index.PhpIndexingVisitor.endvisit(PhpIndexingVisitor.java:208)
    at org.eclipse.dltk.ast.declarations.TypeDeclaration.traverse(TypeDeclaration.java:160)
    at org.eclipse.dltk.ast.statements.Block.traverse(Block.java:43)
    at org.eclipse.dltk.ast.declarations.TypeDeclaration.traverse(TypeDeclaration.java:158)
    at org.eclipse.dltk.ast.statements.Block.traverse(Block.java:43)
    at org.eclipse.dltk.ast.declarations.ModuleDeclaration.traverse(ModuleDeclaration.java:71)
    at org.eclipse.php.internal.core.index.PhpIndexingParser.parseSourceModule(PhpIndexingParser.java:30)
    at com.dubture.symfony.core.index.SymfonyIndexingParser.parseSourceModule(SymfonyIndexingParser.java:29)
    at org.eclipse.dltk.core.index2.AbstractIndexer.indexDocument(AbstractIndexer.java:45)
    at org.eclipse.dltk.internal.core.index.sql.SqlIndexer.indexDocument(SqlIndexer.java:143)
    at org.eclipse.dltk.internal.core.index2.AddSourceModuleRequest.run(AddSourceModuleRequest.java:47)
    at org.eclipse.dltk.core.search.indexing.AbstractJob.execute(AbstractJob.java:76)
    at org.eclipse.dltk.internal.core.search.processing.JobManager.run(JobManager.java:467)
    at java.lang.Thread.run(Thread.java:680)
regards
-robert
On Thu, Oct 27, 2011 at 5:21 PM, Robert Gruendler 
<r.gruendler@xxxxxxxxx> wrote:
  
    
  
  
    Here's what i've come up with so far:
    
            BindingResolver resolver = new
    DefaultBindingResolver(sourceModule, sourceModule.getOwner());
            IType type = sourceModule.getType(currentClass.getName());
            PHPClassType evaluatedType =
    PHPClassType.fromIType(type);                        
            TypeBinding binding = new TypeBinding(resolver,
    evaluatedType, type);
            ITypeBinding typeBinding =
    Bindings.findTypeInHierarchy(binding,
    "Symfony\\Component\\DependencyInjection\\ContainerAwareInterface");
    
    
    However, in the call to findTypeInHierarchy(), i'm getting a
    ModelException:
    
    org.eclipse.dltk.core.ModelException: UserController [in
    UserController.php [in Acme/DemoBundle/Controller [in src [in
    Test]]]] does not exist
    
    
    UserController is the class being indexed and the above 5 lines of
    code are being called inside the endvisit(ModuleDeclaration) of my
    IndexingVisitor.
    
    
    The Type definitely exists. Any ideas why i'm getting this
    Exception? 
    
    
    thanks again,
    
    
    -robert
    
    
    
    
    
    On 10/27/11 4:01 PM, Robert Gruendler wrote:
    
      
      Hi,
      
      findTypeInHierarchy() expectes an ITypeBinding as the first
      parameter. In the IndexingVisitorExtension
      i only have AstNodes from the package org.eclipse.php.internal.core.compiler.ast.nodes.*
      available.
      
      It looks like the TypeDeclarations from the org.eclipse.php.internal.core.ast.nodes.*
      package
      have a method resolveTypeBinding() which returns an ITypeBinding.
      
      This raises a more general question: What's the difference between
      the AstNode classes in the 2 packages:
      
      org.eclipse.php.internal.core.compiler.ast.nodes.*
      org.eclipse.php.internal.core.ast.nodes.*
      
      And if i'm inside a PHPASTVisitor, can i convert the classes from
      the org.eclipse.php.internal.core.compiler.ast.nodes somehow
      to the corresponding org.eclipse.php.internal.core.ast.nodes.*
      class?
      
      
      regards
      
      -robert
      
      
      ps: i've tried to search the pdt source for any examples of
      findTypeInHierarchy(), but it looks like it's not
      being used anywhere.
      
      
      
      On 10/27/11 2:33 PM, Roy Ganor wrote:
      
        Hi,
Try using org.eclipse.php.internal.core.ast.nodes.Bindings.findTypeInHierarchy(ITypeBinding, String)
Roy
-----Original Message-----
From: pdt-dev-bounces@xxxxxxxxxxx [mailto:pdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Robert Gruendler
Sent: Thursday, October 27, 2011 12:36 PM
To: pdt-dev@xxxxxxxxxxx
Subject: [pdt-dev] Check if any class in the superclasshierarchy implements an interface
Hi,
i'm trying to check in my IndexingVisitorExtension if a visited class
implements a certain interface.
The ClassDeclaration's "getSuperclasses()" method seemed to be a way to 
do this,
but as it turns out it only evaluates the direct superclass and the 
direct implemented
interfaces.
So i'm wondering if i somehow can walk through the complete superclass 
hierarchy during
indexing of a php class?
regards
-robert
_______________________________________________
pdt-dev mailing list
pdt-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/pdt-dev
_______________________________________________
pdt-dev mailing list
pdt-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/pdt-dev