2014-04-23 15 views
16

Con l'idea intellij, come faccio a sapere che cosa rende visibile una variabile?cosa rende visibile una variabile (idea intellij)

Un esempio di quando è difficile:

  • Supponiamo si guarda class A, e si vede una variabile something. Se si salta alla fonte, si vede che è definito in trait X. Ma non è extend tratto X direttamente. Che cosa estendi, quindi, che rende visibile questa variabile? Se hai una gerarchia profondamente annidata, il monitoraggio può essere difficile.

Tutti i consigli o le soluzioni?

EDIT: ha creato un problema nel loro sistema di tracciamento: http://youtrack.jetbrains.com/issue/IDEA-124369

+1

quindi si tratta di integrazione di scala, non di Java? –

+0

Si applica anche a java. Hai opzioni su come rendere una variabile/tipo visibile in un file. – VasyaNovikov

+0

Uso IDEA tutti i giorni e lo faccio da molto tempo e se questa funzionalità è disponibile, non ne sono a conoscenza. JetBrains è molto reattivo sulle richieste di funzionalità, quindi dovresti probabilmente chiederlo. –

risposta

-2

se si vuole classe, campo o metodo per essere visibile, è necessario implementare loro come pubblico. Se fosse la tua domanda.

+0

Siamo spiacenti, no, la domanda riguardava il supporto IDE e la navigazione del codice. Quindi, il codice è già scritto e ora lo attraversi. – VasyaNovikov

0

Conosco due soluzioni quasi a questo problema.

go-to-dichiarazione, come lei ha ricordato, risolve questo problema nel caso delle variabili locali.

Più in generale, la funzione "trova usi" ti dà un po 'di ripartizione ordinata in base al tipo di file e di usi differenti della variabile. Da questo puoi vedere se è coinvolto in un'importazione statica.

Non è perfetto, ma con un momento di pensiero questi due sono in genere sufficienti per capire ciò che si desidera.

+0

Sfortunatamente, né 'find usages' né' go-to-declaration' non risolvono completamente il problema. Questi approcci non includono ancora istruzioni di importazione "di sottolineatura" come "import smth._". Non aiutano nemmeno a superare l'albero dei mix-in ... – VasyaNovikov

+0

In questo caso, sei contro una limitazione dell'implementazione di IntelliJ. Scusate. Tutto quello che puoi fare è usare "Trova nel percorso" (CTRL + MAIUSC + F per impostazione predefinita) per eseguire una ricerca stringa per ciò che desideri. Almeno IDEA effettua tali ricerche * velocemente *:/ –

+0

Sì, il modo in cui attualmente facciamo questo tipo di lavoro è utilizzando "trova tutti gli usi" ecc. I commenti mi hanno convinto che non esiste tale funzionalità integrata, quindi io almeno creato una "richiesta di funzionalità" sul loro sito .. – VasyaNovikov

0

Utilizzare ctrl + b o F4 per passare al codice sorgente. In alternativa puoi usare ctrl + shift + a per ottenere l'opzione/azione. Puoi trovare scorciatoie allo http://gaerfield.github.io/ide-shortcuts/. Spero che ti sarà d'aiuto.

+0

Ciao, scusa, no, la domanda è diversa. In parole povere, voglio passare a un'istruzione import/mixin nel file/vista corrente piuttosto che nel codice sorgente sottostante. Più dettagliato, vedi la descrizione della domanda stessa. – VasyaNovikov

0

Non credo che IntelliJ IDEA abbia una scorciatoia per "trovare ciò che rende visibile una variabile".

Tuttavia è possibile determinare utilizzando l'opzione "Trova Usi" (Alt + F7). Per esempio:

import java.nio._ 
object TempObj extends App { 
    def func = 2 
    val p = file.Paths.get("some-path") 
    func 
} 

Così trovare gli utilizzi su "file", si dice che la sua da "file" pacchetto (nel titolo della nuova scheda mostra anche il nome completo del pacchetto, es: Trova Usi di java. nio.file in File di progetto). Mentre Find Usages su func ti dirà che è un metodo (e l'intestazione Tab dice ora: Trova Usages of func() in Project and Libraries)

Così ora come è possibile determinare, cosa rende esattamente visibile la variabile . Questo funziona anche per le importazioni poiché mostra il pacchetto da cui è importato e puoi quindi cercare l'importazione di quei pacchetti.

+0

IMO, equivale a saltare alla fonte ('Ctrl B'). Salti e poi conosci il nome del pacchetto. Tuttavia, non sai cosa ha reso visibile questa variabile nel tuo contesto. Ad esempio: 'trait A {def whereAmI = 1}; la caratteristica B estende A; classe Mystery estende B con Other with Other2 con Other3 {println (whereAmI)} 'Ora guardando la fonte di' Mystery', non riesco a capire da dove provenga la variabile. Proviene da 'B'? O da "Altro"? O forse da un oggetto che estrae 'A' e abbiamo importato il contenuto dell'oggetto? – VasyaNovikov

+0

... In realtà, "Trova usi" è già stato proposto in precedenza. Sfortunatamente, non funziona, a causa delle ragioni descritte. – VasyaNovikov

+0

Sì, hai ragione quindi la risposta breve è no non la puoi trovare al momento. – KarateKid

0

Da quello che ho capito che si desidera vedere il codice che crea un oggetto si usa, per esempio Mystery someMystery;.
Che ti dà due opzioni per popolano someMystery:

  1. someMystery = ... dove ...è il tuo codice per popolare someMystery e se questo è il caso si dovrebbe seguire quel codice (con ctrl + B per quanto è necessario) al punto in cui lo crea effettivamente l'oggetto Mystery.
  2. Utilizzare CDI per compilare l'istanza di tale oggetto, nel qual caso è necessario esaminare il meccanismo CDI per vedere in che modo viene popolata l'istanza dell'oggetto.

In entrambi i casi IMO non c'è modo di sapere con certezza se l'istanza someMystery è di una certa classe di più concreto di Mystery, perché si decide in fase di esecuzione, non in fase di compilazione, così il vostro prossima scommessa sarebbe quella di eseguire il programma in debug e vedere quale oggetto va in someMystery, anche se non è garantito per ottenere lo stesso tipo di oggetto ogni volta.

PS. La mia risposta si basa interamente sulla mia comprensione java dell'argomento, non posso dire se è valida anche per scala.

+0

Non proprio. Sto cercando cosa rende una variabile _be visible_ in fase di compilazione nell'attuale blocco di codice. Un esempio di quando può essere difficile da capire è una profonda gerarchia "estende". Lo sai, finalmente, questo è un membro di 'Trait X'. Ma non estendi direttamente 'X'. Da dove viene il tuo codice allora? Ad ogni modo, è indicato nel problema. – VasyaNovikov

+0

P.S. Ho modificato il testo per provare a renderlo più chiaro. – VasyaNovikov