Χρήση της μηχανής αναζήτησης Java

Η πρόσθετη λειτουργία σας μπορεί να χρησιμοποιεί το API JDT για την αναζήτηση έργων Java στο χώρο εργασίας για στοιχεία Java, όπως παραπομπές μεθόδων, δηλώσεις πεδίων, υλοποιητές μιας διεπαφής, κλπ.

Το σημείο εισόδου για την αναζήτηση Java είναι η κλάση SearchEngine. Μπορείτε να αναζητήσετε συγκεκριμένα μοτίβα μέσα σε ένα στοιχείο Java και να προσαρμόσετε την εμβέλεια της αναζήτησης σε συγκεκριμένα στοιχεία.  Μοτίβα αναζήτησης μπορούν να δημιουργηθούν με τη χρήση της μεθόδου createPattern.  Η εμβέλεια ενός μοτίβου προσαρμόζεται με τη χρήση της μεθόδου createJavaSearchScope.  Αφού οριστεί ένα μοτίβο και η εμβέλεια αναζήτησης, τότε χρησιμοποιείται η μέθοδος search για τη συλλογή των αποτελεσμάτων.

Τα αποτελέσματα της αναζήτησης αναφέρονται σε μια κλάση SearchRequestor την οποία πρέπει να επεκτείνετε προκειμένου να αποκτήσετε πρόσβαση στα αποτελέσματα.

Προετοιμασία για αναζήτηση

Μια λειτουργία αναζήτησης θα χρησιμοποιεί τόσο ένα μοτίβο για την περιγραφή της φύσης της αναζήτησης όσο και μια εμβέλεια για τον περιορισμό της περιοχής έρευνας.

Δημιουργία ενός μοτίβου αναζήτησης Java

Ένα μοτίβο αναζήτησης ορίζει τον τρόπο με τον οποίο θα βρεθούν τα αποτελέσματα της αναζήτησης. Μπορείτε να δημιουργήσετε ένα μοτίβο αναζήτησης από ένα στοιχείο 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);

Υποστηρίζονται τα παρακάτω μοτίβα αναζήτησης:

Δημιουργία εμβέλειας αναζήτησης Java

Αν ενδιαφέρεστε για τα αποτελέσματα μιας αναζήτησης σε ένα συγκεκριμένο έργο ή σε ένα συγκεκριμένο πακέτο, ή αν γνωρίζετε ότι τα αποτελέσματα της αναζήτησης μπορούν να βρίσκονται μόνο σε μια ιεραρχία ενός συγκεκριμένου είδους, τότε μπορείτε να δημιουργήσετε την κατάλληλη εμβέλεια αναζήτησης χρησιμοποιώντας τη μέθοδο 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. Αν το στοιχείο Java περιλαμβάνεται σε μια μονάδα μεταγλώττισης ή σε ένα αρχείο κλάσης, ο πόρος είναι η αντίστοιχη μέθοδος IFile. Αν το στοιχείο Java βρίσκεται σε ένα αρχείο .jar που υπάρχει στο χώρο εργασίας, ο επιστρεφόμενος πόρος είναι αυτό το αρχείο .jar. Διαφορετικά, ο επιστρεφόμενος πόρος είναι null.

Θέσεις πρωτογενούς κώδικα

Οι θέσεις πρωτογενούς κώδικα getOffset και getLength δίνονται σε σχέση με τη μονάδα μεταγλώττισης που περιέχει το αποτέλεσμα αναζήτησης. Αν το αποτέλεσμα της αναζήτησης περιέχεται σε ένα αρχείο .jar, τότε οι θέσεις πρωτογενούς κώδικα είναι σχετικές με τον προσαρτημένο πρωτογενή κώδικα. Αν δεν υπάρχει προσαρτημένος πρωτογενής κώδικας στο αρχείο .jar, τότε οι θέσεις αυτές είναι (-1, -1).

Ακριβή και ανακριβή αποτελέσματα αναζήτησης

Στις περισσότερες περιπτώσεις, τα αποτελέσματα της αναζήτησης είναι ακριβή, που σημαίνει ότι η μηχανή αναζήτησης είχε τη δυνατότητα να κρίνει ότι η δεδομένη αντιστοιχία ήταν αυτή η οποία ζητήθηκε. Ωστόσο, σε ορισμένες περιπτώσεις, η μηχανή αναζήτησης δεν έχει τη δυνατότητα αυτή, οπότε η αντιστοιχία είναι ανακριβής. Μερικοί πιθανοί λόγοι για τους οποίους μια αντιστοιχία μπορεί να είναι ανακριβής είναι: