-
查找文件,根据名字(不知路径): FilenameIndex.getFilesByName() ,返回为Array<PsiFile>
-
查找class,路径已知: JavaPsiFacade.findClass()
-
查找class,根据名字(不知路径): PsiShortNamesCache.getClassesByName() 这个返回的是PsiClass的集合
-
查找psielment的引用处: ReferencesSearch.search() :Query<PsiReference>
-
查找父类: PsiClass.getSuperClass()
-
查找psiClass包:PsiJavaFile file = psiClass.getContainingFile(), file.getPackageName()包名。PsiPackage psiPackage = JavaPsiFacade.getInstance(project).findPackage(packageName)
-
查找psiClass的包: PsiUtil.getPackageName()
-
查找psiFile的包: psiFile.packagename
-
查找psiFile的包:89都是直接分析psiClass的情况下得到的包名。但如果判断这个file是不是真的在这个包中,或者获取它的package(而非packageName),可以使用JavaDirectoryService.getInstance().getPackage(psiDir)?.name 。psiDir为该file的parent。(注意,这里getPackage后还要用name来判断,经历是:如果选中了res这个包也会获取到package,但它package.name是null。如果是res并列的非java包下的,点击时获取的package是null,经历的项目是为了创建activity,希望当前选中的是工程项目的某个文件或目录,单击其他文件和 目录时不给create选项)
-
查找PsiMethod的overriding : OverridingMethodsSearch.search()
-
全局查找替换:
private fun doReplace(iruHelper: IRUHelper, usage: UsageInfo2UsageAdapter, findModel: FindModel, project: Project, factory: PsiElementFactory) {
if(!FConfig.IS_TEST) {
val mName = usage.module.name.split(".").last()
if (mName != "account_sdk") return
}
var file = PsiManager.getInstance(project).findFile(usage.file)
if (file == null || file !is PsiJavaFile) return//只替换usage为javafile的,防止更换掉xml中的
val importList = file.importList
val importPath = iruHelper.getImportPath()
var hasImport = importList?.findSingleClassImportStatement(importPath) != null
if (!hasImport) {
hasImport = importList?.findOnDemandImportStatement(importPath) != null
}
val replaceEx = iruHelper.getReplaceRegex(findModel.stringToFind, usage.plainText) ?: return//如果可替换为null,则不替换
var replaceModel = FindModel().apply {
isRegularExpressions = true
stringToFind = findModel.stringToFind
stringToReplace = replaceEx
}
reWriteReplace(project) {
ReplaceInProjectManager.getInstance(project).replaceUsage(usage, replaceModel, emptySet(), false)
PsiDocumentManager.getInstance(project).commitAllDocuments()
}
runOnWrite(project) {
if (!hasImport) {
val importClass = AndroidUtil.getClassByPackage(project,importPath)
if(importClass!=null){
file.importList!!.add(factory.createImportStatement(importClass))
}else {
file.importList!!.add(factory.createImportStatementOnDemand(importPath))
}
// JavaCodeStyleManager.getInstance(project).optimizeImports(file)
}
PsiDocumentManager.getInstance(project).commitAllDocuments()
}