Η πρόσθετη λειτουργία σας μπορεί να χρησιμοποιεί το API JDT για την αναζήτηση έργων Java στο χώρο εργασίας για στοιχεία Java, όπως παραπομπές μεθόδων, δηλώσεις πεδίων, υλοποιητές μιας διεπαφής, κλπ.
Το σημείο εισόδου για την αναζήτηση Java είναι η κλάση SearchEngine. Μπορείτε να αναζητήσετε συγκεκριμένα μοτίβα μέσα σε ένα στοιχείο Java και να προσαρμόσετε την εμβέλεια της αναζήτησης σε συγκεκριμένα στοιχεία. Μοτίβα αναζήτησης μπορούν να δημιουργηθούν με τη χρήση της μεθόδου createPattern. Η εμβέλεια ενός μοτίβου προσαρμόζεται με τη χρήση της μεθόδου createJavaSearchScope. Αφού οριστεί ένα μοτίβο και η εμβέλεια αναζήτησης, τότε χρησιμοποιείται η μέθοδος search για τη συλλογή των αποτελεσμάτων.
Τα αποτελέσματα της αναζήτησης αναφέρονται σε μια κλάση SearchRequestor την οποία πρέπει να επεκτείνετε προκειμένου να αποκτήσετε πρόσβαση στα αποτελέσματα.
Μια λειτουργία αναζήτησης θα χρησιμοποιεί τόσο ένα μοτίβο για την περιγραφή της φύσης της αναζήτησης όσο και μια εμβέλεια για τον περιορισμό της περιοχής έρευνας.
Ένα μοτίβο αναζήτησης ορίζει τον τρόπο με τον οποίο θα βρεθούν τα αποτελέσματα της αναζήτησης. Μπορείτε να δημιουργήσετε ένα μοτίβο αναζήτησης από ένα στοιχείο Java (δείτε createPatternPattern(IJavaElement, int)) ή από μια σειρά χαρακτήρων (δείτε createPattern(String, int, int, int).) Η τελευταία μέθοδος υποστηρίζει τη χρήση χαρακτήρων υποκατάστασης (δηλ. "*") και μπορεί να χρησιμοποιηθεί για τη διεύρυνση των αποτελεσμάτων αναζήτησης.
Για παράδειγμα, η δημιουργία ενός μοτίβου αναζήτησης για την αναζήτηση παραπομπών προς μια δεδομένη μέθοδο πραγματοποιείται ως εξής:
// Get the method IMethod method = ...; // Create search pattern SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);
Ή με τη δημιουργία ενός μοτίβου αναζήτησης για την αναζήτηση δηλώσεων όλων των ειδών που ξεκινούν με "Obj":
// Create search pattern SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
Υποστηρίζονται τα παρακάτω μοτίβα αναζήτησης:
Αν ενδιαφέρεστε για τα αποτελέσματα μιας αναζήτησης σε ένα συγκεκριμένο έργο ή σε ένα συγκεκριμένο πακέτο, ή αν γνωρίζετε ότι τα αποτελέσματα της αναζήτησης μπορούν να βρίσκονται μόνο σε μια ιεραρχία ενός συγκεκριμένου είδους, τότε μπορείτε να δημιουργήσετε την κατάλληλη εμβέλεια αναζήτησης χρησιμοποιώντας τη μέθοδο createJavaSearchScope(IJavaElement[]) ή την createHierarchyScope(IType).
Για παράδειγμα, η δημιουργία μιας εμβέλειας αναζήτησης σε ένα δεδομένο πακέτο πραγματοποιείται ως εξής:
// Get the package IPackageFragment pkg = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
Ή με τη δημιουργία μιας εμβέλειας αναζήτησης στην ιεραρχία ενός συγκεκριμένου είδους:
// Get the type IType type = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Τέλος, μπορείτε να δημιουργήσετε μια εμβέλεια αναζήτησης για ολόκληρο το χώρο εργασίας χρησιμοποιώντας τη μέθοδο createWorkspaceScope:
// Create search scope IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
Αφού δημιουργήσετε ένα μοτίβο αναζήτησης και την εμβέλεια για την αναζήτηση και έχετε επεκτείνει την κλάση SearchRequestor, μπορείτε να ξεκινήσετε ένα ερώτημα αναζήτησης ως εξής:
// Get the search pattern SearchPattern pattern = ...; // Get the search scope IJavaSearchScope scope = ...; // Get the search requestor SearchRequestor requestor = ...; // Search SearchEngine searchEngine = new SearchEngine(); searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
Μια ειδοποίηση για την έναρξη της αναζήτησης μεταβιβάζεται στον αιτούντα αναζήτησης, με τη χρήση της μεθόδου beginReporting. Στη συνέχεια, κάθε αποτέλεσμα της αναζήτησης αναφέρεται με τη χρήση της μεθόδου acceptSearchMatch. Τέλος, το endReporting υποδεικνύει ότι η αναζήτηση έχει τελειώσει.
Η αναφορά των αποτελεσμάτων αναζήτησης γίνεται με τη μέθοδο acceptSearchMatch(SearchMatch). Στη συνέχεια, παρέχονται ορισμένες πληροφορίες για τη μέθοδο SearchMatch.
Ένα αποτέλεσμα αναζήτησης μπορεί να αντιστοιχεί σε ένα στοιχείο Java (π.χ. μια δήλωση είδους) ή μπορεί να περιέχεται σε ένα στοιχείο Java (π.χ. μια παραπομπή σε ένα είδος μέσα σε μια μέθοδο). Η μηχανή αναζήτησης προσπαθεί πάντα να βρίσκει το πλέον εσωτερικό στοιχείο Java που αντιστοιχεί στο αποτέλεσμα αναζήτησης ή περιέχεται σε αυτό. Για παράδειγμα, η αναζήτηση για παραπομπές σε μια μέθοδο μπορεί να δώσει ως αποτέλεσμα μια τέτοια παραπομπή που περιέχεται σε μια λειτουργία απόδοσης αρχικών τιμών. Η λειτουργία απόδοσης αρχικών τιμών που περιέχει την παραπομπή στη μέθοδο αυτή είναι το στοιχείο της αντιστοιχίας αναζήτησης.
Η μηχανή αναζήτησης προσπαθεί επίσης να βρει τον πόρο ο οποίος περιέχει το στοιχείο Java. Αν το στοιχείο Java περιλαμβάνεται σε μια μονάδα μεταγλώττισης ή σε ένα αρχείο κλάσης, ο πόρος είναι η αντίστοιχη μέθοδος IFile. Αν το στοιχείο Java βρίσκεται σε ένα αρχείο .jar που υπάρχει στο χώρο εργασίας, ο επιστρεφόμενος πόρος είναι αυτό το αρχείο .jar. Διαφορετικά, ο επιστρεφόμενος πόρος είναι null.
Οι θέσεις πρωτογενούς κώδικα getOffset και getLength δίνονται σε σχέση με τη μονάδα μεταγλώττισης που περιέχει το αποτέλεσμα αναζήτησης. Αν το αποτέλεσμα της αναζήτησης περιέχεται σε ένα αρχείο .jar, τότε οι θέσεις πρωτογενούς κώδικα είναι σχετικές με τον προσαρτημένο πρωτογενή κώδικα. Αν δεν υπάρχει προσαρτημένος πρωτογενής κώδικας στο αρχείο .jar, τότε οι θέσεις αυτές είναι (-1, -1).
Στις περισσότερες περιπτώσεις, τα αποτελέσματα της αναζήτησης είναι ακριβή, που σημαίνει ότι η μηχανή αναζήτησης είχε τη δυνατότητα να κρίνει ότι η δεδομένη αντιστοιχία ήταν αυτή η οποία ζητήθηκε. Ωστόσο, σε ορισμένες περιπτώσεις, η μηχανή αναζήτησης δεν έχει τη δυνατότητα αυτή, οπότε η αντιστοιχία είναι ανακριβής. Μερικοί πιθανοί λόγοι για τους οποίους μια αντιστοιχία μπορεί να είναι ανακριβής είναι: