2010-02-01 2 views
1

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

благодаря

ответ

1

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

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

Вы here an example, в том случае, когда объект является 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

привет, нет класса, как ISourceModule. ..... не удалось найти в документах – Steven

+0

@Nishan: 'ISourceModule' поставляется с инструментарием динамических языков Eclipse (DLTK). Вам нужно получить документ, связанный с элементом, найденным 'SearchMatch' другим способом. – VonC

+0

@ Нишан: См. Слайд 16 из http://www.eclipsecon.org/2005/presentations/EclipseCON2005_Tutorial29.pdf для возможного пути. – VonC

0

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

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; 
} 
Смежные вопросы