/*
 * Copyright 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev.jjs.ast;

import com.google.gwt.dev.jjs.SourceInfo;

/**
 * A field that is an enum constant.
 */
public class JEnumField extends JField {

  private final int ordinal;

  public JEnumField(SourceInfo info, String name, int ordinal, JEnumType enclosingType,
      JClassType type, AccessModifier access) {
    super(info, name, enclosingType, type, true, Disposition.FINAL, access);
    this.ordinal = ordinal;
  }

  @Override
  public JEnumType getEnclosingType() {
    return (JEnumType) super.getEnclosingType();
  }

  public int ordinal() {
    return ordinal;
  }
}
