2017-08-25 35 views
0

我使用eclipse jdt以编程方式折叠类的层次结构(1.将所有方法和字段移动到父类,2. remove abstract keyword如果父类是抽象的,和3参考父类,而不是一个孩子在所有系统) 我完成步骤1,2,但我有问题,与3
这里是我的代码:删除一个类与现有类型后,在eclipse jdt中替换未解决的类型

//update the references to the parent class 
IPackageFragment classChangedPackage = rootpackage.getPackageFragment("net.sourceforge.ganttproject"); 
ICompilationUnit ClassChangedCU = classChangedPackage.getCompilationUnit("GanttProject" + ".java"); 
ASTParser parserClassChanged = ASTParser.newParser(AST.JLS8); 
parserClassChanged.setSource(ClassChangedCU); 
parserClassChanged.setKind(ASTParser.K_COMPILATION_UNIT); 
parserClassChanged.setResolveBindings(true); // we need bindings later on 
final CompilationUnit cuClassChanged = (CompilationUnit) parserClassChanged.createAST(null); 
cuClassChanged.recordModifications(); 
rewrite = ASTRewrite.create(cuClassChanged.getAST()); 

TypeDeclaration typeDeclClassChanged = (TypeDeclaration) cuClassChanged.types().get(0);            
cuClassChanged.accept(new CHtypeVisitor(rewrite,classSourceName,typeDeclClassChanged)); 
Document doc= new Document(typeDeclClassChanged.toString()); 
TextEdit edits = rewrite.rewriteAST(doc, null); 
try { 
edits.apply(doc); 
} catch (MalformedTreeException e) { 
e.printStackTrace(); 
} catch (BadLocationException e) { 
e.printStackTrace(); 
} 
ClassChangedCU.getBuffer().setContents(doc.get()); 
我的访客代码:

但是,即使用像int这样的原语替换也是行不通的。

我想要的是以编程方式应用类似eclipse quickfix(jdt CorrectionEngine)的未解析类型,它提供了我想要替换的类型(子类)和替换类(子类)作为参数。

+0

什么是行不通的? –

+0

它不会通过int原语替换子类型 –

+0

您是否看到访客与预期节点和名称匹配?重写器是否产生任何文本编辑?是否抛出任何异常?文档的结果内容是否正确? –

回答

0

我想我发现在你的代码中的错误:

的文件是你申请的文本编辑必须具有完全相同的内容因为这是给解析器源。

相比之下,当您从typeDeclClassChanged.toString()创建文档时,您将丢失所有布局/空白信息以及注释(除javadoc外)。

这将导致应用于错误位置的文本编辑。

要获得正确的来源内容,您应该使用ClassChangedCU.getSource()