Skip to content

Commit a33d78c

Browse files
pvojtechovskysurli
authored andcommitted
fix: init RoleHandler lazily to pass when RoleHandler is generated (#2068)
1 parent ff213e7 commit a33d78c

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

src/main/java/spoon/metamodel/MetamodelProperty.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public class MetamodelProperty {
7474
*/
7575
private CtTypeReference<?> itemValueType;
7676

77-
private final RoleHandler roleHandler;
77+
private RoleHandler roleHandler;
7878

7979
private Boolean derived;
8080
private Boolean unsettable;
@@ -104,7 +104,6 @@ public class MetamodelProperty {
104104
this.name = name;
105105
this.role = role;
106106
this.ownerConcept = ownerConcept;
107-
roleHandler = RoleHandlerHelper.getRoleHandler((Class) ownerConcept.getMetamodelInterface().getActualClass(), role);
108107
}
109108

110109
void addMethod(CtMethod<?> method) {
@@ -580,22 +579,27 @@ private static ContainerKind containerKindOf(Class<?> valueClass) {
580579
* @return {@link RoleHandler} which can access runtime data of this Property
581580
*/
582581
public RoleHandler getRoleHandler() {
583-
return this.roleHandler;
582+
if (roleHandler == null) {
583+
//initialize it lazily, because CtGenerationTest#testGenerateRoleHandler needs metamodel to generate rolehandlers
584+
//and here it may happen that rolehandler doesn't exist yet
585+
roleHandler = RoleHandlerHelper.getRoleHandler((Class) ownerConcept.getMetamodelInterface().getActualClass(), role);
586+
}
587+
return roleHandler;
584588
}
585589

586590
/**
587591
* @param element an instance whose attribute value is read
588592
* @return a value of attribute defined by this {@link MetamodelProperty} from the provided `element`
589593
*/
590594
public <T, U> U getValue(T element) {
591-
return roleHandler.getValue(element);
595+
return getRoleHandler().getValue(element);
592596
}
593597

594598
/**
595599
* @param element an instance whose attribute value is set
596600
* @param value to be set value of attribute defined by this {@link MetamodelProperty} on the provided `element`
597601
*/
598602
public <T, U> void setValue(T element, U value) {
599-
roleHandler.setValue(element, value);
603+
getRoleHandler().setValue(element, value);
600604
}
601605
}

0 commit comments

Comments
 (0)