Как получить номер строки из объекта SearchMatch? - PullRequest
1 голос
/ 01 февраля 2010

в моем плагине после выполнения поиска все совпадения отправляются в функцию acceptsearchmatch (searchmatch) в качестве объектов searchmatch. Я хочу получить номера строк, где произошло совпадение. Не могу использовать getoffset, потому что это дает относительно исходного buffer.how я могу получить номер строки? help

спасибо

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Хитрость в том, что: SearchMatch дает вам SearchRange, что означает, что несколько строк могут быть потенциально включены в этот диапазон.

Решение состоит в том, чтобы проанализировать Документ , связанный с объектом, возвращенным SearchMatch, чтобы вычислить эти номера строк.
Соответствующий метод getLineOfOffset(int offset)

У вас есть здесь пример , в случае, когда объектом является IMember

ISourceRange range = member.getSourceRange();
if (range == null){
  return null;
}

IBuffer buf = null;

ISourceModule compilationUnit = member.getSourceModule();
if (!compilationUnit.isConsistent()) {
  return null;
}

buf = compilationUnit.getBuffer();
final int start = range.getOffset();
String contents = buf.getContents();
Document doc = new Document(contents);
try {
  int line = doc.getLineOfOffset(start);
  ...
0 голосов
/ 18 сентября 2014

Это должно работать:

private int getLineNumber(SearchMatch match) throws BadLocationException,
        IOException, CoreException {

    IResource resource = match.getResource();
    if (!(resource instanceof IFile)) {
        // Log Error
        return -1;
    }
    IFile file = (IFile) resource;
    int offset = match.getOffset();
    byte[] bytes = new byte[offset];
    int read = file.getContents().read(bytes, 0, offset);
    if (read != offset) {
        // Log error
        return -1;
    }
    String contents = new String(bytes);
    Document fileSource = new Document(contents);
    return fileSource.getLineOfOffset(offset) + 1;
}
...