Skip to content

Commit

Permalink
fix: Fix using Dart defined scripts as GodotProperties
Browse files Browse the repository at this point in the history
This requires a fix to the hint sting generated for GodotScript objects and also a fix for getting / setting script object from Variants.
  • Loading branch information
fuzzybinary committed Nov 10, 2024
1 parent 27eaab5 commit e0e1b5f
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 25 deletions.
41 changes: 21 additions & 20 deletions src/dart/godot_dart/lib/src/variant/variant.dart
Original file line number Diff line number Diff line change
Expand Up @@ -318,58 +318,59 @@ Object? convertFromVariantPtr(
}

// Else, it's probably a dart native type
using((arena) {
ret = using((arena) {
switch (variantType) {
// Built-in types
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_BOOL:
Pointer<GDExtensionBool> ptr =
arena.allocate(sizeOf<GDExtensionBool>());
c!(ptr.cast(), variantPtr);
ret = ptr.value != 0;
break;
return ptr.value != 0;
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_INT:
Pointer<GDExtensionInt> ptr = arena.allocate(sizeOf<GDExtensionInt>());
c!(ptr.cast(), variantPtr);
ret = ptr.value;
break;
return ptr.value;
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_FLOAT:
Pointer<Double> ptr = arena.allocate(sizeOf<Double>());
c!(ptr.cast(), variantPtr);
ret = ptr.value;
break;
return ptr.value;
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_STRING_NAME:
var gdStringName = StringName();
c!(gdStringName.nativePtr.cast(), variantPtr);
ret = gdStringName.toDartString();
break;
return gdStringName.toDartString();
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_STRING:
var gdString = GDString();
c!(gdString.nativePtr.cast(), variantPtr);
ret = gdString.toDartString();
break;
return gdString.toDartString();

// Or a hand-implemented object
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_VECTOR3:
ret = Vector3.fromVariantPtr(variantPtr);
break;
return Vector3.fromVariantPtr(variantPtr);

// Or a wrapped object
case GDExtensionVariantType.GDEXTENSION_VARIANT_TYPE_OBJECT:
Pointer<GDExtensionObjectPtr> ptr =
arena.allocate(sizeOf<GDExtensionObjectPtr>());
c!(ptr.cast(), variantPtr);
final token =
typeInfo?.bindingToken ?? GodotObject.sTypeInfo.bindingToken;
ret = gde.dartBindings.gdObjectToDartObject(
ptr.value,
token,
);
if (typeInfo?.scriptInfo != null) {
final scriptInstance = gde.dartBindings.getScriptInstance(ptr.value);
if (scriptInstance != nullptr) {
return gde.dartBindings.objectFromScriptInstance(scriptInstance);
}
} else {
final token =
typeInfo?.bindingToken ?? GodotObject.sTypeInfo.bindingToken;
return gde.dartBindings.gdObjectToDartObject(
ptr.value,
token,
);
}
break;

// TODO: all the other variant types
default:
ret = null;
}
return null;
});

return ret;
Expand Down
29 changes: 24 additions & 5 deletions src/dart/godot_dart_build/lib/src/godot_script_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:build/build.dart';
import 'package:godot_dart/godot_dart.dart';
import 'package:source_gen/source_gen.dart';

const _godotScriptChecker = TypeChecker.fromRuntime(GodotScript);
const _godotExportChecker = TypeChecker.fromRuntime(GodotExport);
const _godotSignalChecker = TypeChecker.fromRuntime(GodotSignal);
const _godotPropertyChecker = TypeChecker.fromRuntime(GodotProperty);
Expand All @@ -22,11 +23,14 @@ class GodotScriptAnnotationGenerator
);
}

final packageName = buildStep.inputId.package;

log.info('Trying to write output for ${element.name}');
yield _createTypeInfo(element, annotation);
yield _createTypeInfo(element, annotation, packageName);
}

String _createTypeInfo(ClassElement element, ConstantReader annotation) {
String _createTypeInfo(
ClassElement element, ConstantReader annotation, String packageName) {
final buffer = StringBuffer();

// Find the first superclass that has nativeTypeName defined
Expand Down Expand Up @@ -98,7 +102,8 @@ class GodotScriptAnnotationGenerator
for (final propertyField in propertyFields) {
final propertyAnnotation =
_godotPropertyChecker.firstAnnotationOf(propertyField);
buffer.write(_generatePropertyInfo(propertyField, propertyAnnotation));
buffer.write(_generatePropertyInfo(
propertyField, propertyAnnotation, packageName));
buffer.writeln(',');
}
buffer.writeln(' ],');
Expand Down Expand Up @@ -169,7 +174,7 @@ class GodotScriptAnnotationGenerator
}

String _generatePropertyInfo(
FieldElement field, DartObject? propertyAnnotation) {
FieldElement field, DartObject? propertyAnnotation, String packageName) {
final buffer = StringBuffer();

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

buffer.write(')');
Expand All @@ -207,6 +212,20 @@ class GodotScriptAnnotationGenerator
return null;
}

String _getPropertyHintString(DartType type, String packageName) {
final element = type.element;
if (element is ClassElement &&
_godotScriptChecker.hasAnnotationOf(element,
throwOnUnresolved: false)) {
final relativeName = element.library.librarySource.fullName
.replaceFirst('/$packageName/', '');
return 'res://src/$relativeName';
}

// Else, return its type
return '${type.getDisplayString(withNullability: false)}';
}

String _typeInfoForType(DartType type) {
bool isPrimitive(DartType type) {
return type.isDartCoreBool ||
Expand Down

0 comments on commit e0e1b5f

Please sign in to comment.