Skip to content

Commit e0e1b5f

Browse files
committed
fix: Fix using Dart defined scripts as GodotProperties
This requires a fix to the hint sting generated for GodotScript objects and also a fix for getting / setting script object from Variants.
1 parent 27eaab5 commit e0e1b5f

File tree

2 files changed

+45
-25
lines changed

2 files changed

+45
-25
lines changed

src/dart/godot_dart/lib/src/variant/variant.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -318,58 +318,59 @@ Object? convertFromVariantPtr(
318318
}
319319

320320
// Else, it's probably a dart native type
321-
using((arena) {
321+
ret = using((arena) {
322322
switch (variantType) {
323323
// Built-in types
324324
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_BOOL:
325325
Pointer<GDExtensionBool> ptr =
326326
arena.allocate(sizeOf<GDExtensionBool>());
327327
c!(ptr.cast(), variantPtr);
328-
ret = ptr.value != 0;
329-
break;
328+
return ptr.value != 0;
330329
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_INT:
331330
Pointer<GDExtensionInt> ptr = arena.allocate(sizeOf<GDExtensionInt>());
332331
c!(ptr.cast(), variantPtr);
333-
ret = ptr.value;
334-
break;
332+
return ptr.value;
335333
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_FLOAT:
336334
Pointer<Double> ptr = arena.allocate(sizeOf<Double>());
337335
c!(ptr.cast(), variantPtr);
338-
ret = ptr.value;
339-
break;
336+
return ptr.value;
340337
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_STRING_NAME:
341338
var gdStringName = StringName();
342339
c!(gdStringName.nativePtr.cast(), variantPtr);
343-
ret = gdStringName.toDartString();
344-
break;
340+
return gdStringName.toDartString();
345341
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_STRING:
346342
var gdString = GDString();
347343
c!(gdString.nativePtr.cast(), variantPtr);
348-
ret = gdString.toDartString();
349-
break;
344+
return gdString.toDartString();
350345

351346
// Or a hand-implemented object
352347
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_VECTOR3:
353-
ret = Vector3.fromVariantPtr(variantPtr);
354-
break;
348+
return Vector3.fromVariantPtr(variantPtr);
355349

356350
// Or a wrapped object
357351
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_OBJECT:
358352
Pointer<GDExtensionObjectPtr> ptr =
359353
arena.allocate(sizeOf<GDExtensionObjectPtr>());
360354
c!(ptr.cast(), variantPtr);
361-
final token =
362-
typeInfo?.bindingToken ?? GodotObject.sTypeInfo.bindingToken;
363-
ret = gde.dartBindings.gdObjectToDartObject(
364-
ptr.value,
365-
token,
366-
);
355+
if (typeInfo?.scriptInfo != null) {
356+
final scriptInstance = gde.dartBindings.getScriptInstance(ptr.value);
357+
if (scriptInstance != nullptr) {
358+
return gde.dartBindings.objectFromScriptInstance(scriptInstance);
359+
}
360+
} else {
361+
final token =
362+
typeInfo?.bindingToken ?? GodotObject.sTypeInfo.bindingToken;
363+
return gde.dartBindings.gdObjectToDartObject(
364+
ptr.value,
365+
token,
366+
);
367+
}
367368
break;
368369

369370
// TODO: all the other variant types
370371
default:
371-
ret = null;
372372
}
373+
return null;
373374
});
374375

375376
return ret;

src/dart/godot_dart_build/lib/src/godot_script_generator.dart

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:build/build.dart';
55
import 'package:godot_dart/godot_dart.dart';
66
import 'package:source_gen/source_gen.dart';
77

8+
const _godotScriptChecker = TypeChecker.fromRuntime(GodotScript);
89
const _godotExportChecker = TypeChecker.fromRuntime(GodotExport);
910
const _godotSignalChecker = TypeChecker.fromRuntime(GodotSignal);
1011
const _godotPropertyChecker = TypeChecker.fromRuntime(GodotProperty);
@@ -22,11 +23,14 @@ class GodotScriptAnnotationGenerator
2223
);
2324
}
2425

26+
final packageName = buildStep.inputId.package;
27+
2528
log.info('Trying to write output for ${element.name}');
26-
yield _createTypeInfo(element, annotation);
29+
yield _createTypeInfo(element, annotation, packageName);
2730
}
2831

29-
String _createTypeInfo(ClassElement element, ConstantReader annotation) {
32+
String _createTypeInfo(
33+
ClassElement element, ConstantReader annotation, String packageName) {
3034
final buffer = StringBuffer();
3135

3236
// Find the first superclass that has nativeTypeName defined
@@ -98,7 +102,8 @@ class GodotScriptAnnotationGenerator
98102
for (final propertyField in propertyFields) {
99103
final propertyAnnotation =
100104
_godotPropertyChecker.firstAnnotationOf(propertyField);
101-
buffer.write(_generatePropertyInfo(propertyField, propertyAnnotation));
105+
buffer.write(_generatePropertyInfo(
106+
propertyField, propertyAnnotation, packageName));
102107
buffer.writeln(',');
103108
}
104109
buffer.writeln(' ],');
@@ -169,7 +174,7 @@ class GodotScriptAnnotationGenerator
169174
}
170175

171176
String _generatePropertyInfo(
172-
FieldElement field, DartObject? propertyAnnotation) {
177+
FieldElement field, DartObject? propertyAnnotation, String packageName) {
173178
final buffer = StringBuffer();
174179

175180
final reader = ConstantReader(propertyAnnotation);
@@ -185,7 +190,7 @@ class GodotScriptAnnotationGenerator
185190
if (propertyHint != null) {
186191
buffer.writeln(' hint: ${propertyHint.toString()},');
187192
buffer.writeln(
188-
' hintString: \'${field.type.getDisplayString(withNullability: false)}\',');
193+
' hintString: \'${_getPropertyHintString(field.type, packageName)}\',');
189194
}
190195

191196
buffer.write(')');
@@ -207,6 +212,20 @@ class GodotScriptAnnotationGenerator
207212
return null;
208213
}
209214

215+
String _getPropertyHintString(DartType type, String packageName) {
216+
final element = type.element;
217+
if (element is ClassElement &&
218+
_godotScriptChecker.hasAnnotationOf(element,
219+
throwOnUnresolved: false)) {
220+
final relativeName = element.library.librarySource.fullName
221+
.replaceFirst('/$packageName/', '');
222+
return 'res://src/$relativeName';
223+
}
224+
225+
// Else, return its type
226+
return '${type.getDisplayString(withNullability: false)}';
227+
}
228+
210229
String _typeInfoForType(DartType type) {
211230
bool isPrimitive(DartType type) {
212231
return type.isDartCoreBool ||

0 commit comments

Comments
 (0)