@@ -28,7 +28,8 @@ class EntityResolver extends Builder {
2828 final _indexChecker = const TypeChecker .fromRuntime (Index );
2929 final _backlinkChecker = const TypeChecker .fromRuntime (Backlink );
3030 final _hnswChecker = const TypeChecker .fromRuntime (HnswIndex );
31- final _externalTypeChecker = const TypeChecker .fromRuntime (ExternalProperty );
31+ final _externalTypeChecker = const TypeChecker .fromRuntime (ExternalType );
32+ final _externalNameChecker = const TypeChecker .fromRuntime (ExternalName );
3233
3334 @override
3435 FutureOr <void > build (BuildStep buildStep) async {
@@ -172,6 +173,7 @@ class EntityResolver extends Builder {
172173 final backlinkAnnotations =
173174 _backlinkChecker.annotationsOfExact (annotated);
174175 if (backlinkAnnotations.isNotEmpty) {
176+ // Handles ToMany based on other ToOne or ToMany relation (backlink)
175177 if (! isToManyRel) {
176178 log.severe (
177179 " Skipping property '${f .name }': @Backlink() may only be used with ToMany." );
@@ -184,14 +186,37 @@ class EntityResolver extends Builder {
184186 entity.backlinks.add (backlink);
185187 log.info (' $backlink ' );
186188 } else if (isToManyRel) {
189+ // Handles standalone (non backlink) ToMany relation
190+
191+ // @ExternalType
192+ int ? externalPropertyType;
193+ _externalTypeChecker.runIfMatches (annotated, (annotation) {
194+ final externalTypeId = _readExternalTypeParams (annotation);
195+ externalPropertyType = externalTypeId;
196+ });
197+
198+ // @ExternalName
199+ String ? externalPropertyName;
200+ _externalNameChecker.runIfMatches (annotated, (annotation) {
201+ if (externalPropertyType == null ) {
202+ throw InvalidGenerationSourceError (
203+ "@ExternalName annotation requires @ExternalType annotation to be present" );
204+ }
205+ externalPropertyName = _readExternalNameParams (annotation);
206+ });
207+
187208 // create relation
188209 final rel = ModelRelation .create (IdUid (0 , propUid ?? 0 ), f.name,
189210 targetName: relTargetName,
190- uidRequest: propUid != null && propUid == 0 );
211+ uidRequest: propUid != null && propUid == 0 ,
212+ externalPropertyName: externalPropertyName,
213+ externalPropertyType: externalPropertyType);
214+
191215 entity.relations.add (rel);
192216
193217 log.info (' $rel ' );
194218 } else {
219+ // Handles regular properties
195220 // create property (do not use readEntity.createProperty in order to avoid generating new ids)
196221 final prop = ModelProperty .create (
197222 IdUid (0 , propUid ?? 0 ), f.name, fieldType,
@@ -227,8 +252,20 @@ class EntityResolver extends Builder {
227252 _readHnswIndexParams (annotation, prop);
228253 });
229254
255+ // @ExternalType
230256 _externalTypeChecker.runIfMatches (annotated, (annotation) {
231- _readExternalTypeParams (annotation, prop);
257+ final externalTypeId = _readExternalTypeParams (annotation);
258+ prop.externalPropertyType = externalTypeId;
259+ });
260+
261+ // @ExternalName
262+ _externalNameChecker.runIfMatches (annotated, (annotation) {
263+ if (prop.externalPropertyType == null ) {
264+ throw InvalidGenerationSourceError (
265+ "@ExternalName annotation requires @ExternalType annotation to be present" );
266+ }
267+ final externalName = _readExternalNameParams (annotation);
268+ prop.externalPropertyName = externalName;
232269 });
233270
234271 // for code generation
@@ -561,17 +598,25 @@ class EntityResolver extends Builder {
561598 property.hnswParams = ModelHnswParams .fromAnnotation (hnswRestored);
562599 }
563600
564- void _readExternalTypeParams (DartObject annotation, ModelProperty property ) {
601+ int _readExternalTypeParams (DartObject annotation) {
565602 final typeIndex =
566- _enumValueIndex (annotation.getField ('type' )! , "ExternalProperty.type" );
567- final type = typeIndex != null ? ExternalType .values[typeIndex] : null ;
603+ _enumValueIndex (annotation.getField ('type' )! , "ExternalType.type" );
604+ final type =
605+ typeIndex != null ? ExternalPropertyType .values[typeIndex] : null ;
568606 if (type == null ) {
569607 throw InvalidGenerationSourceError (
570- "'type' attribute not specified in @ExternalProperty annotation" );
608+ "'type' attribute not specified in @ExternalType annotation" );
571609 }
610+ return externalTypeToOBXExternalType (type);
611+ }
612+
613+ String _readExternalNameParams (DartObject annotation) {
572614 final name = annotation.getField ('name' )! .toStringValue ();
573- property.externalPropertyType = externalTypeToOBXExternalType (type);
574- property.externalPropertyName = name;
615+ if (name == null ) {
616+ throw InvalidGenerationSourceError (
617+ "'name' attribute not specified in @ExternalName annotation" );
618+ }
619+ return name;
575620 }
576621}
577622
0 commit comments