diff --git a/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImportRecord.java b/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImportRecord.java index 0df029f4f..f82699dd4 100644 --- a/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImportRecord.java +++ b/archunit/src/main/java/com/tngtech/archunit/core/importer/ClassFileImportRecord.java @@ -264,7 +264,7 @@ void forEachRawMethodCallRecord(Consumer doWithRecord) { } void forEachRawConstructorCallRecord(Consumer doWithRecord) { - resolveSyntheticOrigins(rawConstructorCallRecords, COPY_RAW_ACCESS_RECORD, syntheticLambdaAccessRecorder) + resolveSyntheticOrigins(rawConstructorCallRecords, COPY_RAW_ACCESS_RECORD, syntheticPrivateAccessRecorder, syntheticLambdaAccessRecorder) .forEach(doWithRecord); } diff --git a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterSyntheticPrivateAccessesTest.java b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterSyntheticPrivateAccessesTest.java index 9ff4fc9c5..781e53bd7 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterSyntheticPrivateAccessesTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/importer/ClassFileImporterSyntheticPrivateAccessesTest.java @@ -5,6 +5,7 @@ import com.tngtech.archunit.core.domain.JavaAccess; import com.tngtech.archunit.core.domain.JavaClass; +import com.tngtech.archunit.core.domain.JavaFieldAccess; import org.junit.Test; import static com.tngtech.archunit.core.domain.JavaConstructor.CONSTRUCTOR_NAME; @@ -12,6 +13,7 @@ import static com.tngtech.archunit.core.domain.JavaFieldAccess.AccessType.SET; import static com.tngtech.archunit.testutil.Assertions.assertThatAccesses; import static com.tngtech.archunit.testutil.Assertions.expectedAccess; +import static com.tngtech.archunit.testutil.assertion.AccessesAssertion.access; import static java.util.stream.Collectors.toSet; public class ClassFileImporterSyntheticPrivateAccessesTest { @@ -422,6 +424,40 @@ Supplier fieldAccesses = new ClassFileImporter().importClasses(Outer.class, Outer.Inner.class) + .get(Outer.Inner.class) + .getFieldAccessesFromSelf(); + + assertThatAccesses(fieldAccesses) + .contain(access() + .fromOrigin(Outer.Inner.class, "stringConcat") + .toTarget(Outer.class, "outerPrivateString") + .withAccessType(GET)) + .contain(access() + .fromOrigin(Outer.Inner.class, "stringConcat") + .toTarget(Outer.class, "outerPrivateString") + .withAccessType(SET)); + } + @SuppressWarnings("OptionalGetWithoutIsPresent") private Set> importRelevantAccesses(Class origin, Class target) { return new ClassFileImporter().importClasses(origin, target).get(origin).getMethods().stream() diff --git a/archunit/src/test/java/com/tngtech/archunit/testutil/assertion/AccessesAssertion.java b/archunit/src/test/java/com/tngtech/archunit/testutil/assertion/AccessesAssertion.java index 35c628402..3e1dfc88f 100644 --- a/archunit/src/test/java/com/tngtech/archunit/testutil/assertion/AccessesAssertion.java +++ b/archunit/src/test/java/com/tngtech/archunit/testutil/assertion/AccessesAssertion.java @@ -7,6 +7,8 @@ import com.tngtech.archunit.base.DescribedPredicate; import com.tngtech.archunit.core.domain.JavaAccess; +import com.tngtech.archunit.core.domain.JavaFieldAccess; +import com.tngtech.archunit.core.domain.JavaFieldAccess.AccessType; import org.assertj.core.api.Condition; import static org.assertj.core.api.Assertions.assertThat; @@ -35,7 +37,9 @@ public final AccessesAssertion containOnly(Condition>... c } assertThat(actualRemaining).as("Unexpected " + JavaAccess.class.getSimpleName()).isEmpty(); return this; - }public static AccessCondition access() { + } + + public static AccessCondition access() { return new AccessCondition(); } @@ -69,6 +73,15 @@ public AccessCondition toTarget(Class owner, String name) { .as("%s to target %s.%s", predicate.getDescription(), owner.getName(), name)); } + public Condition> withAccessType(AccessType accessType) { + DescribedPredicate> withAccessType = DescribedPredicate.describe("", access -> + access instanceof JavaFieldAccess + && ((JavaFieldAccess) access).getAccessType().equals(accessType)); + return new AccessCondition( + predicate.and(withAccessType) + .as("%s with access type %s", predicate.getDescription(), accessType)); + } + public AccessCondition declaredInLambda() { return new AccessCondition( predicate.and(DescribedPredicate.describe("", JavaAccess::isDeclaredInLambda))