11import 'dart:mirrors' ;
22
3+ import 'package:analyzer/dart/analysis/results.dart' ;
4+ import 'package:analyzer/dart/ast/ast.dart' ;
35import 'package:analyzer/dart/constant/value.dart' ;
46import 'package:analyzer/dart/element/element.dart' ;
57import 'package:analyzer/dart/element/type.dart' ;
@@ -100,13 +102,13 @@ class GodotScriptAnnotationGenerator
100102 }
101103 for (final getter in element.getters) {
102104 if (_godotPropertyChecker.hasAnnotationOf (getter,
103- throwOnUnresolved: false )) {
105+ throwOnUnresolved: false )) {
104106 propertyFields.add (getter);
105107 }
106108 }
107109 for (final setter in element.setters) {
108110 if (_godotPropertyChecker.hasAnnotationOf (setter,
109- throwOnUnresolved: false )) {
111+ throwOnUnresolved: false )) {
110112 log.warning (
111113 'Found `@GodotProperty` on setter `${setter .name }`. `@GodotProperty` should not be used on setters, only getters.' );
112114 }
@@ -115,12 +117,16 @@ class GodotScriptAnnotationGenerator
115117 for (final signalField in signalFields) {
116118 final signalAnnotation =
117119 _godotSignalChecker.firstAnnotationOf (signalField);
118- if (_godotSignalCallableChecker.isAssignableFromType (signalField.type)) {
119- buffer.write (_buildSignalInfo (signalField, signalAnnotation));
120- buffer.writeln (',' );
120+ if (_godotSignalCallableChecker.isAssignableFromType (signalField.type) &&
121+ signalField.hasInitializer) {
122+ final signalInfo = _buildSignalInfo (signalField, signalAnnotation);
123+ if (signalInfo != null ) {
124+ buffer.write (signalInfo);
125+ buffer.writeln (',' );
126+ }
121127 } else {
122128 log.severe (
123- 'Use of `@GodotSignal` on invalid field `${signalField .name }. The type must be one of the SignalX classes.' );
129+ 'Use of `@GodotSignal` on invalid field `${signalField .name }` . The type must be one of the SignalX classes and have a default initialier .' );
124130 }
125131 }
126132 buffer.writeln (' ],' );
@@ -216,12 +222,40 @@ class GodotScriptAnnotationGenerator
216222 return buffer.toString ();
217223 }
218224
219- String _buildSignalInfo (FieldElement element, DartObject ? signalAnnotation) {
225+ AstNode ? getAstNodeFromElement (Element element) {
226+ final session = element.session;
227+ final parsedLibResult = session? .getParsedLibraryByElement (element.library! )
228+ as ParsedLibraryResult ? ;
229+ final fragmentDelcaration =
230+ parsedLibResult? .getFragmentDeclaration (element.firstFragment);
231+ return fragmentDelcaration? .node;
232+ }
233+
234+ String ? _buildSignalInfo (
235+ VariableElement element, DartObject ? signalAnnotation) {
220236 final buffer = StringBuffer ();
221237 buffer.writeln ('SignalInfo(' );
222238
223- final reader = ConstantReader (signalAnnotation);
224- final signalName = reader.read ('signalName' ).stringValue;
239+ // Find the name of the signal through the AST
240+ final node = getAstNodeFromElement (element);
241+ if (node == null ) {
242+ log.severe ('Could not find AST Node for ${element .name }?' );
243+ return null ;
244+ }
245+ final constructorNode =
246+ node.childEntities.whereType <MethodInvocation >().firstOrNull;
247+ if (constructorNode == null ) {
248+ log.severe (
249+ 'Could not find constructor for ${element .name }! Is it initialized properly?' );
250+ return null ;
251+ }
252+ final signalNameArg = constructorNode.argumentList.arguments[1 ];
253+ if (signalNameArg is ! StringLiteral ) {
254+ log.severe ('Signal name for ${element .name } must be a StringLiteral!' );
255+ return null ;
256+ }
257+
258+ final signalName = signalNameArg.stringValue! ;
225259 buffer.writeln (' name: \' $signalName \' ,' );
226260
227261 //final signalArguments = reader.read('args').listValue;
@@ -419,14 +453,14 @@ class GodotScriptAnnotationGenerator
419453 ..name = 'peerId'
420454 ..named = true
421455 ..type = c.Reference ('int?' )));
422- final requiredParametrs = method.formalParameters.where ((e) => ! e.isOptional).map (
423- (e) => c.Parameter ((p) => p
456+ final requiredParametrs = method.formalParameters
457+ .where ((e) => ! e.isOptional)
458+ .map ((e) => c.Parameter ((p) => p
424459 ..named = e.isNamed
425460 ..name = e.displayName
426- ..type =
427- c.Reference (e.type.getDisplayString ())));
461+ ..type = c.Reference (e.type.getDisplayString ())));
428462
429- return c.Method .returnsVoid ((b) => b
463+ return c.Method .returnsVoid ((b) => b
430464 ..optionalParameters.addAll (optionalParameters)
431465 ..requiredParameters.addAll (requiredParametrs)
432466 ..name = method.name
0 commit comments