Slide 1

Slide 1 text

IntelliJ plugins “Where is the documentation”

Slide 2

Slide 2 text

There isn’t any* *There is a lot of documentation for very specific things

Slide 3

Slide 3 text

java.io.File

Slide 4

Slide 4 text

java.io.File VirtualFile

Slide 5

Slide 5 text

• IntelliJ’s representation of a file. • One for every file. • Exists during entire lifecycle of IntelliJ • When underlying file is deleted, VirtualFile
 remains but isValid() returns false. • VirtualFileListener • VirtualFileManager java.io.File VirtualFile

Slide 6

Slide 6 text

java.io.File VirtualFile Document

Slide 7

Slide 7 text

• Loaded in memory on request (cached). • Text level changes (deleteString, insertString) • The editor references a single document • DocumentListener java.io.File VirtualFile Document

Slide 8

Slide 8 text

java.io.File VirtualFile Document

Slide 9

Slide 9 text

• Standard AST - rule and terminal nodes. • The file is its own rule and is the
 root (FileASTNode) • Traversal done at runtime
 (findChildByType) java.io.File VirtualFile ASTNode Document

Slide 10

Slide 10 text

java.io.File VirtualFile ASTNode PsiFile/
 PsiElement Document

Slide 11

Slide 11 text

java.io.File VirtualFile ASTNode PsiFile/
 PsiElement Document

Slide 12

Slide 12 text

java.io.File VirtualFile ASTNode PsiFile/
 PsiElement Document

Slide 13

Slide 13 text

java.io.File VirtualFile ASTNode PsiFile/
 PsiElement Document

Slide 14

Slide 14 text

• Program Structure Interface • Similar to documents, weakly reference by VirtualFile • The architecture used for all IntelliJ features 
 (autocomplete, refactoring, find usages, etc.) • Maps one to one with ASTNodes (getNode()). • PsiTreeUtil java.io.File VirtualFile ASTNode PsiFile/
 PsiElement Document

Slide 15

Slide 15 text

• Parser Definitions are per-language • XML and Java already have ParserDefinitions
 (XMLParserDefinition and JavaParserDefinition) • Extend the class to implement for custom
 languages. • Provides implementations of a Lexer and Parser
 for the language to generate the ASTNode tree. • Provides methods to convert ASTNode to PsiElement java.io.File VirtualFile ASTNode PsiFile/
 PsiElement Document ParserDefinition

Slide 16

Slide 16 text

Application • Only ever one • Manages concurrency (runReadAction/runWriteAction) • Contains state for current IDEA instance (isEAP(),
 getStartTime()) • Contains state of your current thread (isReadAccessAllowed(), isWriteAccessAllowed())

Slide 17

Slide 17 text

Application Project • One instance per project (IntelliJ window) • Many Managers are per-project and require a project to
 be passed in.

Slide 18

Slide 18 text

Application Project Module • Many per project • Used to perform searches across dependencies

Slide 19

Slide 19 text

Application Project Module VirtualFile

Slide 20

Slide 20 text

Components • Components provide lifecycle callback for Applications, Projects
 and modules • A component is created per instance of Application/Project/Module • Optionally ask for the wrapped object in constructor.

Slide 21

Slide 21 text

(src/main/resources/META-INF/plugin.xml

Slide 22

Slide 22 text

Configuration File

Slide 23

Slide 23 text

Extension Points • Implement an extension point and IntelliJ will instantiate your class
 per application. • Typically defined per-language to avoid unnecessary execution. • Possible to create your own extension point so other plugins can
 extend your functionality.

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Documentation • In your editor, type “(ThingYouCareAbout)Manager” and attempt autocomplete. • Open source! kotlin, go, rust, sqldelight. • Look at their plugin.xml files for ideas. • Official intellij documentation 
 (www.jetbrains.org/intellij/sdk/docs/basics/types_of_plugins.html) • Jetbrains community forums. • AOSP

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content