/*
 * Copyright (c) 2009 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 */
package com.ibm.wala.ipa.cha;

import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.types.MethodReference;

/**
 * Utilities for querying a class hierarchy
 */
public class ClassHierarchyUtil {

  /**
   * find the root of the inheritance tree for method m.
   */
  public static IMethod getRootOfInheritanceTree(IMethod m) {
    IClass c = m.getDeclaringClass();
    IClass parent = c.getSuperclass();
    if (parent == null) {
      return m;
    } else {
      MethodReference ref = MethodReference.findOrCreate(parent.getReference(), m.getSelector());
      IMethod m2 = m.getClassHierarchy().resolveMethod(ref);
      if (m2 != null && !m2.equals(m)) {
        return getRootOfInheritanceTree(m2);
      }
      return m;
    }
  }

  /**
   * Return the method that m overrides, or null if none
   */
  public static IMethod getOverriden(IMethod m) {
    IClass c = m.getDeclaringClass();
    IClass parent = c.getSuperclass();
    if (parent == null) {
      return null;
    } else {
      MethodReference ref = MethodReference.findOrCreate(parent.getReference(), m.getSelector());
      IMethod m2 = m.getClassHierarchy().resolveMethod(ref);
      if (m2 != null && !m2.equals(m)) {
        return m2;
      }
      return null;
    }
  }

}
