package org.incha.core.jswingripples.parser;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.JavaModelException;
public class MemberSearchSupport {
/**
* Compilation unit.
*/
private final ICompilationUnit unit;
/**
* @param unit compilation unit.
*/
public MemberSearchSupport(final ICompilationUnit unit) {
this.unit = unit;
}
public IMember getOwnerMember(final int offset, final int len) throws JavaModelException {
for (final IJavaElement e : unit.getChildren()) {
if (e instanceof IMember) {
final IMember owner = getOwnerMember((IMember) e, offset, len);
if (owner != null) {
return owner;
}
}
}
return null;
}
/**
* @param member current owner.
* @param offset offset.
* @param len length.
* @return
* @throws JavaModelException
*/
private IMember getOwnerMember(final IMember member, final int offset, final int len)
throws JavaModelException {
if (contains(member, offset, len)) {
for (final IJavaElement e : member.getChildren()) {
if (e instanceof IMember) {
final IMember m = getOwnerMember((IMember) e, offset, len);
if (m != null) {
return m;
}
}
}
return member;
}
return null;
}
/**
* @param m
* @param offset
* @param len
* @return
* @throws JavaModelException
*/
private boolean contains(final IMember m, final int offset, final int len) throws JavaModelException {
final ISourceRange range = m.getSourceRange();
return range.getOffset() <= offset && range.getOffset() + range.getLength() >= offset + len;
}
}