/**
   * @param lastMayBeMethod if true, it gets the path and accepts a method (if it is the last in the
   *     stack) if false, null is returned if a method is found.
   * @param tempStack is a temporary stack object (which may be cleared)
   * @return a tuple, where the first element is the path where the entry is located (may return
   *     null). and the second element is a boolen that indicates if the last was actually a method
   *     or not.
   */
  private Tuple<String, Boolean> getPathToRoot(
      ASTEntry entry, boolean lastMayBeMethod, boolean acceptAny, FastStack<SimpleNode> tempStack) {
    if (entry.parent == null) {
      return null;
    }
    // just to be sure that it's empty
    tempStack.clear();

    boolean lastIsMethod = false;
    // if the last 'may be a method', in this case, we have to remember that it will actually be the
    // first one
    // to be analyzed.

    // let's get the stack
    while (entry.parent != null) {
      if (entry.parent.node instanceof ClassDef) {
        tempStack.push(entry.parent.node);

      } else if (entry.parent.node instanceof FunctionDef) {
        if (!acceptAny) {
          if (lastIsMethod) {
            // already found a method
            return null;
          }

          if (!lastMayBeMethod) {
            return null;
          }

          // ok, the last one may be a method... (in this search, it MUST be the first one...)
          if (tempStack.size() != 0) {
            return null;
          }
        }

        // ok, there was a class, so, let's go and set it
        tempStack.push(entry.parent.node);
        lastIsMethod = true;

      } else {
        return null;
      }
      entry = entry.parent;
    }

    // now that we have the stack, let's make it into a path...
    FastStringBuffer buf = new FastStringBuffer();
    while (tempStack.size() > 0) {
      if (buf.length() > 0) {
        buf.append(".");
      }
      buf.append(NodeUtils.getRepresentationString(tempStack.pop()));
    }
    return new Tuple<String, Boolean>(buf.toString(), lastIsMethod);
  }
  /**
   * @see
   *     org.python.pydev.parser.jython.ast.VisitorBase#visitClassDef(org.python.pydev.parser.jython.ast.ClassDef)
   */
  public Object visitClassDef(ClassDef node) throws Exception {
    globalDeclarationsStack.push(new HashSet<String>());
    defsStack.push(node);

    node.traverse(this);

    defsStack.pop();
    globalDeclarationsStack.pop();

    checkDeclaration(node, (NameTok) node.name);
    return null;
  }
 public void pushTemporaryModule(String moduleName, IModule module) {
   synchronized (lockTemporaryModules) {
     if (temporaryModules == null) {
       temporaryModules = new HashMap<String, FastStack<IModule>>();
     }
     FastStack<IModule> stack = temporaryModules.get(moduleName);
     if (stack == null) {
       stack = new FastStack<IModule>(3); // small initial size!
       temporaryModules.put(moduleName, stack);
     }
     stack.push(module);
   }
 }
  public AbstractContextVisitor(
      ModuleAdapter module, AbstractNodeAdapter<? extends SimpleNode> parent) {
    super();
    assert (module != null);

    this.moduleAdapter = module;

    nodeHelper = new NodeHelper(module.getAdapterPrefs());

    stack = new FastStack<SimpleNode>();
    parents = new FastStack<AbstractScopeNode<?>>();
    parents.push(moduleAdapter);
    stack.push(module.getASTNode());

    nodes = new ArrayList<T>();
  }
  /**
   * @see
   *     org.python.pydev.parser.jython.ast.VisitorBase#visitFunctionDef(org.python.pydev.parser.jython.ast.FunctionDef)
   */
  public Object visitFunctionDef(FunctionDef node) throws Exception {
    globalDeclarationsStack.push(new HashSet<String>());
    defsStack.push(node);

    if (node.args != null && node.args.args != null) {
      for (exprType arg : node.args.args) {
        if (arg instanceof Name) {
          checkParam((Name) arg);
        }
      }
    }
    node.traverse(this);

    defsStack.pop();
    globalDeclarationsStack.pop();

    checkDeclaration(node, (NameTok) node.name);
    return null;
  }
 protected AbstractNodeAdapter<? extends SimpleNode> before(SimpleNode node) {
   AbstractNodeAdapter<? extends SimpleNode> context = createContext(node);
   stack.push(node);
   return context;
 }