@@ -9,6 +9,7 @@ import 'package:dart_eval/src/eval/bindgen/bridge.dart';
99import 'package:dart_eval/src/eval/bindgen/bridge_declaration.dart' ;
1010import 'package:dart_eval/src/eval/bindgen/configure.dart' ;
1111import 'package:dart_eval/src/eval/bindgen/context.dart' ;
12+ import 'package:dart_eval/src/eval/bindgen/enum.dart' ;
1213import 'package:dart_eval/src/eval/bindgen/methods.dart' ;
1314import 'package:dart_eval/src/eval/bindgen/properties.dart' ;
1415import 'package:dart_eval/src/eval/bindgen/statics.dart' ;
@@ -27,6 +28,7 @@ class Bindgen implements BridgeDeclarationRegistry {
2728 final _bridgeDeclarations = < String , List <BridgeDeclaration >> {};
2829 final _exportedLibMappings = < String , String > {};
2930 final List <({String file, String uri, String name})> registerClasses = [];
31+ final List <({String file, String uri, String name})> registerEnums = [];
3032
3133 AnalysisContextCollection ? _contextCollection;
3234
@@ -151,13 +153,15 @@ class Bindgen implements BridgeDeclarationRegistry {
151153 }
152154 }
153155
154- final units =
155- analysisResult.unit.declarations.whereType <ClassDeclaration >();
156+ final units = analysisResult.unit.declarations;
156157
157158 final resolved = units
158159 .where ((declaration) => declaration.declaredFragment != null )
159- .map ((declaration) =>
160- _$instance (ctx, declaration.declaredFragment! .element))
160+ .map ((declaration) => declaration is ClassDeclaration
161+ ? _$instance (ctx, declaration.declaredFragment! .element)
162+ : (declaration is EnumDeclaration
163+ ? _$enum (ctx, declaration.declaredFragment! .element)
164+ : null ))
161165 .toList ()
162166 .nonNulls;
163167
@@ -177,29 +181,38 @@ class Bindgen implements BridgeDeclarationRegistry {
177181 return null ;
178182 }
179183
180- String ? _$instance (BindgenContext ctx, ClassElement2 element) {
184+ ({bool process, bool isBridge}) _shouldProcess (
185+ BindgenContext ctx, TypeDefiningElement2 element) {
181186 final metadata = element.metadata2;
182187 final bindAnno = metadata.annotations
183188 .firstWhereOrNull ((element) => element.element2? .displayName == 'Bind' );
184189 final bindAnnoValue = bindAnno? .computeConstantValue ();
185- if (! ctx.all) {
186- if (bindAnnoValue == null ) {
187- return null ;
188- }
189- final implicitSupers =
190- bindAnnoValue.getField ('implicitSupers' )? .toBoolValue () ?? false ;
191- ctx.implicitSupers = implicitSupers;
192- final override = bindAnnoValue.getField ('overrideLibrary' );
193- if (override != null && ! override.isNull) {
194- final overrideUri = override.toStringValue ();
195- if (overrideUri != null ) {
196- ctx.libOverrides[element.name3! ] = overrideUri;
197- }
190+
191+ if (bindAnnoValue == null && ! ctx.all) {
192+ return (process: false , isBridge: false );
193+ }
194+ final implicitSupers =
195+ bindAnnoValue? .getField ('implicitSupers' )? .toBoolValue () ?? false ;
196+ ctx.implicitSupers = implicitSupers;
197+ final override = bindAnnoValue? .getField ('overrideLibrary' );
198+ if (override != null && ! override.isNull) {
199+ final overrideUri = override.toStringValue ();
200+ if (overrideUri != null ) {
201+ ctx.libOverrides[element.name3! ] = overrideUri;
198202 }
199203 }
200204
201205 final isBridge = bindAnnoValue? .getField ('bridge' )? .toBoolValue () ?? false ;
202206
207+ return (process: ctx.all || bindAnnoValue != null , isBridge: isBridge);
208+ }
209+
210+ String ? _$instance (BindgenContext ctx, ClassElement2 element) {
211+ final (: process, : isBridge) = _shouldProcess (ctx, element);
212+ if (! process) {
213+ return null ;
214+ }
215+
203216 if (element.isSealed) {
204217 throw CompileError (
205218 'Cannot bind sealed class ${element .name3 } as a bridge type. '
@@ -261,10 +274,46 @@ ${$setProperty(ctx, element)}
261274''' ;
262275 }
263276
264- String $superclassWrapper (BindgenContext ctx, ClassElement2 element) {
277+ String ? _$enum (BindgenContext ctx, EnumElement2 element) {
278+ final (: process, : isBridge) = _shouldProcess (ctx, element);
279+ if (! process) {
280+ return null ;
281+ }
282+
283+ registerEnums.add ((
284+ file: ctx.filename,
285+ uri: ctx.libOverrides[element.name3! ] ?? ctx.uri,
286+ name: '${element .name3 !}${isBridge ? '\$ bridge' : '' }' ,
287+ ));
288+
289+ return '''
290+ /// dart_eval enum wrapper binding for [${element .name3 }]
291+ class \$ ${element .name3 } implements \$ Instance {
292+ /// Configure this enum for use in a [Runtime]
293+ ${bindConfigureEnumForRuntime (ctx , element )}
294+ /// Compile-time type specification of [\$ ${element .name3 }]
295+ ${bindTypeSpec (ctx , element )}
296+ /// Compile-time type declaration of [\$ ${element .name3 }]
297+ ${bindBridgeType (ctx , element )}
298+ /// Compile-time class declaration of [\$ ${element .name3 }]
299+ ${bindBridgeDeclaration (ctx , element )}
300+ ${$enumValues (ctx , element )}
301+ ${$staticMethods (ctx , element )}
302+ ${$staticGetters (ctx , element )}
303+ ${$staticSetters (ctx , element )}
304+ ${$wrap (ctx , element )}
305+ ${$getRuntimeType (element )}
306+ ${$getProperty (ctx , element )}
307+ ${$methods (ctx , element )}
308+ ${$setProperty (ctx , element )}
309+ }
310+ ''' ;
311+ }
312+
313+ String $superclassWrapper (BindgenContext ctx, InterfaceElement2 element) {
265314 final supertype = element.supertype;
266315 final objectWrapper = '\$ Object(\$ value)' ;
267- if (supertype == null || ctx.implicitSupers) {
316+ if (supertype == null || ctx.implicitSupers || element is EnumElement2 ) {
268317 ctx.imports.add ('package:dart_eval/stdlib/core.dart' );
269318 return objectWrapper;
270319 }
@@ -279,14 +328,14 @@ ${$setProperty(ctx, element)}
279328 return narrowWrapper;
280329 }
281330
282- String $getRuntimeType (ClassElement2 element) {
331+ String $getRuntimeType (InterfaceElement2 element) {
283332 return '''
284333 @override
285334 int \$ getRuntimeType(Runtime runtime) => runtime.lookupType(\$ spec);
286335''' ;
287336 }
288337
289- String $wrap (BindgenContext ctx, ClassElement2 element) {
338+ String $wrap (BindgenContext ctx, InterfaceElement2 element) {
290339 return '''
291340 final \$ Instance _superclass;
292341
0 commit comments