    
    // Debugging ----------------------------------------------------------------------------------

    public void printGlobalSymbolTableOn(PrintStream out)
    {
        enclosingScope.printGlobalSymbolTableOn(out);
    }
    
    public String toString()
    {
    	return toString(0);
    }

    String toString(int indent)
    {
        StringBuffer sb = new StringBuffer();
        indent(indent, sb);
        if (this instanceof Definition) sb.append(((Definition)this).isPublic() ? "Public " : "Private ");
        sb.append(this.getClass().getSimpleName());
        sb.append(" ");
        sb.append(describe());
        return sb.toString();
    }

    public String describe()
    {
        StringBuffer sb = new StringBuffer();
        
        sb.append(this.describeBindingClassification());
        sb.append(": '");
        sb.append(this.getCanonicalName());
        sb.append("'");

        sb.append(describeLocation());
        
        return sb.toString();
    }

    public String describeLocation()
    {
        StringBuffer sb = new StringBuffer();
        
        sb.append(" on ");
        sb.append(describeLineCol());
        
        //if (isExternal())
        if (containerFile != null)
        {
            sb.append(" in ");
            sb.append(describeFilePath());
//            sb.append(" (offset ");
//            sb.append(offset);
//            sb.append(", length ");
//            sb.append(length);
//            sb.append(")");
        }
        
        return sb.toString();
    }

    public String describeFilePath()
    {
        return containerFile.getFullPath().toOSString();
    }

    public String describeLineCol()
    {
        Token token = this.findSourceToken();
        
        if (token != null)
            return LineCol.toString(token.getLine(), token.getCol());
        else
            return null;
    }

    protected abstract String describeBindingClassification();

    protected void indent(int indent, StringBuffer sb)
    {
        for (int i = 0; i < indent; i++)
            sb.append(' ');
    }
