2010-05-24 17 views
6

Sto eseguendo alcuni refactoring del mio progetto Delphi. Voglio essere in grado di apportare una modifica, quindi vedere tutti i i luoghi nel progetto che si interrompono a causa di tale modifica. Simile a come Eclipse elenca tutti gli errori di compilazione per un progetto (in Java).Trova tutti gli errori di compilazione in un progetto Delphi

In Delphi, posso apportare una modifica, quindi ricompilare il mio progetto, ma il compilatore si ferma quando trova la prima unità che non viene compilata. Devo riparare quell'Unità, compilare di nuovo, che poi mi mostrerà il prossimo errore, ecc. Ecc.

Voglio vedere tutti gli errori di compilazione nel progetto in uno solo,. Quindi posso decidere se vale la pena cambiarlo. Ad esempio, se la modifica richiede il fissaggio manuale di 50 file sorgente separati, non vale la pena farlo. Ma se si rompono solo 2 file, è un cambiamento facile da fare.

C'è un modo per farlo in Delphi? Posso dire al compilatore di andare avanti anche dopo aver trovato un'unità che non viene compilata?

Sto usando Delphi 2010

risposta

5

Le unità Delphi, come funzionalità di modularità, sono concettualmente di livello simile a Java jars o .NET assembly; si compilano su singoli file. In né Java né .NET puoi compilare moduli dipendenti quando hai compilato errori in un modulo di riferimento.

La ragione per cui sono più granulari rispetto agli assiemi .NET ecc. Deve la loro cronologia. Sono stati progettati in parte attorno all'architettura segmentata x86; i dati associati a una singola unità non possono essere maggiori di 64 KB. Allo stesso modo, le unità fungevano da divisione naturale tra codice vicino e codice remoto. Se hai familiarità con x86 a 16 bit, saprai che i puntatori ai dati lontani richiedevano un valore per il segmento e l'offset, mentre per i dati vicini serviva solo un offset. Chiamare il codice vicino era anche più veloce di chiamare il codice remoto. I programmi erano anche più piccoli e meno complessi di allora; l'unità era una ragionevole granularità del modulo per un valore dell'intero sottosistema. Questo è molto meno il caso oggi.

+0

Interessante. Quindi, in altre parole, se avessi tutte le mie classi in un'unica grande unità, invece di mettere ogni classe in un'unità separata, potrei vedere tutti gli errori nell'unità contemporaneamente. Come hai accennato, questo non è veramente pratico per le dimensioni dei progetti che facciamo oggi (è mai stato?). Certamente non ho mai visto un jar Java che abbia avuto la sua intera fonte in un file .java! – awmross

+0

@awmross: Interessante, ma in toto. Eclipse può mostrare tutti gli errori in tutti i file Java. Ovviamente Delphi potrebbe farlo anche se ci sono errori solo nella parte 'implementation'. Anche gli errori nella parte 'interface' non ostacolano la compilazione di unità che non dipendono dall'unità errata. La vera ragione è probabilmente che gli sviluppatori di Delphi non hanno visto questa funzionalità abbastanza utile. – maaartinus

+0

@maaartinus - Non penso che sia una questione di non essere visto come utile, più che è visto come uso * meno *. per esempio. qualsiasi sviluppatore C# ti dirà che quando si verifica un errore di compilazione in un assembly in una soluzione che molto spesso causa una cascata di errori a causa dell'assenza di tale assembly. Quindi inizi a correggere più di 200 errori, ma se correggi il primo errore di compilazione, ** tutti gli errori ** 200+ vengono risolti. Quindi quale indicazione significativa è stata realmente fornita da questi 200 + -1 errori? Occasioni quando è utile l'errore> 1 possono esistere, ma sono molto pochi e distanti tra loro. – Deltics

5

Non c'è modo di farlo con il compilatore Delphi, ma se state pensando di fare un cambiamento di rottura ad una parte della interfaccia pubblica di un'unità, è possibile utilizzare gli strumenti di refactoring che vieni con l'IDE per trovare tutti i riferimenti a qualsiasi cosa tu stia per cambiare prima di cambiarlo, il che ti darà le informazioni che stai cercando.

+1

Mi piacerebbe utilizzare gli strumenti di refactoring per questo. Sfortunatamente non funzionano su progetti diversi nello stesso gruppo di progetto. Rifattorizzano all'interno dello stesso Progetto, ma qualsiasi Unità in altri progetti che usano quell'Unità non sarà cambiata. – awmross

+0

@awmross: Ah. Non hai menzionato il progetto * gruppi * nella tua domanda. –

+1

Sto usando D2009 e utilizzo Refactoring. Per quanto posso dire stanno lavorando su progetti in un gruppo di progetto (a condizione di avere il gruppo aperto, naturalmente). Quando rinominare una classe o un metodo in un'unità condivisa, tutti i suoi riferimenti sono cambiati in tutti i progetti. Devo ammettere che uso principalmente i refactoring "rinominare" ... Non so degli altri. –

0

Il compilatore Delphi già tentativi per compilare il più possibile.
Sfortunatamente, molto spesso, un errore è abbastanza critico da impedire al compilatore di superare l'errore in quanto non può assumere un'ipotesi su quale dovrebbe essere il codice se fosse compilabile.

Inoltre, molto spesso, gli errori che un compilatore può dare dopo che il primo errore è stato riscontrato non sono affidabili e possono persino scomparire dopo aver risolto il primo errore. (assistito da tutte le linee ondulate rosse che appaiono e scompaiono quando si digita)

Ciò che il compilatore deve fornire è fornire tutti i suggerimenti e gli avvertimenti (che vengono chiamati errori per alcuni altri compilatori).

+1

Non sono sicuro che sia impossibile, considerando che altre lingue riescono a farlo. Forse c'è qualcosa in Delphi (il linguaggio) che rende impossibile costruire un compilatore che faccia questo. – awmross

+0

Delphi ha un compilatore a passaggio singolo. Questo è il motivo per cui è così veloce, ma anche perché alcuni errori sono solo terminali. Come ho già detto, in alcuni casi può trovare più di 1 errore. –

0

È possibile utilizzare Ctrl-Shift-Invio per vedere tutte le occorrenze della variabile, proprietà, metodo o wahtever al momento sotto il cursore. Con queste informazioni puoi decidere di fare le tue modifiche o meno.

Purtroppo, con la versione corrente questa funzione non funziona come dovrebbe.

Problemi correlati