Pisanje dodataka IntelliJ IDEA

1. Uvod

Tijekom posljednjih nekoliko godina, IntelliJ iz JetBrains brzo je postao glavni IDE za programere Java. U našem najnovijem izvješću o stanju Jave, IntelliJ je bio IDE za odabir za 55% ispitanika, u odnosu na 48% godinu prije.

Jedna značajka koja čini IntelliJ toliko privlačnim programerima Jave jest sposobnost proširenja i stvaranja nove funkcionalnosti pomoću dodataka. U ovom ćemo uputstvu pogledati pisanje dodatka IntelliJ kako bismo demonstrirali nekoliko načina proširivanja IDE-a.

Imajte na umu da, iako je ovaj članak usredotočen na dodatke IntelliJ, svi IDE-ovi JetBrains dijele zajednički kod. Stoga, mnoge se ovdje korištene tehnike mogu primijeniti na druge JetBrainove IDE-ove kao što su PyCharm, RubyMine i drugi.

2. Funkcionalnost dodatka

Funkcionalnost dodatka za IntelliJ obično spada u jednu od 4 kategorije:

  • Prilagođeni jezici: sposobnost pisanja, tumačenja i sastavljanja koda napisanog na različitim jezicima
  • Okviri: podrška za okvire trećih strana kao što je Spring
  • Alati: integracija s vanjskim alatima kao što je Gradle
  • Dodaci za korisničko sučelje: nove stavke izbornika, prozori i gumbi alata i još mnogo toga

Dodaci će često spadati u više kategorija. Na primjer, dodatak Git koji se isporučuje s IntelliJ-om, komunicira s izvršnom datotekom git instaliranom na sustavu. Dodatak nudi svoj prozor s alatima i skočne stavke izbornika, istovremeno integrirajući se u tijek rada za stvaranje projekta, prozor postavki i još mnogo toga.

3. Stvaranje dodatka

Najlakši način za početak rada s dodacima IntelliJ je njihov dodatak DevKit. Ovome se može pristupiti s Novi >Projekt izbornik:

Napomena: moramo koristiti JetBrains JDK kako bi se osiguralo da su potrebni razredi dodataka dostupni na putu predavanja. IntelliJ bi prema zadanim postavkama trebao imati prikladan JDK, ali ako ne, možemo ga preuzeti odavde.

Od ovog pisanja, Java 8 možemo koristiti samo za pisanje dodataka IntelliJ. To je zato što JetBrains trenutno ne nudi službeni JDK za Javu 9 ili noviju.

4. Primjer dodatka

Da bismo demonstrirali pisanje dodatka IntelliJ, stvorit ćemo dodatak koji omogućuje brzi pristup popularnom web mjestu Stack Overflow iz više područja u IDE-u. Mi ćemo dodati:

  • Stavka izbornika Alati za posjet stranici Pitajte
  • Stavka skočnog izbornika u izlazu za uređivanje teksta i na konzoli za pretraživanje istaknutog teksta u Preljevu stoga.

4.1. Stvaranje radnji

Akcije su temeljna komponenta koja se koristi za pisanje dodataka IntelliJ. Radnje pokreću događaji u IDE-u, poput klikanja stavke izbornika ili gumba na alatnoj traci.

Prvi korak u stvaranju akcije je stvaranje Java klase koja se proširuje U Akciji. Za naš dodatak Stack Overflow stvorit ćemo 2 radnje.

Prva akcija otvara stranicu Postavi pitanje u novom prozoru preglednika:

javna klasa AskQuestionAction proširuje AnAction {@Override public void actionPerformed (AnActionEvent e) {BrowserUtil.browse ("// stackoverflow.com/questions/ask"); }}

Koristimo ugrađeno BrowserUtil klase jer obrađuje sve nijanse otvaranja web stranice u različitim operativnim sustavima i preglednicima.

Druga akcija otvara stranicu pretraživanja Stack Overflow i prosljeđuje tekst pretraživanja kao niz upita. Ovaj put ćemo primijeniti dvije metode.

Prva metoda koju implementiramo je poput naše prve akcije i rukuje otvaranjem web preglednika.

Prvo, ipak, moramo prikupiti dvije vrijednosti za StackOverflow. Jedno je jezična oznaka, a drugo tekst za traženje.

Da bismo dobili jezičnu oznaku, upotrijebit ćemo sučelje za strukturu programa. Ovaj API raščlanjuje sve datoteke u projektu i pruža programski način njihovog pregleda.

U ovom slučaju koristimo PSI za određivanje programskog jezika datoteke:

Datoteka PsiFile = e.getData (CommonDataKeys.PSI_FILE); Jezik lang = e.getData (CommonDataKeys.PSI_FILE) .getLanguage (); Niz jezikaTag = "+ [" + lang.getDisplayName (). ToLowerCase () + "]";

