Re: [Codenarc-user] Running rules which require compilerPhase > Phases.CONVERSION using Gradle's Co
Brought to you by:
chrismair
From: Marcin E. <mar...@pr...> - 2017-03-08 07:56:39
|
Thanks for your response, Chris. It's good to understand that using the context classloader when compiling analysed code is not a conscious design decision but just the way it works at the moment. I will do some more digging around on Friday which is my OSS day at work. I will check what the context classloader is set to when the extended rules are tested within CodeNarc's test suite and investigate if specifying a classpath to be used for the context classloader as part of CodeNarc's ant task is an option and how we would deal with that backwards incompatible change in Gradle's CodeNarc plugin. Cheers, Marcin On Wed, 8 Mar 2017 at 02:32, Chris Mair <cm...@gm...> wrote: > Ugh. Sorry for the delayed response. I wasn't sure how to respond, and I > was hoping that maybe someone else might have some useful input. > > I am not very familiar with the internals of the Gradle CodeNarc plugin, > so I'm not sure what to suggest from that side. > > I am not philosophically opposed to changing the CodeNarc classloader, but > I am nervous about unintended consequences. Support for the "enhanced" > rules was a later addition, and presumably less used, though I'm still > surprised no one else has complained about this. > > On Fri, Mar 3, 2017 at 8:39 AM, Marcin Erdmann <mar...@pr...> > wrote: > > Hi, > > I wrote a custom rule which requires SEMANTIC_ANALYSIS compiler phase and > I'm trying to run it using Gradle. Unfortunately I'm getting compilation > errors upon analysis telling me that compiler cannot load any of the > classes imported by the analysed code, even though I checked and they are > available in the codenarc configuration of my project which is added by > Gradle's CodeNarc plugin and used to load CodeNarc classes, see: > > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/code-quality/src/main/groovy/org/gradle/api/plugins/quality/CodeNarcPlugin.java#L72 > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/code-quality/src/main/groovy/org/gradle/api/plugins/quality/CodeNarcPlugin.java#L89 > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/code-quality/src/main/groovy/org/gradle/api/plugins/quality/CodeNarc.java#L104 > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/code-quality/src/main/groovy/org/gradle/api/plugins/quality/internal/CodeNarcInvoker.groovy#L45 > > I then dug around and realised that when CodeNarc compiles analysed code > it uses the context class loader, see: > - > https://github.com/CodeNarc/CodeNarc/blob/v0.26.0/src/main/groovy/org/codenarc/source/AbstractSourceCode.groovy#L88 > - > https://github.com/groovy/groovy-core/blob/GROOVY_2_1_8/src/main/org/codehaus/groovy/control/CompilationUnit.java#L94 > > https://github.com/groovy/groovy-core/blob/GROOVY_2_1_8/src/main/org/codehaus/groovy/control/CompilationUnit.java#L136 > - > https://github.com/groovy/groovy-core/blob/GROOVY_2_1_8/src/main/org/codehaus/groovy/control/ProcessingUnit.java#L64 > - > https://github.com/groovy/groovy-core/blob/GROOVY_2_1_8/src/main/org/codehaus/groovy/control/ProcessingUnit.java#L103 > > And I finally realised that Gradle's BasicAntBuilder replaces the context > class loader to only contain Ant classes which means that not even Groovy > classes are available on the compilation classpath when CodeNarc compiles > the analysed code: > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/code-quality/src/main/groovy/org/gradle/api/plugins/quality/internal/CodeNarcInvoker.groovy#L45 > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/core/src/main/java/org/gradle/api/internal/project/antbuilder/DefaultIsolatedAntBuilder.java#L151 > - > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/core/src/main/java/org/gradle/api/internal/project/ant/BasicAntBuilder.java#L76 > > Given the above, here are my questions: > > 1. Has anybody ever managed to get their projects set up correctly and get > violations for one of the built-in CodeNarc Enhanced Classpath Rules, > e.g. CloneWithoutCloneable? If that's the case can they please explain how > they achieved it? If one is to believe comments in Gradle's codebase (e.g. > https://github.com/gradle/gradle/blob/v3.3.0/subprojects/core/src/main/java/org/gradle/api/internal/project/antbuilder/DefaultIsolatedAntBuilder.java#L140) > then it looks like a similar problem to the one occurring when using Gradle > would occur when using Ant. > > 2. Is there a reason for CodeNarc to use the context class loader instead > of the class loader that loaded CodeNarc when compiling the analysed code? > Given that it is a breaking change, would a PR changing that class loader > to the one which loaded CodeNarc be a valid option? It is a breaking change > but I don't see a reason why somebody would depend on current behaviour as > it actually prevents usage of Enhanced Classpath Rules. Or should I look > into changing Gradle's CodeNarc plugin to set the context class loader as > per CodeNarc's expectations? > > Cheers, > Marcin > > > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, SlashDot.org! http://sdm.link/slashdot > _______________________________________________ > Codenarc-user mailing list > Cod...@li... > https://lists.sourceforge.net/lists/listinfo/codenarc-user > > > |