eclipse jdt organize imports 实现

大致说下这个功能的思路:
1:用字符串构建java文件
2:在内存中构建ijavaelement对象,并对这个对象进行重组(用到了jdt的OrganizeImportsOperation)
3:IFile写入文件

String path = "";//文件绝对路径
IJavaProject project = null;
IPath genSourceFolderPath = new Path(filePath);
for (IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
if (p.isOpen()) {
// 查找工程的实际路径是否在源代码生成路径上,如果是,则就是该工程
if (p.getLocation().isPrefixOf(genSourceFolderPath)) {
project = JavaCore.create(p);
}
}
}
if (project == null) {
throw new AresCompilerException("无法生成源码文件:" + path);
}
IPath javaFilePath = new Path(path).makeRelativeTo(project.getProject().getLocation());
IFile javaFile = project.getProject().getFile(javaFilePath);
IJavaElement element = JavaCore.create(javaFile);

String lineDelimiter = StubUtility.getLineDelimiterUsed(null);
formattedSource = CodeFormatterUtil.format(CodeFormatter.K_COMPILATION_UNIT, source.toString(), 0,
lineDelimiter, (IJavaProject) null);


ASTParser parser = ASTParser.newParser(AST.JLS3);
try {
element = ((ICompilationUnit) element).getWorkingCopy(null);
((ICompilationUnit) element).getBuffer().setContents(formattedSource);
} catch (JavaModelException e) {
e.printStackTrace();
}
parser.setSource((ICompilationUnit)element);

final CompilationUnit node = (CompilationUnit) parser.createAST(new NullProgressMonitor());
OrganizeImportsOperation operation = new OrganizeImportsOperation((ICompilationUnit)element, node, true, false, false, new IChooseImportQuery() {
public TypeNameMatch[] chooseImports(TypeNameMatch[][] openChoices, ISourceRange[] ranges) {
return new TypeNameMatch[0];
}
});

InputStream inputStream = null;

try {
TextEdit textEdit = operation.createTextEdit(null);
JavaModelUtil.applyEdit((ICompilationUnit) element, textEdit, false, new NullProgressMonitor());
formattedSource = ((ICompilationUnit) element).getBuffer().getContents();
inputStream = new ByteArrayInputStream(formattedSource.getBytes(javaFile.getCharset()));
if (!javaFile.exists()) {
ResourcesUtil.safelyCreateFile(javaFile, inputStream, false, new NullProgressMonitor());
}else {
javaFile.setContents(inputStream, IFile.FORCE, new NullProgressMonitor());
}
} catch (Exception e) {
e.printStackTrace();
} finally{
IOUtils.closeQuietly(inputStream);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值