IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Récupérer la méthode à partir du numéro de ligne


Sujet :

Eclipse Platform

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 34
    Points : 17
    Points
    17
    Par défaut Récupérer la méthode à partir du numéro de ligne
    Bonjour,

    Je développe une application Eclipse RCP, avec pour objectif d'analyser un projet et générer un graphe de dépendances entre méthodes de ce projet, afin de connaître le code mort, le code modifié, ...
    Je cherche donc à récupérer le nom de méthodes appelantes, dans une classe, à partir d'un numéro de ligne.

    Par exemple, si on a le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Main {
     
     
        public static void main(String[] args) {
     
            System.out.println("Hello WORLD !!");
        }
    }
    il me faudrait pouvoir récupérer le nom de la méthode qui contient le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Hello WORLD !!");
    déclaré à la ligne 6. En l'occurrence, dans le cas présent, la méthode correspondante est la méthode main.

    Ceci est lié au fait que dans mon projet, après les phases de débug, il y a beaucoup de modifications dans le code, donc il faut récupérer le code impacté à partir du repository ClearCase.

    Mon souci, par exemple, est qu'on a que le numéro de la ligne modifiée dans la classe et donc, je souhaiterais récupérer le nom de la méthode pour la marquer dans le graphe, lequel représente les dépendances de méthodes.

    J'espère que mon problème est suffisamment clair.

    Quelqu'un saurait-il me dire si c'est faisable et comment ?

    Merci d'avance pour votre aide.

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Alors pour récupérer la méthode qui contient la sélection courante de l'utilisateur, tu peux utiliser le bout de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    // On récupère l'éditeur actif:
    IEditorPart activeEditor = activePage.getActiveEditor();
    if (activeEditor instanceof CompilationUnitEditor) {
        // On récupère la sélection de l'utilisateur:
        ISelection selection = 
            ((CompilationUnitEditor) activeEditor).getSelectionProvider().getSelection();
        // On récupère l'élément racine à partir de l'input de l'éditeur.
        ITypeRoot root =
            JavaUI.getEditorInputTypeRoot(activeEditor.getEditorInput());
        if (selection instanceof ITextSelection) {
            try {
                IJavaElement element =
                    root.getElementAt(((ITextSelection) selection).getOffset());
                // element correspond à la méthode.
            } catch (JavaModelException e) {
                // Traitement de l'exception.
            }
        }
    }
    Tu peux ensuite faire les traitements que tu souhaites sur element qui correspond à la méthode (ce que tu peux tester en faisant un instanceof IMethod).
    Pour pouvoir faire fonctionner ce code, il te faut ajouter des dépendances à:
    • org.eclipse.jdt.ui
    • org.eclipse.jdt.core
    • org.eclipse.ui.workbench.texteditor
    • org.eclipse.ui.editors
    • org.eclipse.jface.text

    A mon sens, le mieux reste de faire un fragment de org.eclipse.jdt.ui.

    Voilà, à+
    Gueritarish

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Merci,
    Bon j'ai pas compris ca veut dire quoi la sélection de l'utilisateur c'est un texte ou quoi exactement moi j'ai besoin de recuperer la methode dans une classe a partir d'un numero de ligne.

  4. #4
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Même si j'ai mis la sélection de l'utilisateur au lieu du numéro de ligne, dans le code que j'ai donné, tu as la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IJavaElement element =
        root.getElementAt(((ITextSelection) selection).getOffset());
    Qu'est-ce qu'un offset sinon le déplacement dans le fichier correspondant à la sélection de l'utilisateur (ici) ??
    Tu as donc, juste à écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    // On récupère l'éditeur actif:
    IEditorPart activeEditor = activePage.getActiveEditor();
    if (activeEditor instanceof CompilationUnitEditor) {
        // On récupère l'élément racine à partir de l'input de l'éditeur.
        ITypeRoot root =
            JavaUI.getEditorInputTypeRoot(activeEditor.getEditorInput());
        try {
            IJavaElement element = root.getElementAt(lineNumber);
            // element correspond à la méthode.
        } catch (JavaModelException e) {
            // Traitement de l'exception.
        }
    }
    }
    Et lineNumber correspond au numéro de ligne

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre réponse.
    J'ai essayé de l'exécuter dans mon application RCP, il me donne une exception sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    Je crois que votre code récupère la méthode dans la même classe où il y a le code. Mon cas c'est analyser un autre projet pour récupérer les méthodes changés dans les tests.

    merci

  6. #6
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Pour reprendre ton exemple, avec un projet qui s'appelle "MyProject" et une classe MyClass se situant dans le package com.my.fooPackage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
    if (root != null) {
        // On récupère le projet par son nom:
        final IProject project = root.getProject("MyProject");
        try {
            IResource javaElement = project.findMember(new Path("src/com/my/fooPackage/MyClass.java"));
            IJavaElement element =
                (IJavaElement) javaElement.getAdapter(IJavaElement.class);
            if (element instanceof ICompilationUnit) {
                final int lineOffset = 6;
                int offset =
                    getOffsetCorrespondingToLineNumber(lineOffset, (ICompilationUnit) element);
                IJavaElement methodElement = ((ICompilationUnit) element).getElementAt(offset);
            }
        } catch (JavaModelException jme) {
            // Gestion des exceptions.
        }
    }
    methodElement est un IJavaElement qui contiendra la méthode que tu cherches.

    Voici la méthode qui permet de récupérer l'offset dans le fichier à partir du numéro de ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        /**
         * Get the offset corresponding to the given line number.
         * @param aLineOffset a line number offset.
         * @param aCompilationUnit the compilation unit to use.
         * @return the offset.
         * @throws JavaModelException if an error occurs.
         */
        private int getOffsetCorrespondingToLineNumber(final int aLineOffset,
            final ICompilationUnit aCompilationUnit) throws JavaModelException {
            int offset = 0;
            final IBuffer buffer = aCompilationUnit.getBuffer();
            int i = 0;
            int lineNumber = 0;
            char ch = buffer.getChar(i);
            while (lineNumber < aLineOffset) {
                while (!IndentManipulation.isLineDelimiterChar(ch)) {
                    ch = buffer.getChar(++i);
                }
                // On lit les caractères de délimitation de ligne
                buffer.getChar(++i);
                ch = buffer.getChar(++i);
                lineNumber++;
            }
            offset = i;
            return offset;
        }
    Voilà, à+
    Gueritarish

    P.S.: tu peux m'envoyer ta paye pour avoir fait ton boulot à ta place

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Maintenant ca marche bien.
    Merci bcp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le numéro de ligne d'une cellule à partir d'une autre
    Par adknou dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/06/2014, 16h50
  2. [XL-2003] Récupérer une date à partir du numéro de semaine
    Par tarnx dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/03/2011, 01h32
  3. Réponses: 3
    Dernier message: 20/06/2007, 17h12
  4. Méthode donnant le numéro de ligne d'un Memo contenant un texte
    Par kilinette dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/06/2004, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo