diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsExtension.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsExtension.groovy index c216885913d..40b133e083d 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsExtension.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsExtension.groovy @@ -44,6 +44,7 @@ class GrailsExtension { this.project = project this.pluginDefiner = new PluginDefiner(project) this.indy = project.objects.property(Boolean).convention(false) + this.preserveParameterNames = project.objects.property(Boolean).convention(true) } /** @@ -106,6 +107,11 @@ class GrailsExtension { this.indy.set(enabled) } + /** + * Keep class file parameter names so autowire by name can be supported without additional annotations such as '@Qualifier'. + */ + Property preserveParameterNames + DependencyHandler getPlugins() { if (pluginDefiner == null) { pluginDefiner = new PluginDefiner(project) diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy index c4a8af13e5d..8d01c9285b9 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy @@ -228,10 +228,17 @@ class GrailsGradlePlugin implements Plugin { // Configure indy and log status after evaluation so user's grails { } block has been applied GrailsExtension grailsExtension = project.extensions.findByType(GrailsExtension) project.afterEvaluate { - boolean indyEnabled = grailsExtension?.indy?.getOrElse(false) ?: false + boolean indyEnabled = grailsExtension.indy?.getOrElse(false) ?: false + Boolean preserveParameterNames = grailsExtension.preserveParameterNames?.getOrNull() + project.tasks.withType(GroovyCompile).configureEach { GroovyCompile c -> c.groovyOptions.optimizationOptions.indy = indyEnabled + + if (preserveParameterNames != null) { + c.groovyOptions.parameters = preserveParameterNames + } } + if (!indyEnabled) { project.logger.info('Grails: Groovy invokedynamic (indy) is disabled to improve performance (see issue #15293).') project.logger.info(' To enable invokedynamic: grails { indy = true } in build.gradle') @@ -490,7 +497,7 @@ ${importStatements} protected GrailsExtension registerGrailsExtension(Project project) { if (project.extensions.findByName('grails') == null) { - project.extensions.add('grails', new GrailsExtension(project)) + project.extensions.create('grails', GrailsExtension, project) } } diff --git a/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGradlePreserveParametersSpec.groovy b/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGradlePreserveParametersSpec.groovy new file mode 100644 index 00000000000..9da01c4c9de --- /dev/null +++ b/grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/core/GrailsGradlePreserveParametersSpec.groovy @@ -0,0 +1,49 @@ +package org.grails.gradle.plugin.core + +class GrailsGradlePreserveParametersSpec extends GradleSpecification { + + def "Grails extension is created with default preserveParameterNames = true"() { + given: + setupTestResourceProject('preserve-params-default') + + when: + def result = executeTask('inspectPreserveParam') + + then: + result.output.contains("HAS_PRESERVE_PARAM_ENABLED=true") + } + + def "preserveParameterNames can be configured to false via grails block"() { + given: + setupTestResourceProject('preserve-params-disabled') + + when: + def result = executeTask('inspectPreserveParam') + + then: + result.output.contains("HAS_PRESERVE_PARAM_ENABLED=false") + } + + def "preserveParameterNames is set to true when configured as explicit null"() { + given: + setupTestResourceProject('preserve-params-null') + + when: + def result = executeTask('inspectPreserveParam') + + then: + result.output.contains("HAS_PRESERVE_PARAM_ENABLED=true") + } + + def "GroovyCompile tasks get parameters = true when preserveParameterNames is enabled"() { + given: + setupTestResourceProject('preserve-params-enabled') + + when: + def result = executeTask('inspectPreserveParam') + + then: + result.output.contains("HAS_PRESERVE_PARAM_ENABLED=true") + } + +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/build.gradle new file mode 100644 index 00000000000..7a1ad930db1 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +tasks.register('inspectPreserveParam') { + doLast { + def compileTasks = tasks.withType(GroovyCompile) + def paramsEnabled = compileTasks.every { it.groovyOptions.parameters } + println "HAS_PRESERVE_PARAM_ENABLED=${paramsEnabled}" + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/settings.gradle new file mode 100644 index 00000000000..5c9b3b13f44 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-default/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-preserve-params-default' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/build.gradle new file mode 100644 index 00000000000..6f0bc7d0fe6 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +grails { + preserveParameterNames = false +} + +tasks.register('inspectPreserveParam') { + doLast { + def compileTasks = tasks.withType(GroovyCompile) + def paramsEnabled = compileTasks.every { it.groovyOptions.parameters } + println "HAS_PRESERVE_PARAM_ENABLED=${paramsEnabled}" + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/settings.gradle new file mode 100644 index 00000000000..4abc2d63994 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-disabled/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-preserve-params-disabled' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/build.gradle new file mode 100644 index 00000000000..499c5af8226 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +grails { + preserveParameterNames = true +} + +tasks.register('inspectPreserveParam') { + doLast { + def compileTasks = tasks.withType(GroovyCompile) + def paramsEnabled = compileTasks.every { it.groovyOptions.parameters } + println "HAS_PRESERVE_PARAM_ENABLED=${paramsEnabled}" + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/settings.gradle new file mode 100644 index 00000000000..03a5cd09a44 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-enabled/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-preserve-params-enabled' diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/build.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/build.gradle new file mode 100644 index 00000000000..23ea50210ef --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'org.apache.grails.gradle.grails-app' +} + +grails { + preserveParameterNames = null +} + +tasks.register('inspectPreserveParam') { + doLast { + def compileTasks = tasks.withType(GroovyCompile) + def paramsEnabled = compileTasks.every { it.groovyOptions.parameters } + println "HAS_PRESERVE_PARAM_ENABLED=${paramsEnabled}" + } +} diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/gradle.properties b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/gradle.properties new file mode 100644 index 00000000000..35c332fb874 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/gradle.properties @@ -0,0 +1 @@ +grailsVersion=__PROJECT_VERSION__ diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/grails-app/conf/application.yml b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/grails-app/conf/application.yml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/settings.gradle b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/settings.gradle new file mode 100644 index 00000000000..502a1a07911 --- /dev/null +++ b/grails-gradle/plugins/src/test/resources/test-projects/preserve-params-null/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'test-preserve-params-null'