Re: [Codenarc-user] Writing CodeNarc rules
Brought to you by:
chrismair
|
From: Hamlet D'A. <ham...@gm...> - 2016-09-15 11:55:50
|
Sounds like you're looking for AstUtils.classNodeImplementsType :)
/**
* This method tells you if a ClassNode implements or extends a certain
class.
* @param node
* the node
* @param target
* the class
* @return
* true if the class node 'is a' target
*/
On Thu, Sep 15, 2016 at 12:14 AM, <AGo...@cf...> wrote:
> Thanks to the advice here I have made some good progress. I have a rule
> that is doing pretty much what I want, but I would like to add one more
> thing that is giving me trouble.
>
> I have the TryCatchStatement, and from there I can get the CatchStatement
> list. For each CatchStatement I can get the ClassNode for the exception
> type and from there I can check the ClassNode name to see if what is being
> caught is an Exception.
>
> I would like to go the extra step and confirm that the CatchStatement is
> catching a java.lang.Exception and not just a Throwable someone decided to
> name Exception. Is that possible?
>
> I could add another rule that makes sure none of the compiled code names a
> class "Exception", but it seems like I should be able to check the package
> of the class being caught. If someone writes their own java.lang.Exception
> class then I think we have gone beyond my scope, but there are definitely
> names that get reused across packages and this appears to be an important
> capability.
>
> Thanks!
>
> -Andrew Goodspeed
>
>
>
> From: Andy Goodspeed/IS/CFG
> To: cod...@li...
> Date: 09/06/2016 06:32 PM
> Subject: Re: [Codenarc-user] Writing CodeNarc rules
> ------------------------------
>
>
> Thanks Hamlet! That should be very helpful. Thanks also to Chris Mair who
> had some helpful suggestions.
>
> I will hope to get a chance to try them both out; still digging out after
> a week off. Once I get back to this I will report back.
>
> Thanks again!
>
> -Andrew Goodspeed
>
>
>
>
> From: "Hamlet D'Arcy" <ham...@gm...>
> To: AGo...@cf...
> Cc: cod...@li...
> Date: 09/01/2016 09:24 AM
> Subject: Re: [Codenarc-user] Writing CodeNarc rules
> ------------------------------
>
>
>
> Not sure if you ever got an answer to this...
>
> Here is the latest Javadoc for MethodNode:
> *http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/ast/MethodNode.html*
> <http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/ast/MethodNode.html>
>
> A MethodNode only ever has one Statement! so if your Method has only a
> TryCatchStatement then you know nothing follows it.
> If your method has-a BlockStatement then your method will be several
> statements long.
>
> The best way to explore is to write more unit tests and just look and see
> what is in the AST!
>
> On Thu, Aug 18, 2016 at 9:18 PM, <*AGo...@cf...*
> <AGo...@cf...>> wrote:
> Hello all.
>
> I am trying to write a CodeNarc rule and am struggling with just how to
> use the AST code visitor support (or anything else) to get were I want to
> go. Does anyone know of a resource that might be helpful and/or give me
> some firsthand assistance? I have looked at all of the obvious ones from
> the CodeNarc site as well as the distributed rules, google searches, etc.
>
> I am trying to write a rule that checks to make sure the body of
> particular methods consists entirely of a try/catch block where Exception
> is caught. I have gotten as far as verifying the first statement in the
> method is a try/catch statement using an AbstractMethodVisitor but am
> struggling a bit in figuring out how to make sure there is no statement
> following it in the method.
>
> This is where I am on my astVisitorClass.
>
> *class*MyTestAstVisitor *extends*AbstractMethodVisitor {
> @Override
> *void*visitMethod(MethodNode methodNode) {
> *if*(Modifier.*isPublic*(methodNode.modifiers)) {
> *if*(AstUtil.*isEmptyBlock*(methodNode.code)) {
> addViolation(methodNode, "Action ${methodNode.name} in ${
> currentClassName} is empty")
> } *else*{
> *def*tryCatchStatement = methodNode.firstStatement
> *if*(!(tryCatchStatement *instanceof*TryCatchStatement)) {
> addViolation(methodNode, "First statement of action
> ${methodNode.name} in ${currentClassName} is ${tryCatchStatement.class.
> name}")
> } *else*{
> // try/catch statement, but nothing more?
> }
> }
> }
> }
> }
>
> I am running with CodeNarc 0.22 and Grails 2.2.4/Groovy 2.0.8.
>
> Thanks for any insight.
>
> -Andrew Goodspeed
> NOTICE: This message and all attachments transmitted with it may contain
> sensitive and/or confidential information intended solely for the use of
> the addressee. If the reader of this message is not the intended recipient,
> you are hereby notified that any reading, dissemination, distribution,
> copying, or other use of this message or its attachments is strictly
> prohibited. If you have received this message in error, please notify the
> sender immediately and delete this message and all copies and backups
> thereof. If you choose to communicate with us by email, you should be aware
> that the security of incoming Internet email is not secure. We strongly
> encourage you to use encrypted email when sending sensitive and/or
> confidential information. By sending sensitive or confidential email
> messages that are not encrypted, you accept the risks of such lack of
> security and possible lack of confidentiality. If you elect to communicate
> from your workplace computer, you also should be aware that your employer
> and its agents have access to email communications between you and us.
>
> ------------------------------------------------------------
> ------------------
>
> _______________________________________________
> Codenarc-user mailing list
> *Cod...@li...*
> <Cod...@li...>
> *https://lists.sourceforge.net/lists/listinfo/codenarc-user*
> <https://lists.sourceforge.net/lists/listinfo/codenarc-user>
>
>
>
>
> --
> Hamlet D'Arcy
> *ham...@gm...* <ham...@gm...>-----------
> -------------------------------------------------------------------
> _______________________________________________
> Codenarc-user mailing list
> Cod...@li...
> https://lists.sourceforge.net/lists/listinfo/codenarc-user
>
>
> NOTICE: This message and all attachments transmitted with it may contain
> sensitive and/or confidential information intended solely for the use of
> the addressee. If the reader of this message is not the intended recipient,
> you are hereby notified that any reading, dissemination, distribution,
> copying, or other use of this message or its attachments is strictly
> prohibited. If you have received this message in error, please notify the
> sender immediately and delete this message and all copies and backups
> thereof. If you choose to communicate with us by email, you should be aware
> that the security of incoming Internet email is not secure. We strongly
> encourage you to use encrypted email when sending sensitive and/or
> confidential information. By sending sensitive or confidential email
> messages that are not encrypted, you accept the risks of such lack of
> security and possible lack of confidentiality. If you elect to communicate
> from your workplace computer, you also should be aware that your employer
> and its agents have access to email communications between you and us.
>
> ------------------------------------------------------------
> ------------------
>
> _______________________________________________
> Codenarc-user mailing list
> Cod...@li...
> https://lists.sourceforge.net/lists/listinfo/codenarc-user
>
>
--
Hamlet D'Arcy
ham...@gm...
|