Warn when certain constructor is used

Pietro Paolini Pietro.Paolini at alfasystems.com
Thu May 31 21:25:41 UTC 2018


> https://docs.oracle.com/javase/7/docs/jdk/api/javac/tree/com/sun/source/ut
> il/Trees.html#getElement(com.sun.source.util.TreePath)

On what kind of object ? 

if (!roundEnv.processingOver()) {
            Set<? extends Element> elements = roundEnv.getRootElements();
            for (Element element : elements) {
                if (element.getKind() == ElementKind.CLASS) {
                    JCTree tree = (JCTree) trees.getTree(element).accept(new LocalDateUtilDate(), null);
                }

                System.out.println(element);
            }
        }

I haven't met any "TreePath" as yet.

> -----Original Message-----
> From: Maurizio Cimadamore [mailto:maurizio.cimadamore at oracle.com]
> Sent: 31 May 2018 15:45
> To: Pietro Paolini
> Cc: compiler-dev at openjdk.java.net
> Subject: Re: Warn when certain constructor is used
> 
> Try to call
> 
> https://docs.oracle.com/javase/7/docs/jdk/api/javac/tree/com/sun/source/ut
> il/Trees.html#getElement(com.sun.source.util.TreePath)
> 
> This should trigger attribution of the tree and give you the 'symbol'
> associated with the constructor. From there you can access the symbol
> signature using
> 
> https://docs.oracle.com/javase/7/docs/api/javax/lang/model/element/Eleme
> nt.html#asType()
> 
> And downcasting to this:
> 
> https://docs.oracle.com/javase/7/docs/api/javax/lang/model/type/Executable
> Type.html
> 
> If this works, good, otherwise the solution would be more cumbersome -
> and it will involve setting up a task listener. But try this first.
> 
> Maurizio
> 
> 
> On 31/05/18 13:19, Pietro Paolini wrote:
> > Hi Maurizio,
> >
> > Thanks a lot. I would have an additional, and hopefully last, question.
> >
> > I am getting the NewClassTree which seems to provide me access to the -
> forgive me the coarse wording of it -  the "token", namely the textual
> representation
> > of it, while I am mainly interested in the type.
> >
> > I am getting around it by comparing strings but I wonder if there is any way
> to get to the type of the expression :
> >
> > := new identifier ( arguments )
> >
> > What I have in my mind is to detect all instances in which the identifier has
> *type* A and the argument's  list is composed by a single *type* , let say B.
> That allows me to
> > print something:
> >
> > "Hey, constructor new A(B) has been detected"
> >
> > Thanks a lot for your help so far, really.
> >
> > Thanks,
> > P.
> >
> >
> >
> >
> >
> >> -----Original Message-----
> >> From: Maurizio Cimadamore [mailto:maurizio.cimadamore at oracle.com]
> >> Sent: 31 May 2018 12:45
> >> To: Pietro Paolini
> >> Cc: compiler-dev at openjdk.java.net
> >> Subject: Re: Warn when certain constructor is used
> >>
> >>
> >>
> >> On 31/05/18 12:21, Pietro Paolini wrote:
> >>> JCTree tree = (JCTree) trees.getTree(element);
> >>> tree.accept(new LocalDateUtilDate());
> >> There re two visitor methods in JCTree, one internal (used by javac),
> >> one external (used by the API). I don't think you need to cast down to
> >> JCTree (yet, at least). Just keep it as a com.sun.source.tree.Tree, and
> >> you will see that the only 'accept' method there takes two arguments: a
> >> visitor (which you have) and a visitor parameter; since you don't seem
> >> to need a visitor parameter, you can just pass 'null' as second parameter.
> >>
> >> Maurizio



More information about the compiler-dev mailing list