2013-01-08 8 views
5

Ich habe ein benutzerdefiniertes XML-Format, das auf Java-Ressourcen verweist. Der Einfachheit halber nehmen wir an, dass meine XML-Datei wie folgt aussehen würde:Machen Sie IntelliJ auf Links zu Java-Elementen in XML-Dateien aufmerksam.

<root> 
    <java-class>my.fully.qualified.class.name</java-class> 
</root> 

Schließlich werden meine Referenzen etwas komplizierter sein. Es wird den voll qualifizierten Klassennamen nicht direkt enthalten und ich werde Logik brauchen, um die richtige Klasse aufzulösen, aber ich möchte das Beispiel hier so einfach wie möglich halten.

Jetzt möchte ich es möglich sein, Strg + Klicken Sie auf den Text des Elements und möchte IntelliJ mich in die .java-Datei zu tragen, genau wie es in Spring-XML-Dateien möglich ist. In der IDEA Plugin Development FAQ gibt es einen Link namens "How do I add custom references to Java elements in XML files?", der so viel wie genau das klingt, was ich brauche. Leider verlinkt es auf eine Diskussion, bei der jemand mehr oder weniger damit beschäftigt ist, etwas ähnliches zu implementieren und kleinere Probleme zu haben. Trotzdem habe ich verstanden, dass ich wahrscheinlich eine Implementierung der Schnittstelle com.intellij.psi.PsiReference schreiben muss. Googling für "PsiReference" und "IntelliJ" oder "IDEA" brachte leider keine Tutorials zur Benutzung, aber ich fand die Klasse XmlValueReference, die sich nützlich anhört. Das erneute Durchsuchen nach "XmlValueReference" ergab nichts Nützliches zur Verwendung der Klasse. Zumindest die PSI Cookbook sagt mir, dass ich die Java-Klasse mit JavaPsiFacade.findClass() finden kann. Ich wäre dankbar für Tutorials, Hinweise und ähnliches, die die korrekte Verwendung erklären.

Die oben verlinkte Diskussion erwähnt, dass ich registry.registerReferenceProvider(XmlTag.class, provider) aufrufen muss, um meinen Anbieter zu registrieren, sobald ich es schließlich implementieren konnte, aber welcher Typ ist "Registrierung" und woher bekomme ich es?

Antwort

4

Zuerst ist hier eine nice tutorial, die vor ein paar Tagen kam, die die Grundlagen der IntelliJ Plugin-Entwicklung erklärt (Sie sollten einen Blick auf den Abschnitt Reference Contributor werfen).

Sie werden wahrscheinlich Ihre eigene PsiReferenceContributor zu definieren, die in Ihrer plugin.xml wie folgt referenziert werden:

<psi.referenceContributor implementation="com.yourplugin.YourReferenceContributor"/> 

in Ihrer Referenz Beiträger, gibt es eine Methode registerReferenceProviders(PsiReferenceRegistrar) wo Sie registry.registerReferenceProvider(XmlTag.class, provider) nennen können.

Schließlich müssen Sie in Ihrer Instanz PsiReferenceProvider den Tag-Namen testen, um Tags herauszufiltern, die keine Klassenreferenzen enthalten, und dann the right Java class mit JavaPsiFacade.findClass() finden.

Aus meiner Erfahrung ist der beste Ort, um Hilfe in Bezug auf IntelliJ Plugin-Entwicklung zu erhalten JetBrains' forums.

Verwandte Themen