我的代码可以在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上不起作用,因为行分隔符的字符是不同的,即使它所操作的源代码是相同的。
谢谢,
Kent Beck
答案 0 :(得分:3)
我无法回答(1),但我会给(2)一个镜头。
奇怪的是,我认为你的代码只是巧合。 Character.LINE_SEPARATOR
表示Unicode类别;它不应该是平台的换行符,但它恰好具有值13,(你可能知道)是'\r'
。如果我没记错的话,自OS X以来的Mac已经使用'\n'
来换行,所以这就是它无效的原因。
我过去获得行分隔符的方式是System.getProperty("line.separator")
。这将返回String
,因此可能不合适。由于它似乎与Windows上的'\r'
一起使用,我猜想对'\n'
的简单检查就足够了。另外,正如Wouter Lievens建议的那样,你可以使用围绕StringReader
的BufferedReader
。
答案 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