@Override
  public boolean endvisit(MethodDeclaration method) throws Exception {
    methodGlobalVars.pop();
    declarations.pop();

    for (final PHPSourceElementRequestorExtension visitor : extensions) {
      visitor.endvisit(method);
    }
    return super.endvisit(method);
  }
  public boolean endvisit(LambdaFunctionDeclaration lambdaMethod) throws Exception {

    methodGlobalVars.pop();
    this.fInMethod = false;

    if (!fNodes.isEmpty() && fNodes.peek() == lambdaMethod) {
      fRequestor.exitMethod(lambdaMethod.sourceEnd() - 1);
      fNodes.pop();
    }
    for (final PHPSourceElementRequestorExtension visitor : extensions) {
      visitor.endvisit(lambdaMethod);
    }
    return true;
  }
 @Override
 public boolean endvisit(Expression node) throws Exception {
   for (final PHPSourceElementRequestorExtension visitor : extensions) {
     visitor.endvisit(node);
   }
   if (node instanceof Assignment) {
     return endvisit((Assignment) node);
   }
   if (node instanceof ListVariable) {
     return endvisit((ListVariable) node);
   }
   if (node instanceof LambdaFunctionDeclaration) {
     return endvisit((LambdaFunctionDeclaration) node);
   }
   return true;
 }
  @Override
  public boolean endvisit(ModuleDeclaration declaration) throws Exception {
    for (final PHPSourceElementRequestorExtension visitor : extensions) {
      visitor.endvisit(declaration);
    }

    while (deferredDeclarations != null && !deferredDeclarations.isEmpty()) {
      final ASTNode[] declarations =
          deferredDeclarations.toArray(new ASTNode[deferredDeclarations.size()]);
      deferredDeclarations.clear();

      for (final ASTNode deferred : declarations) {
        deferred.traverse(this);
      }
    }
    fLastUseParts.clear();
    return super.endvisit(declaration);
  }
  @Override
  public boolean endvisit(TypeDeclaration type) throws Exception {
    if (type instanceof NamespaceDeclaration) {
      final NamespaceDeclaration namespaceDecl = (NamespaceDeclaration) type;
      fLastNamespace = null; // there are no nested namespaces
      if (namespaceDecl.isGlobal()) {
        return true;
      }
    }

    declarations.pop();

    // resolve more type member declarations
    resolveMagicMembers(type);

    for (final PHPSourceElementRequestorExtension visitor : extensions) {
      visitor.endvisit(type);
    }

    return super.endvisit(type);
  }
 @Override
 public boolean endvisit(Statement node) throws Exception {
   for (final PHPSourceElementRequestorExtension visitor : extensions) {
     visitor.endvisit(node);
   }
   if (node instanceof PHPFieldDeclaration) {
     return endvisit((PHPFieldDeclaration) node);
   }
   if (node instanceof FieldDeclaration) {
     return endvisit((FieldDeclaration) node);
   }
   if (node instanceof ConstantDeclaration) {
     return endvisit((ConstantDeclaration) node);
   }
   if (node instanceof CatchClause) {
     return endvisit((CatchClause) node);
   }
   if (node instanceof ForEachStatement) {
     return endvisit((ForEachStatement) node);
   }
   return true;
 }