如何在Eclipse中查找过程开始的行号

时间:2009-02-18 15:07:51

标签: java eclipse

我的代码可以在Windows下正确找到Eclipse中IMethod的行号:

IMethod method= ...;
String source= type.getCompilationUnit().getSource();
int lineNumber= 1;
for (int i= 0; i < method.getSourceRange().getOffset(); i++)
    if (source.charAt(i) == Character.LINE_SEPARATOR)
        lineNumber++;

但是,这在Mac上不起作用,因为行分隔符的字符是不同的,即使它所操作的源代码是相同的。

  1. 是否有内置的方法来获取行号而无需遍历源的每个字符? (似乎应该有,但我找不到它)
  2. 如果没有,是否有一种独立于平台的方法来计算字符串中的换行符?
  3. 谢谢,

    Kent Beck

4 个答案:

答案 0 :(得分:3)

我无法回答(1),但我会给(2)一个镜头。

奇怪的是,我认为你的代码只是巧合。 Character.LINE_SEPARATOR表示Unicode类别;它不应该是平台的换行符,但它恰好具有值13,(你可能知道)是'\r'。如果我没记错的话,自OS X以来的Mac已经使用'\n'来换行,所以这就是它无效的原因。

我过去获得行分隔符的方式是System.getProperty("line.separator")。这将返回String,因此可能不合适。由于它似乎与Windows上的'\r'一起使用,我猜想对'\n'的简单检查就足够了。另外,正如Wouter Lievens建议的那样,你可以使用围绕StringReaderBufferedReader

答案 1 :(得分:1)

我最终使用正则表达式,因为它更简单。这使代码O(n ^ 2)在我需要在文件中采用的方法数量,但我希望这应该是一个小数字,所以它现在可以接受。

private int getMethodLineNumber(final IType type, IMethod method) throws JavaModelException {
    String source= type.getCompilationUnit().getSource();
    String sourceUpToMethod= source.substring(0, method.getSourceRange().getOffset());
    Pattern lineEnd= Pattern.compile("$", Pattern.MULTILINE | Pattern.DOTALL);
    return lineEnd.split(sourceUpToMethod).length;
}

谢谢大家的帮助。

此致

肯特

答案 2 :(得分:0)

您可以使用String实例包装BufferedReader,该实例支持readLine()方法。这个方法可能正确解析任何类型的分隔符。

答案 3 :(得分:0)

您可以使用由IScanner构建的ToolFactory this class,如{{3}}中所使用的那样(不计算行数,但仍然提供了这个想法)

希望IScanner的内部eclipse实现可以在任何平台上正常运行。

IBuffer buffer = imethod.getOpenable().getBuffer();
ISourceRange sourceRange = imethod.getSourceRange();
ISourceRange nameRange = imethod.getNameRange();
IScanner scanner = null; // delay initialization

if (sourceRange != null && nameRange != null) {
    if (scanner == null) {
        scanner= ToolFactory.createScanner(false, false, true, false);
        scanner.setSource(buffer.getCharacters());
    }
    scanner.resetTo(sourceRange.getOffset(), nameRange.getOffset());
} else {
    return 0 // no lines;
}
// use scanner to count lines