文件索引

走着路睡觉大约 4 分钟

文件索引

文件索引基于Map/Reduceopen in new window 的数据结构。每一个索引都有一个指定类型的key,一个指定类型的value.

示例:word索引中,key就是word自己。value是跟key关联的,包含了word的context的对象(code, string literal, 或 comment)

在索引中,如果获取索引中某key的value的 type 等于 Void ,则表示不存在跟key相关的数据。

当一个索引实现类对一个文件创建了索引,那么这个索引实现类会收到该文件的内容,并返回一个Map, Map包含了该文件的索引key,及跟key相关的value

访问索引的时候,传入key,就能获取到跟key相关的所有文件。

提示

某些情况,可以不使用索引,而使用 Gist

实现文件索引

提示

UI Designer bound forms indexopen in new window 是一个相对简单的索引示例,它存储了 GUI Designeropen in new window .form中使用的class的全限定命令

注册索引实现类,如下:

<!--在plugin.xml里注册索引实现类-->
 <extensions defaultExtensionNs="com.intellij">
        <fileBasedIndex implementation="com.intellij.util.indexing.FileBasedIndexExtension 的子类"></fileBasedIndex>
 </extensions>

实现 com.intellij.util.indexing.FileBasedIndexExtensionopen in new window 分为以下几部分:

如果获取到的value的type 等于 Void ,则表示不存在该文件。

通过继承 ScalarIndexExtensionopen in new window 可以实现简单的索引。如果索引的Value只有一个,可以继承 SingleEntryFileBasedIndexExtensionopen in new window 来实现

警告

为了保证相同的Value只存储一个,所有索引Value的实现类必须重写 equals() 和 hashCode() 方法。

通过 DataIndexer.map() 方法返回的数据必须只依赖用户输入的参数,不能依赖任何外部元素,否则,你的索引将不能实时更新

在开发的时候,debug索引时,可以把 intellij.idea.indices.debug/intellij.idea.indices.debug.extra.sanity 设置为true

访问文件索引

提示

注意:在项目处于 Dumb mode 时,不能访问索引

通过FileBasedIndexopen in new window 来访问文件索引,主要包括以下操作:

  • getAllKeys()processAllKeys() 方法可以获取到项目的文件所有的key。可以让 FileBasedIndexExtension.traceKeyHashToVirtualFileMapping() 方法返回 true ,来优化性能

提示

保证能返回最新项目中所有的key,也可能有最新项目中不包含的key(项目更新时,会更新索引,但不会删除老索引)。

  • getValues() :获取跟Key有关的所有值,但是不包含值所在的文件

  • getContainingFiles() :获取包括Key的所有文件

  • processValues() :可以遍历和访问跟Key有关的所有文件

警告

索引不支持嵌套访问,可能会引起死锁。应该先从索引A中获取到所有结果,然后再在索引B中使用索引A的结果。

标准索引

IntelliJ Platform 提供了常用的索引,如下:

Word Index

通常使用 PsiSearchHelperopen in new window 来访问

File Name Index

FilenameIndexopen in new window 可以快速的根据文件名称查找文件

File Type Index

FileTypeIndexopen in new window 可以快速的根据文件类型查找文件

向原有的索引根中添加索引

继承 IndexableSetContributoropen in new window,并在plugin.xml里注册,如下:

  <extensions defaultExtensionNs="com.intellij">
       <indexedRootsProvider implementation="com.intellij.util.indexing.IndexableSetContributor 实现类"></indexedRootsProvider>
    </extensions>
上次编辑于:
贡献者: zhaojingbo
Loading...