Pisanje dodataka IntelliJ IDEA koristeći Gradle

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 61% ispitanika, u odnosu na 55% godinu prije.

Jedna značajka koja čini IntelliJ toliko privlačnim programerima Jave je mogućnost proširenja i stvaranja nove funkcionalnosti pomoću dodataka.

U ovom ćemo uputstvu pogledati pisanje dodatka IntelliJ koristeći novi preporučeni način s Gradleom kako bismo demonstrirali nekoliko načina na koje možemo proširiti IDE. Ovaj je članak kombinacija prethodnog koji opisuje stvaranje istog dodatka pomoću dodatka Devkit.

2. Glavne vrste dodataka

Najčešće vrste dodataka uključuju funkcionalnost za:

  • Podrška za prilagođeni jezik: sposobnost pisanja, tumačenja i sastavljanja koda napisanog na različitim jezicima
  • Integracija okvira: podrška za nezavisne okvire poput Springa
  • Integracija alata: integracija s vanjskim alatima kao što je Gradle
  • Dodaci za korisničko sučelje: nove stavke izbornika, prozori alata, trake napretka 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 git izvršna datoteka instalirana 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. Stvorite dodatak

Postoje dva podržana načina stvaranja dodataka. Upotrijebit ćemo preporučeni način za nove projekte s Gradleom umjesto da koristimo njihov dodatak Devkit.

Stvaranje dodatka temeljenog na Gradleu vrši se pomoću Novo> Projekt izbornik.

Napominjemo da moramo uključiti Javu i dodatak za platformu IntelliJ kako bi se osiguralo da su potrebni razredi dodataka dostupni na putu predavanja.

Od ovog pisanja, JDK 8 možemo koristiti samo za pisanje dodataka IntelliJ.

4. Primjer dodatka

Stvorit ćemo dodatak koji omogućuje brzi pristup popularnom web mjestu Stack Overflow iz više područja u IDE-u. Sadržavat će:

  • 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 Stack Overflowu

4.1. Stvaranje radnji

Radnje su najčešći način pristupa dodatku. 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 dvije akcije.

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 za rješavanje svih nijansi otvaranja web stranice u različitim operativnim sustavima i preglednicima.

Za pretraživanje na StackOverflowu potrebna su nam dva parametra: jezična oznaka i tekst za pretraživanje.

Da bismo dobili jezičnu oznaku, upotrijebit ćemo sučelje programske strukture (PSI). 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:

Izborno psiFile = Izborno.ofNullable (e.getData (LangDataKeys.PSI_FILE)); String languageTag = psiFile.map (PsiFile :: getLanguage) .map (Language :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + lang + "]"). OrElse ("") ;

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

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 (@NotNull AnActionEvent e) {Izborno psiFile = Izborno.ofNullable (e.getData (LangDataKeys.PSI_FILE)); String languageTag = psiFile.map (PsiFile :: getLanguage) .map (Language :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + lang + "]"). OrElse ("") ; Uređivač uređivača = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); Niz selectedText = caretModel.getCurrentCaret (). GetSelectedText (); BrowserUtil.browse ("// stackoverflow.com/search?q=" + languageTag + selectedText); }

Ova akcija također nadjačava drugu metodu imenovanu ažuriranje, koji nam omogućuje da omogućimo ili onemogućimo radnju pod različitim uvjetima. U ovom slučaju onemogućujemo radnju pretraživanja ako nema odabranog teksta:

Uređivač uređivača = 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 radnje:

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 š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 kompajlira 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) otvaranjem prozora alata Gradle i izvršavanjem runIde zadatak:

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 želimo napraviti tradicionalnije jedinstveno testiranje, IntelliJ nudi bezglavo okruženje za pokretanje unit 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 Gradle pruža jednostavan način pakiranja dodataka kako bismo ih mogli instalirati i distribuirati. Jednostavno otvorite prozor Gradle alata i pokrenite buildPlugin zadatak. Ovo će generirati ZIP datoteku unutar datoteke graditi / distribucije imenik.

Generirana ZIP datoteka sadrži kod i konfiguracijske datoteke potrebne za učitavanje u IntelliJ. Možemo ga instalirati lokalno ili objaviti u spremištu dodataka kako 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 naglašava kako možemo poboljšati IntelliJ IDE.

Iako primarno radimo s radnjama, SDK dodatka IntelliJ nudi nekoliko načina za dodavanje nove funkcionalnosti u IDE. Za daljnje čitanje pogledajte njihov službeni vodič za početak.

Kao i uvijek, puni kôd našeg uzorka dodatka možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found