Skip to content

Commit

Permalink
Revise changes to DefaultGenerationContext and GeneratedClasses
Browse files Browse the repository at this point in the history
In order to reduce the surface area of published APIs in the affected
classes, this commit:

- Reverts the changes made to GeneratedClasses in c354b10.

- Reverts the changes made to DefaultGenerationContext in a28ec3a.

- Makes the DefaultGenerationContext(DefaultGenerationContext, String)
  constructor protected.

- Reworks the internals of TestContextGenerationContext to align with
  the above changes.

See gh-30861
Closes gh-30895
Closes gh-30897
  • Loading branch information
sbrannen committed Jul 15, 2023
1 parent 3a278cc commit 2ba9939
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 31 deletions.
Expand Up @@ -78,7 +78,7 @@ public DefaultGenerationContext(ClassNameGenerator classNameGenerator, Generated
* @param generatedFiles the generated files
* @param runtimeHints the runtime hints
*/
protected DefaultGenerationContext(GeneratedClasses generatedClasses,
DefaultGenerationContext(GeneratedClasses generatedClasses,
GeneratedFiles generatedFiles, RuntimeHints runtimeHints) {

Assert.notNull(generatedClasses, "'generatedClasses' must not be null");
Expand All @@ -90,9 +90,18 @@ protected DefaultGenerationContext(GeneratedClasses generatedClasses,
this.runtimeHints = runtimeHints;
}

private DefaultGenerationContext(DefaultGenerationContext existing, String name) {
int sequence = existing.sequenceGenerator.computeIfAbsent(name, key -> new AtomicInteger()).getAndIncrement();
String featureName = (sequence > 0 ? name + sequence : name);
/**
* Create a new {@link DefaultGenerationContext} instance based on the
* supplied {@code existing} context and feature name.
* @param existing the existing context upon which to base the new one
* @param featureName the feature name to use
* @since 6.0.12
*/
protected DefaultGenerationContext(DefaultGenerationContext existing, String featureName) {
int sequence = existing.sequenceGenerator.computeIfAbsent(featureName, key -> new AtomicInteger()).getAndIncrement();
if (sequence > 0) {
featureName += sequence;
}
this.sequenceGenerator = existing.sequenceGenerator;
this.generatedClasses = existing.generatedClasses.withFeatureNamePrefix(featureName);
this.generatedFiles = existing.generatedFiles;
Expand Down
Expand Up @@ -176,19 +176,6 @@ public GeneratedClass addForFeatureComponent(String featureName,
return addForFeatureComponent(featureName, ClassName.get(targetComponent), type);
}

/**
* Create a new {@link GeneratedClasses} instance using the specified feature
* name prefix to qualify generated class names for a dedicated round of code
* generation.
* @param featureNamePrefix the feature name prefix to use
* @return a new instance for the specified feature name prefix
* @since 6.0.12
*/
public GeneratedClasses withFeatureNamePrefix(String featureNamePrefix) {
return new GeneratedClasses(this.classNameGenerator.withFeatureNamePrefix(featureNamePrefix),
this.classes, this.classesByOwner);
}

private GeneratedClass createAndAddGeneratedClass(String featureName,
@Nullable ClassName targetComponent, Consumer<TypeSpec.Builder> type) {

Expand All @@ -212,6 +199,18 @@ void writeTo(GeneratedFiles generatedFiles) {
}
}

/**
* Create a new {@link GeneratedClasses} instance using the specified feature
* name prefix to qualify generated class names for a dedicated round of code
* generation.
* @param featureNamePrefix the feature name prefix to use
* @return a new instance for the specified feature name prefix
*/
GeneratedClasses withFeatureNamePrefix(String featureNamePrefix) {
return new GeneratedClasses(this.classNameGenerator.withFeatureNamePrefix(featureNamePrefix),
this.classes, this.classesByOwner);
}

private record Owner(String featureNamePrefix, String featureName, @Nullable ClassName target) {
}

Expand Down
Expand Up @@ -18,7 +18,6 @@

import org.springframework.aot.generate.ClassNameGenerator;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GeneratedClasses;
import org.springframework.aot.generate.GeneratedFiles;
import org.springframework.aot.hint.RuntimeHints;

Expand Down Expand Up @@ -49,16 +48,13 @@ class TestContextGenerationContext extends DefaultGenerationContext {
}

/**
* Create a new {@link TestContextGenerationContext} instance backed by the
* specified {@link GeneratedClasses}, {@link GeneratedFiles}, and
* {@link RuntimeHints}.
* @param generatedClasses the generated classes
* @param generatedFiles the generated files
* @param runtimeHints the runtime hints
* Create a new {@link TestContextGenerationContext} instance based on the
* supplied {@code existing} context and feature name.
* @param existing the existing context upon which to base the new one
* @param featureName the feature name to use
*/
private TestContextGenerationContext(GeneratedClasses generatedClasses, GeneratedFiles generatedFiles,
RuntimeHints runtimeHints, String featureName) {
super(generatedClasses, generatedFiles, runtimeHints);
private TestContextGenerationContext(TestContextGenerationContext existing, String featureName) {
super(existing, featureName);
this.featureName = featureName;
}

Expand All @@ -67,8 +63,8 @@ private TestContextGenerationContext(GeneratedClasses generatedClasses, Generate
* Create a new {@link TestContextGenerationContext} instance using the specified
* feature name to qualify generated assets for a dedicated round of code generation.
* <p>If <em>this</em> {@code TestContextGenerationContext} has a configured feature
* name, the supplied feature name will be appended to the existing feature name
* in order to avoid naming collisions.
* name, the existing feature name will prepended to the supplied feature name in
* order to avoid naming collisions.
* @param featureName the feature name to use
* @return a specialized {@link TestContextGenerationContext} for the specified
* feature name
Expand All @@ -78,8 +74,7 @@ public TestContextGenerationContext withName(String featureName) {
if (this.featureName != null) {
featureName = this.featureName + featureName;
}
GeneratedClasses generatedClasses = getGeneratedClasses().withFeatureNamePrefix(featureName);
return new TestContextGenerationContext(generatedClasses, getGeneratedFiles(), getRuntimeHints(), featureName);
return new TestContextGenerationContext(this, featureName);
}

}

0 comments on commit 2ba9939

Please sign in to comment.