各种find

  1. 查找文件,根据名字(不知路径):  FilenameIndex.getFilesByName()  ,返回为Array<PsiFile>

  2. 查找class,路径已知:           JavaPsiFacade.findClass()

  3. 查找class,根据名字(不知路径):  PsiShortNamesCache.getClassesByName() 这个返回的是PsiClass的集合

  4. 查找psielment的引用处:  ReferencesSearch.search() :Query<PsiReference>

  5. 查找子类:    ClassInheritorsSearch.search()

  6. 查找父类:   PsiClass.getSuperClass()

  7. 查找psiClass包:PsiJavaFile file = psiClass.getContainingFile(), file.getPackageName()包名。PsiPackage psiPackage = JavaPsiFacade.getInstance(project).findPackage(packageName)

  8. 查找psiClass的包: PsiUtil.getPackageName()

  9. 查找psiFile的包: psiFile.packagename

  10. 查找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选项)

  11. 查找PsiMethod的overriding : OverridingMethodsSearch.search()

  12. 全局查找替换:

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()

        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值