private IType getDefiningType(Object element) throws JavaScriptModelException {
    int kind = ((IJavaScriptElement) element).getElementType();

    if (kind != IJavaScriptElement.METHOD
        && kind != IJavaScriptElement.FIELD
        && kind != IJavaScriptElement.INITIALIZER) {
      return null;
    }
    IType declaringType = ((IMember) element).getDeclaringType();
    if (kind != IJavaScriptElement.METHOD) {
      return declaringType;
    }
    ITypeHierarchy hierarchy = fHierarchy.getHierarchy();
    if (hierarchy == null) {
      return declaringType;
    }
    IFunction method = (IFunction) element;
    MethodOverrideTester tester = new MethodOverrideTester(declaringType, hierarchy);
    IFunction res = tester.findDeclaringMethod(method, true);
    if (res == null || method.equals(res)) {
      return declaringType;
    }
    return res.getDeclaringType();
  }