我正在寻找一个实现的类(用Java)来处理现有文件的文本插入,替换和删除,就像StringBuilder那样。
我不想使用StringBuilder的原因是我想避免将所有文件内容都放在内存中。
目的是将补丁应用于包含任何编程语言代码的文件。
答案 0 :(得分:2)
一般来说,一个班级应该做一件事,做得好。
这意味着您不太可能找到一个读取代码的类,将其转换为内部表示(解析树),检测手头的问题,改变内部表示,并编写内部表示退回到磁盘。
考虑到这一点,您可以扩展许多项目以添加所需的功能。
Checkstyle解析Java代码,目的是报告样式错误。要做到这一点,它必须读取代码,将其转换为内部表示,并检测(格式化)问题。这可能是一个很好的起点,取决于你的目标。
PMD是一个静态代码分析工具。为了找到Java源代码中的问题,它必须:读取代码,将其转换为内部表示,并检测(结构)问题。
请注意,这些工具都不能满足您的所有需求;但是,他们很接近。你所要做的就是构建一个" fixer"在解析的树上运行,修复检测到的问题。然后你需要找到该工具是否提供了一个"输出器"从内部解析(树)表示重建代码文本,并使用它生成所需的文本,然后将其保存到磁盘。
如果树到文本模块不存在,您可能需要编写它。
源代码受规则约束,虽然您可能觉得自己不需要这些额外的步骤,但您的代码的生命周期将远远超过跳过这些步骤所需的生命周期。简单地粘贴一行代码可能对意外输入没有意义。例如,假设您将@Overrides
标记添加到Java方法,则此伪代码将失败
currentLine = next();
if (currentLine.detectMethod() and isAnOverride(currentLine().getMethod())) {
code.insertBefore(currentline, "@Overrides");
}
因为有人会提供您的代码
public
void
myMethod(
String one,
String two,
String three)
{
System.out.println("Haha! I broke you!");
}
可能导致
public
void
@Overrides
myMethod(
String one,
String two,
String three)
{
System.out.println("Haha! I broke you!");
}
你可以说"嗯,没有人应该这样做!"但是,如果语言允许,那么你就会与语言本身发生冲突。
如果你不相信我,那么逐行处理器就无法检测到#" public"作为一种方法,也不是" void"作为一种方法,但会检测" myMethod("作为(错误识别的)包私有多行方法的开头。