INRIA SPOON INNER METHODS CALLING CONSTRUCTORS

85 Views Asked by At

I am trying to extract the calls from the method run() to the constructors. Here is the code I am trying to parse

        SwingUtilities.invokeLater(new Runnable() {
        public void run() {

            // Create the two text areas
            TextAreaFigure ta = new TextAreaFigure();
            ta.setBounds(new Point2D.Double(10,10),new Point2D.Double(100,100));

            TextAreaFigure tb = new TextAreaFigure();
            tb.setBounds(new Point2D.Double(210,110),new Point2D.Double(300,200));

            // Create an elbow connection
            ConnectionFigure cf = new LineConnectionFigure();
            cf.setLiner(new ElbowLiner());

            // Connect the figures
            cf.setStartConnector(ta.findConnector(Geom.center(ta.getBounds()), cf));
            cf.setEndConnector(tb.findConnector(Geom.center(tb.getBounds()), cf));

            // Add all figures to a drawing
            Drawing drawing = new DefaultDrawing();
            drawing.add(ta);
            drawing.add(tb);
            drawing.add(cf);

            // Show the drawing
            JFrame f = new JFrame("My Drawing");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(400,300);

            DrawingView view = new DefaultDrawingView();
            view.setDrawing(drawing);
            f.getContentPane().add(view.getComponent());

            f.setVisible(true);
        }
    });
}

Here is the code I am using to extract the calls from method run() to the constructors. The problem that I have is that the last line: String constructorClassName= cons.getExecutable().getDeclaringType().toString(); is returning the wrong class name, instead of getting "jhot.draw.TextAreaFigure()" as the name I am getting "jhot.mini.samples.TextAreaFigure()". The file that I am parsing is located under "jhot.mini.samples" while the constructor is declared within "jhot.draw.TextAreaFigure()". I am not sure if this is a bug in spoon or if I am using the wrong API to retrieve the constructor calls.

   for(CtMethod<?> method :clazz.getMethods()) {
    List<CtConstructorCall> ctNewClasses = method.getElements(new TypeFilter<CtConstructorCall>(CtConstructorCall.class));

    for( CtConstructorCall myclass: ctNewClasses) {
        //CONSTRUCTOR 

        if(myclass instanceof CtConstructorCall<?>) {
            System.out.println("yes");
            List<CtMethod> methoddeclared = myclass.getElements(new TypeFilter<CtMethod>(CtMethod.class)); 
            for(CtMethod<?> meth: methoddeclared) {
                 methodinside=meth.getSignature(); 
                 methodinsideclass=clazz.getQualifiedName(); 

                String mymethod=methodinsideclass+"."+methodinside; 



                ResultSet methodsinside = st.executeQuery("SELECT methods.* from methods where methods.fullmethod='"+mymethod+"'"); 
                //while(callingmethodsrefined.next()){
                if(methodsinside.next()) {
                     MethodIDINSIDE = methodsinside.getString("id"); 
                     CLASSNAMEINSIDE = methodsinside.getString("classname"); 
                     CLASSIDINSIDE = methodsinside.getString("classid"); 

                    //System.out.println("CALLEE METHOD ID: "+ CALLEEID);
                }

                        List<CtConstructorCall> constructors = meth.getElements(new TypeFilter<CtConstructorCall>(CtConstructorCall.class)); 
                        for(CtConstructorCall<?> cons: constructors) {  



                            String constructorClassName=    cons.getExecutable().getDeclaringType().toString(); 




                }
                        }
                    }

        }
1

There are 1 best solutions below

1
On

I am not sure if this is a bug in spoon or if I am using the wrong API to retrieve the constructor calls.

I'm one of the contributor of Spoon. It looks to me that you're using the right API, but I'm not sure because your example looks a bit messy here. I think it would be easier if you open an issue on Spoon Github repository and specify:

  1. the project you're working on if it's open-source
  2. how you launch Spoon (the version of Spoon, arguments, etc)
  3. what do you expect exactly

Then we could investigate to check exactly what happens there. Thanks!