Skip to content

Commit

Permalink
Interpret pluginManagement before plugins in settings
Browse files Browse the repository at this point in the history
  • Loading branch information
h0tk3y committed Mar 4, 2024
1 parent 724a103 commit 7ca05a0
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2023 the original author or authors.
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -14,7 +14,7 @@
* limitations under the License.
*/

package org.gradle.internal.declarativedsl
package org.gradle.internal.declarativedsl.settings


import org.gradle.integtests.fixtures.AbstractIntegrationSpec
Expand Down Expand Up @@ -85,4 +85,71 @@ class DeclarativeDslProjectSettingsIntegrationSpec extends AbstractIntegrationSp
"language feature" | "@A dependencies { }" | "2:13: unsupported language feature: AnnotationUsage"
"semantic" | "x = 1" | "2:13: unresolved reference 'x'"
}

def 'can apply settings plugins'() {
given:
file("included-settings-plugin/build.gradle") << """
plugins {
id('java-gradle-plugin')
}
gradlePlugin {
plugins {
create("settingsPlugin") {
id = "com.example.restricted.settings"
implementationClass = "com.example.restricted.RestrictedSettingsPlugin"
}
}
}
"""

file("included-settings-plugin/src/main/java/com/example/restricted/Extension.java") << """
package com.example.restricted;
import org.gradle.declarative.dsl.model.annotations.Restricted;
import org.gradle.api.provider.Property;
import javax.inject.Inject;
@Restricted
public abstract class Extension {
@Restricted
public abstract Property<String> getId();
}
"""

file("included-settings-plugin/src/main/java/com/example/restricted/RestrictedSettingsPlugin.java") << """
package com.example.restricted;
import org.gradle.api.Plugin;
import org.gradle.api.initialization.Settings;
public class RestrictedSettingsPlugin implements Plugin<Settings> {
@Override
public void apply(Settings target) {
Extension restricted = target.getExtensions().create("restricted", Extension.class);
target.getGradle().settingsEvaluated(settings -> {
System.out.println("id = " + restricted.getId().get());
});
}
}
"""

file("settings.gradle.something") << """
pluginManagement {
includeBuild("included-settings-plugin")
}
plugins {
id("com.example.restricted.settings")
}
restricted {
id = "test"
}
"""

expect:
succeeds("help")
outputContains("id = test")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,20 @@ import org.gradle.api.initialization.Settings
import org.gradle.api.internal.SettingsInternal
import org.gradle.api.internal.initialization.ClassLoaderScope
import org.gradle.groovy.scripts.ScriptSource
import org.gradle.internal.declarativedsl.analysis.analyzeEverything
import org.gradle.internal.declarativedsl.analysis.AnalysisStatementFilter
import org.gradle.internal.declarativedsl.analysis.AnalysisStatementFilter.Companion.isCallNamed
import org.gradle.internal.declarativedsl.analysis.AnalysisStatementFilter.Companion.isConfiguringCall
import org.gradle.internal.declarativedsl.analysis.AnalysisStatementFilter.Companion.isTopLevelElement
import org.gradle.internal.declarativedsl.analysis.and
import org.gradle.internal.declarativedsl.analysis.implies
import org.gradle.internal.declarativedsl.analysis.not
import org.gradle.internal.declarativedsl.evaluationSchema.EvaluationSchema
import org.gradle.internal.declarativedsl.evaluationSchema.InterpretationSequence
import org.gradle.internal.declarativedsl.evaluationSchema.SimpleInterpretationSequenceStep
import org.gradle.internal.declarativedsl.evaluationSchema.buildEvaluationSchema
import org.gradle.internal.declarativedsl.evaluationSchema.plus
import org.gradle.internal.declarativedsl.plugins.PluginsInterpretationSequenceStep
import org.gradle.internal.declarativedsl.plugins.isTopLevelPluginsBlock
import org.gradle.internal.declarativedsl.project.ThirdPartyExtensionsComponent
import org.gradle.internal.declarativedsl.project.gradleDslGeneralSchemaComponent

Expand All @@ -39,16 +46,34 @@ fun settingsInterpretationSequence(
): InterpretationSequence =
InterpretationSequence(
listOf(
SimpleInterpretationSequenceStep("settingsPluginManagement", settings) { pluginManagementEvaluationSchema() },
PluginsInterpretationSequenceStep("settingsPlugins", settings, targetScope, scriptSource) { it.services },
SimpleInterpretationSequenceStep("settings", settings) { settingsEvaluationSchema(settings) }
)
)


internal
fun pluginManagementEvaluationSchema(): EvaluationSchema =
buildEvaluationSchema(Settings::class, gradleDslGeneralSchemaComponent(), isTopLevelPluginManagementBlock)


internal
fun settingsEvaluationSchema(settings: Settings): EvaluationSchema {
val schemaBuildingComponent = gradleDslGeneralSchemaComponent() +
ThirdPartyExtensionsComponent(Settings::class, settings, "settingsExtension")

return buildEvaluationSchema(Settings::class, schemaBuildingComponent, analyzeEverything)
return buildEvaluationSchema(Settings::class, schemaBuildingComponent, ignoreTopLevelPluginsAndPluginManagement)
}


private
val isPluginManagementCall: AnalysisStatementFilter = isConfiguringCall.and(isCallNamed("pluginManagement"))


private
val isTopLevelPluginManagementBlock = isTopLevelElement.implies(isPluginManagementCall)


private
val ignoreTopLevelPluginsAndPluginManagement = isTopLevelElement.implies(isPluginManagementCall.not().and(isTopLevelPluginsBlock.not()))

0 comments on commit 7ca05a0

Please sign in to comment.