Bug 576983 - ClassCastException for Types#asMemberOf of a RecordComponent
Summary: ClassCastException for Types#asMemberOf of a RecordComponent
Status: NEW
Alias: None
Product: JDT
Classification: Eclipse Project
Component: APT (show other bugs)
Version: 4.22   Edit
Hardware: PC All
: P3 critical with 7 votes (vote)
Target Milestone: ---   Edit
Assignee: Generic inbox for the JDT-APT component CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-10-31 12:00 EDT by Filip Hrisafov CLA
Modified: 2022-12-23 07:41 EST (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Filip Hrisafov CLA 2021-10-31 12:00:47 EDT
Within the MapStruct team we have received a bug report (https://github.com/mapstruct/mapstruct/issues/2628) from one of our users that were receiving the following ClassCastException when working with Java 17 records.

Internal error in the mapping processor:
java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding cannot be cast to
class org.eclipse.jdt.internal.compiler.lookup.FieldBinding (org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding and org.eclipse.jdt.internal.compiler.lookup.FieldBinding are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @5eb054)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl$3.find(TypesImpl.java:145)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.findMemberInHierarchy(TypesImpl.java:208)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.asMemberOf(TypesImpl.java:142)
at org.mapstruct.ap.internal.util.AbstractTypeUtilsDecorator.asMemberOf(AbstractTypeUtilsDecorator.java:129)
at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.getConstructorAccessor(BeanMappingMethod.java:615)
at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.build(BeanMappingMethod.java:215)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:416)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:179)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:133)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:81)
at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:338)
at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:318)
at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:267)
at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:166)
at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:172)
at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:138)
at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:950)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:450)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:426)
at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:377)
at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:214)
at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:309)
at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:79)
at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:272)
at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:187)
at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:853)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:232)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:281)
at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:334)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:337)
at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:389)
at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:410)
at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:160)
at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:251)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
RecordMapper.java /mapstruct-eclipse-records/src/main/java/org/example line 6 Annotation Problem (Java 6 processor)


This can be reproduced through the project defined in https://github.com/blitzionian/mapstruct-eclipse-records. The exception can be seen if you change the `org.mapstruct.version` to 1.5.0.Beta1 in the pom.xml.

I guess that the solution should be in https://git.eclipse.org/c/jdt/eclipse.jdt.core.git/blame/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/TypesImpl.java#n141 and instead of casting to `FieldBinding` you need to use `VariableBinding` instead. Or have some other type of implementation for RECORD_COMPONENT elements
Comment 1 Raoul de Haard CLA 2022-12-23 07:41:39 EST
This bug is fixed with: https://github.com/eclipse-jdt/eclipse.jdt.core/pull/199