// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: braces fieldsfirst space lnc 

package com.google.gson.internal.bind;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

// Referenced classes of package com.google.gson.internal.bind:
//            d

public final class JsonTreeReader extends JsonReader
{

    private static final Reader a = new d();
    private static final Object b = new Object();
    private final List c = new ArrayList();

    public JsonTreeReader(JsonElement jsonelement)
    {
        super(a);
        c.add(jsonelement);
    }

    private Object a()
    {
        return c.get(-1 + c.size());
    }

    private void a(JsonToken jsontoken)
    {
        if (peek() != jsontoken)
        {
            throw new IllegalStateException((new StringBuilder()).append("Expected ").append(jsontoken).append(" but was ").append(peek()).toString());
        } else
        {
            return;
        }
    }

    private Object b()
    {
        return c.remove(-1 + c.size());
    }

    public void beginArray()
    {
        a(JsonToken.BEGIN_ARRAY);
        JsonArray jsonarray = (JsonArray)a();
        c.add(jsonarray.iterator());
    }

    public void beginObject()
    {
        a(JsonToken.BEGIN_OBJECT);
        JsonObject jsonobject = (JsonObject)a();
        c.add(jsonobject.entrySet().iterator());
    }

    public void close()
    {
        c.clear();
        c.add(b);
    }

    public void endArray()
    {
        a(JsonToken.END_ARRAY);
        b();
        b();
    }

    public void endObject()
    {
        a(JsonToken.END_OBJECT);
        b();
        b();
    }

    public boolean hasNext()
    {
        JsonToken jsontoken = peek();
        return jsontoken != JsonToken.END_OBJECT && jsontoken != JsonToken.END_ARRAY;
    }

    public boolean nextBoolean()
    {
        a(JsonToken.BOOLEAN);
        return ((JsonPrimitive)b()).getAsBoolean();
    }

    public double nextDouble()
    {
        JsonToken jsontoken = peek();
        if (jsontoken != JsonToken.NUMBER && jsontoken != JsonToken.STRING)
        {
            throw new IllegalStateException((new StringBuilder()).append("Expected ").append(JsonToken.NUMBER).append(" but was ").append(jsontoken).toString());
        }
        double d1 = ((JsonPrimitive)a()).getAsDouble();
        if (!isLenient() && (Double.isNaN(d1) || Double.isInfinite(d1)))
        {
            throw new NumberFormatException((new StringBuilder()).append("JSON forbids NaN and infinities: ").append(d1).toString());
        } else
        {
            b();
            return d1;
        }
    }

    public int nextInt()
    {
        JsonToken jsontoken = peek();
        if (jsontoken != JsonToken.NUMBER && jsontoken != JsonToken.STRING)
        {
            throw new IllegalStateException((new StringBuilder()).append("Expected ").append(JsonToken.NUMBER).append(" but was ").append(jsontoken).toString());
        } else
        {
            int i = ((JsonPrimitive)a()).getAsInt();
            b();
            return i;
        }
    }

    public long nextLong()
    {
        JsonToken jsontoken = peek();
        if (jsontoken != JsonToken.NUMBER && jsontoken != JsonToken.STRING)
        {
            throw new IllegalStateException((new StringBuilder()).append("Expected ").append(JsonToken.NUMBER).append(" but was ").append(jsontoken).toString());
        } else
        {
            long l = ((JsonPrimitive)a()).getAsLong();
            b();
            return l;
        }
    }

    public String nextName()
    {
        a(JsonToken.NAME);
        java.util.Map.Entry entry = (java.util.Map.Entry)((Iterator)a()).next();
        c.add(entry.getValue());
        return (String)entry.getKey();
    }

    public void nextNull()
    {
        a(JsonToken.NULL);
        b();
    }

    public String nextString()
    {
        JsonToken jsontoken = peek();
        if (jsontoken != JsonToken.STRING && jsontoken != JsonToken.NUMBER)
        {
            throw new IllegalStateException((new StringBuilder()).append("Expected ").append(JsonToken.STRING).append(" but was ").append(jsontoken).toString());
        } else
        {
            return ((JsonPrimitive)b()).getAsString();
        }
    }

    public JsonToken peek()
    {
        if (c.isEmpty())
        {
            return JsonToken.END_DOCUMENT;
        }
        Object obj = a();
        if (obj instanceof Iterator)
        {
            boolean flag = c.get(-2 + c.size()) instanceof JsonObject;
            Iterator iterator = (Iterator)obj;
            if (iterator.hasNext())
            {
                if (flag)
                {
                    return JsonToken.NAME;
                } else
                {
                    c.add(iterator.next());
                    return peek();
                }
            }
            if (flag)
            {
                return JsonToken.END_OBJECT;
            } else
            {
                return JsonToken.END_ARRAY;
            }
        }
        if (obj instanceof JsonObject)
        {
            return JsonToken.BEGIN_OBJECT;
        }
        if (obj instanceof JsonArray)
        {
            return JsonToken.BEGIN_ARRAY;
        }
        if (obj instanceof JsonPrimitive)
        {
            JsonPrimitive jsonprimitive = (JsonPrimitive)obj;
            if (jsonprimitive.isString())
            {
                return JsonToken.STRING;
            }
            if (jsonprimitive.isBoolean())
            {
                return JsonToken.BOOLEAN;
            }
            if (jsonprimitive.isNumber())
            {
                return JsonToken.NUMBER;
            } else
            {
                throw new AssertionError();
            }
        }
        if (obj instanceof JsonNull)
        {
            return JsonToken.NULL;
        }
        if (obj == b)
        {
            throw new IllegalStateException("JsonReader is closed");
        } else
        {
            throw new AssertionError();
        }
    }

    public void promoteNameToValue()
    {
        a(JsonToken.NAME);
        java.util.Map.Entry entry = (java.util.Map.Entry)((Iterator)a()).next();
        c.add(entry.getValue());
        c.add(new JsonPrimitive((String)entry.getKey()));
    }

    public void skipValue()
    {
        if (peek() == JsonToken.NAME)
        {
            nextName();
            return;
        } else
        {
            b();
            return;
        }
    }

    public String toString()
    {
        return getClass().getSimpleName();
    }

}