Imajte na umu da PSI također pruža pojedinosti o datoteci specifične za jezik. Na primjer, mogli bismo koristiti PSI za pronalaženje svih javnih metoda u Java klasi.

Da bismo dobili tekst za pretraživanje, koristit ćemo Urednik API za dohvaćanje istaknutog teksta na zaslonu:

konačni uređivač uređivača = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); Niz selectedText = caretModel.getCurrentCaret (). GetSelectedText ();

Iako je ova radnja jednaka i za prozore uređivača i konzole, pristup odabranom tekstu djeluje na isti način.

Sada to možemo sve staviti u actionPerformed deklaracija:

@Override public void actionPerformed (AnActionEvent e) {PsiFile datoteka = e.getData (CommonDataKeys.PSI_FILE); Jezik lang = e.getData (CommonDataKeys.PSI_FILE) .getLanguage (); String languageTag = "+ [" + lang.getDisplayName (). ToLowerCase () + "]"; Uređivač uređivača = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); String selectedText = caretModel.getCurrentCaret (). GetSelectedText () String query = selectedText.replace ('', '+') + languageTag; BrowserUtil.browse ("// stackoverflow.com/search?q=" + upit); } 

Ova akcija također nadjačava drugu metodu imenovanu ažuriranje. To nam omogućuje da omogućimo ili onemogućimo radnju pod različitim uvjetima.

U ovom slučaju onemogućujemo radnju pretraživanja kada nema odabranog teksta:

@Override public void update (AnActionEvent e) {Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); e.getPresentation (). setEnabledAndVisible (caretModel.getCurrentCaret (). hasSelection ()); } 

4.2. Registriranje radnji

Jednom kad napišemo svoje akcije, moramo ih registrirati u IDE-u. Postoje dva načina za to.

Prvi način je korištenje dodatak.xml datoteku koja se kreira za nas kada započnemo novi projekt.

Prema zadanim postavkama datoteka će imati prazno element, u koji ćemo dodati svoje akcije:

Korištenje XML datoteke za registraciju akcija osigurat će njihovo registriranje tijekom pokretanja IDE-a, što je obično poželjno.

Drugi način registracije radnji je programsko korištenje ActionManager razred:

ActionManager.getInstance (). RegisterAction ("StackOverflow.SearchAction", novo SearchAction ());

Prednost je u tome što nam omogućuje dinamično registriranje radnji. Na primjer, ako napišemo dodatak za integraciju s udaljenim API-jem, možda bismo htjeli registrirati drugačiji skup radnji na temelju verzije API-ja koju zovemo.

Nedostatak ovog pristupa je taj što se radnje ne registriraju pri pokretanju. Moramo stvoriti primjerak Komponenta aplikacije za upravljanje radnjama, što zahtijeva više kodiranja i XML konfiguracije.

5. Testiranje dodatka

Kao i za bilo koji drugi program, pisanje dodatka IntelliJ zahtijeva testiranje. Za mali dodatak poput ovog koji smo napisali dovoljno je osigurati da se dodatak kompilira i da radnje koje smo stvorili rade kako se očekuje kad ih kliknemo.

Svoj dodatak možemo ručno testirati (i otkloniti pogreške) pomoću konfiguracije pokretanja dodatka:

Ovo će pokrenuti novu instancu IntelliJ s aktiviranim našim dodatkom. To nam omogućuje da kliknemo na različite stavke izbornika koje smo stvorili i osiguramo da se otvore odgovarajuće stranice za prelijevanje stoga.

Ako želite napraviti tradicionalnije jedinstveno testiranje, IntelliJ nudi bezglavo okruženje za pokretanje jediničnih testova. Testove možemo pisati koristeći bilo koji testni okvir koji želimo, a testovi se izvode koristeći stvarne, neispunjene komponente iz IDE-a.

6. Postavljanje dodatka

Dodatak DevKit pruža jednostavan način pakiranja dodataka kako bismo ih mogli instalirati i distribuirati. Jednostavno kliknite desnu tipku miša na projekt dodatka i odaberite "Pripremite dodatak za implementaciju". Ovo će generirati JAR datoteku unutar direktorija projekta.

Generirana JAR datoteka sadrži kod i konfiguracijske datoteke potrebne za učitavanje u IntelliJ. Možete ga instalirati lokalno ili objaviti u spremištu dodataka da bi ga drugi mogli koristiti.

Snimka zaslona u nastavku prikazuje jednu od novih stavki izbornika Stack Overflow na djelu:

7. Zaključak

U ovom smo članku razvili jednostavan dodatak koji ističe samo nekoliko načina na koje možemo poboljšati IntelliJ IDE.

Iako smo prvenstveno radili s radnjama, SDK za dodatak IntelliJ nudi nekoliko načina za dodavanje nove funkcionalnosti u IDE. Za daljnje čitanje pogledajte službeni vodič za početak rada.

Kao i uvijek, puni kôd našeg uzorka dodatka možete pronaći u našem GitHub spremištu.