/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * 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.android.dx.rop.cst;

/**
 * Constants of type {@code CONSTANT_InterfaceMethodref_info}.
 */
public final class CstInterfaceMethodRef
        extends CstBaseMethodRef {
    /**
     * {@code null-ok;} normal {@link CstMethodRef} that corresponds to this
     * instance, if calculated 
     */
    private CstMethodRef methodRef;

    /**
     * Constructs an instance.
     * 
     * @param definingClass {@code non-null;} the type of the defining class
     * @param nat {@code non-null;} the name-and-type
     */
    public CstInterfaceMethodRef(CstType definingClass, CstNat nat) {
        super(definingClass, nat);
        methodRef = null;
    }

    /** {@inheritDoc} */
    @Override
    public String typeName() {
        return "ifaceMethod";
    }

    /**
     * Gets a normal (non-interface) {@link CstMethodRef} that corresponds to
     * this instance.
     * 
     * @return {@code non-null;} an appropriate instance
     */
    public CstMethodRef toMethodRef() {
        if (methodRef == null) {
            methodRef = new CstMethodRef(getDefiningClass(), getNat());
        }

        return methodRef;
    }
}
