Warn when certain constructor is used
Pietro Paolini
Pietro.Paolini at alfasystems.com
Thu May 31 11:21:56 UTC 2018
Hi Maurizio,
I got stuck but I feel I am not that far from it, I have taken bits and pieces from here http://scg.unibe.ch/archive/projects/Erni08b.pdf - that is somewhat different from
What I want to do, namely it wants to re-write part of the AST while I just want to scan it to print some diagnostic info.
I realize my usages of the term AST may be improper, is that the *actual* AST the parser generated ?
@SupportedAnnotationTypes("*")
class LocalDateUtilDate extends TreeScanner {
@Override
public Object visitNewClass(NewClassTree newClassTree, Object o) {
processingEnvironment.getMessager().printMessage(Diagnostic.Kind.WARNING, "You should not be using ...");
return super.visitNewClass(newClassTree, o);
}
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!roundEnv.processingOver()) {
Set<? extends Element> elements = roundEnv.getRootElements();
for (Element element : elements) {
if (element.getKind() == ElementKind.CLASS) {
JCTree tree = (JCTree) trees.getTree(element);
tree.accept(new LocalDateUtilDate());
}
System.out.println(element);
}
}
return false;
}
JCTree tree = (JCTree) trees.getTree(element);
tree.accept(new LocalDateUtilDate());
This bit does not compile as I am probably using the API badly, what do I need to do to get my scanner "scanning" :-) ?
Thanks,
P.
> -----Original Message-----
> From: Maurizio Cimadamore [mailto:maurizio.cimadamore at oracle.com]
> Sent: 31 May 2018 11:32
> To: Pietro Paolini; compiler-dev at openjdk.java.net
> Subject: Re: Warn when certain constructor is used
>
> Hi Pietro,
> I believe the compiler tree API is what you want (I'm giving you JDK 7
> API links, since your link seems to be referring to JDK 7, but these API
> points are available in later releases as well, of course):
>
> https://docs.oracle.com/javase/7/docs/jdk/api/javac/tree/index.html
>
> More specifically, if you are writing an annotation processor, the
> compiler tree API allows you to retrieve a Tree objects for a given Element:
>
> https://docs.oracle.com/javase/7/docs/jdk/api/javac/tree/com/sun/source/ut
> il/Trees.html
>
> After which, you can define a visitor which detects the constructor
> calls you are interested in. For the visitor look here:
>
> https://docs.oracle.com/javase/7/docs/jdk/api/javac/tree/com/sun/source/ut
> il/TreeScanner.html
>
> there's a scan method for every tree node, I think you want to override
> visitNewClass:
>
> https://docs.oracle.com/javase/7/docs/jdk/api/javac/tree/com/sun/source/ut
> il/TreeScanner.html#visitNewClass(com.sun.source.tree.NewClassTree,%20P)
>
> As for generating diagnostics, you can do that by using the Messager
> interface which is part of the annotation processing API:
>
> https://docs.oracle.com/javase/7/docs/api/javax/annotation/processing/Mes
> sager.html
>
> you obtain one of these from the ProcessingEnvironment object you get at
> the start of anno processing - see
>
> https://docs.oracle.com/javase/7/docs/api/javax/annotation/processing/Proc
> essor.html#init(javax.annotation.processing.ProcessingEnvironment)
>
>
> I think these pointers should be enough to get started, feel free to
> reach out if you get stuck.
>
> Maurizio
>
>
> On 31/05/18 10:05, Pietro Paolini wrote:
> > Hi all,
> >
> > I am not sure the question is appropriate for compiler-dev but I would like
> to give it a try anyway.
> >
> > I would like to detect when a certain class's constructor is used and log its
> usage along with filename and line number somewhere, such as a log file or
> standard output, I can't use an IDE to do that as I am working on a fairly large
> codebase and I need to automate the process, moreover it seems like an
> interesting problem to solve.
> >
> > https://docs.oracle.com/javase/7/docs/api/javax/tools/JavaCompiler.html
> >
> > I was hoping that could help me but I haven't spot anything as yet, even
> though I must admit that my knowledge on the matter is limited.
> >
> > Thanks,
> > Pietro
> >
> >
> > Pietro Paolini
> > Consultant
> >
> > Alfa
> > ________________________________
> > e: pietro.paolini at alfasystems.com | w:
> alfasystems.com<https://www.alfasystems.com>
> > t: +44 (0) 20 7920-2643 | Moor Place, 1 Fore Street Avenue, London, EC2Y
> 9DT, GB
> > ________________________________
> >
> > The contents of this communication are not intended to be binding or
> constitute any form of offer or acceptance or give rise to any legal obligations
> on behalf of the sender or Alfa. The views or opinions expressed represent
> those of the author and not necessarily those of Alfa. This email and any
> attachments are strictly confidential and are intended solely for use by the
> individual or entity to whom it is addressed. If you are not the addressee (or
> responsible for delivery of the message to the addressee) you may not copy,
> forward, disclose or use any part of the message or its attachments. At
> present the integrity of email across the internet cannot be guaranteed and
> messages sent via this medium are potentially at risk. All liability is excluded
> to the extent permitted by law for any claims arising as a result of the use of
> this medium to transmit information by or to Alfa or its affiliates.
> >
> > Alfa Financial Software Ltd
> > Reg. in England No: 0248 2325
More information about the compiler-dev
mailing list