eclipse jdt organize imports 实现

大致说下这个功能的思路:

1:用字符串构建java文件

2:在内存中构建ijavaelement对象,并对这个对象进行重组(用到了jdt的OrganizeImportsOperation)

3:IFile写入文件

Stringpath="";//文件绝对路径

IJavaProjectproject=null;

IPathgenSourceFolderPath=newPath(filePath);

for(IProjectp:ResourcesPlugin.getWorkspace().getRoot().getProjects()){

if(p.isOpen()){

//查找工程的实际路径是否在源代码生成路径上,如果是,则就是该工程

if(p.getLocation().isPrefixOf(genSourceFolderPath)){

project=JavaCore.create(p);

}

}

}

if(project==null){

thrownewAresCompilerException("无法生成源码文件:"+path);

}

IPathjavaFilePath=newPath(path).makeRelativeTo(project.getProject().getLocation());

IFilejavaFile=project.getProject().getFile(javaFilePath);

IJavaElementelement=JavaCore.create(javaFile);

StringlineDelimiter=StubUtility.getLineDelimiterUsed(null);

formattedSource=CodeFormatterUtil.format(CodeFormatter.K_COMPILATION_UNIT,source.toString(),0,

lineDelimiter,(IJavaProject)null);

ASTParserparser=ASTParser.newParser(AST.JLS3);

try{

element=((ICompilationUnit)element).getWorkingCopy(null);

((ICompilationUnit)element).getBuffer().setContents(formattedSource);

}catch(JavaModelExceptione){

e.printStackTrace();

}

parser.setSource((ICompilationUnit)element);

finalCompilationUnitnode=(CompilationUnit)parser.createAST(newNullProgressMonitor());

OrganizeImportsOperationoperation=newOrganizeImportsOperation((ICompilationUnit)element,node,true,false,false,newIChooseImportQuery(){

publicTypeNameMatch[]chooseImports(TypeNameMatch[][]openChoices,ISourceRange[]ranges){

returnnewTypeNameMatch[0];

}

});

InputStreaminputStream=null;

try{

TextEdittextEdit=operation.createTextEdit(null);

JavaModelUtil.applyEdit((ICompilationUnit)element,textEdit,false,newNullProgressMonitor());

formattedSource=((ICompilationUnit)element).getBuffer().getContents();

inputStream=newByteArrayInputStream(formattedSource.getBytes(javaFile.getCharset()));

if(!javaFile.exists()){

ResourcesUtil.safelyCreateFile(javaFile,inputStream,false,newNullProgressMonitor());

}else{

javaFile.setContents(inputStream,IFile.FORCE,newNullProgressMonitor());

}

}catch(Exceptione){

e.printStackTrace();

}finally{

IOUtils.closeQuietly(inputStream);

}

相关推荐