ethanblake4 / dart_eval

Extensible Dart interpreter for Dart with full interop

Home Page:https://pub.dev/packages/dart_eval

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

how to create a class instance

Noobware1 opened this issue · comments

sorry if i can't explain it properly. basically i want to create a searchresponse instance in code.dart with help of $SearchResponse $Instance defined in the extenstions_test.dart.

it's not really a issue rather a question.

in code.dart

import 'package:bridge_lib/bridge_lib.dart';


test() {
  return SearchResponse(
      poster: 'test-poster', title: 'test-title', url: 'test-url');
}

in extenstions_test.dart

import 'dart:io';
import 'dart:typed_data';

import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';

class SearchResponse {
  String? title;
  String? poster;
  String? url;

  SearchResponse({this.title, this.poster, this.url});
}


class $SearchResponse implements SearchResponse, $Instance {
  $SearchResponse.wrap(this.$value) : _superclass = $Object($value);

  static const $type = BridgeTypeRef(
      BridgeTypeSpec('package:bridge_lib/bridge_lib.dart', 'SearchResponse'));

  static const $declaration = BridgeClassDef(BridgeClassType($type),
      constructors: {
        '': BridgeConstructorDef(
          BridgeFunctionDef(
            returns: BridgeTypeAnnotation($type),
            params: [],
            namedParams: [
              BridgeParameter(
                  'title',
                  BridgeTypeAnnotation(
                      BridgeTypeRef.type(RuntimeTypes.stringType)),
                  false),
              BridgeParameter(
                  'poster',
                  BridgeTypeAnnotation(
                      BridgeTypeRef.type(RuntimeTypes.stringType)),
                  false),
              BridgeParameter(
                  'url',
                  BridgeTypeAnnotation(
                      BridgeTypeRef.type(RuntimeTypes.stringType)),
                  false),
            ],
          ),
        ),
      },
      fields: {
        'title': BridgeFieldDef(
            BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
        'poster': BridgeFieldDef(
            BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
        'url': BridgeFieldDef(
            BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType))),
      },
      wrap: true);

  @override
  $Value? $getProperty(Runtime runtime, String identifier) {
    switch (identifier) {
      case 'url':
        return $String($value.url!);
      case 'poster':
        return $String($value.poster!);
      case 'title':
        return $String($value.title!);
      default:
        throw UnimplementedError();
    }
  }

  @override
  int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);

  static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
    return $SearchResponse.wrap(SearchResponse());
  }

  @override
  SearchResponse get $reified => $value;

  final $Instance _superclass;

  @override
  void $setProperty(Runtime runtime, String identifier, $Value value) {
    switch (identifier) {
      case 'url':
        $value.url = value.$reified;
      case 'poster':
        $value.poster = value.$reified;
      case 'title':
        $value.title = value.$reified;

      default:
        _superclass.$setProperty(runtime, identifier, value);
    }
  }

  @override
  final SearchResponse $value;

  @override
  String? get poster => $value.poster;

  @override
  String? get title => $value.title;

  @override
  String? get url => $value.url;

  @override
  set poster(String? _poster) {
    // TODO: implement poster
  }

  @override
  set title(String? _title) {
    // TODO: implement title
  }

  @override
  set url(String? _url) {
    // TODO: implement url
  }
}

Uint8List compilerEval(String sourceCode) {
  final compiler = Compiler();
  compiler.defineBridgeClasses([$SearchResponse.$declaration]);
  final program = compiler.compile({
    'extenstions_test': {'code.dart': sourceCode}
  });

  final bytecode = program.write();
  return bytecode;
}

Runtime runtimeEval(Uint8List bytecode) {
  final runtime = Runtime(bytecode.buffer.asByteData());
  runtime.registerBridgeFunc('package:bridge_lib/bridge_lib.dart',
      'SearchResponse.', $SearchResponse.$new);
  runtime.setup();
  return runtime;
}

void main(List<String> args) async {
  final file =
      await File('E:/Projects/extenstions_test/lib/code.dart').readAsString();

  final compiled = compilerEval(file);

  final runtime = runtimeEval(compiled);

  final value = (await runtime.executeLib(
    'package:extenstions_test/code.dart',
    'test',
  ));
  if (value is $SearchResponse) {
    print(value.title);
    print(value.poster);
    print(value.url);
  }
}


Figured it out