| Index: tools/servicec/lib/src/plugins/dart.dart
|
| diff --git a/tools/servicec/lib/src/plugins/dart.dart b/tools/servicec/lib/src/plugins/dart.dart
|
| deleted file mode 100644
|
| index 28c3cb549a8946086b411e790cec7d6666168fb4..0000000000000000000000000000000000000000
|
| --- a/tools/servicec/lib/src/plugins/dart.dart
|
| +++ /dev/null
|
| @@ -1,482 +0,0 @@
|
| -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -library old_servicec.plugins.dart;
|
| -
|
| -import 'dart:core' hide Type;
|
| -import 'dart:io' show Platform, File;
|
| -
|
| -import 'package:path/path.dart' show basenameWithoutExtension, join, dirname;
|
| -import 'package:servicec/util.dart' as strings;
|
| -
|
| -import 'shared.dart';
|
| -import '../emitter.dart';
|
| -import '../struct_layout.dart';
|
| -import '../primitives.dart' as primitives;
|
| -
|
| -const COPYRIGHT = """
|
| -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE.md file.
|
| -""";
|
| -
|
| -const int HEADER_SIZE = 56;
|
| -
|
| -const List<String> RESOURCES = const [
|
| - "struct.dart",
|
| -];
|
| -
|
| -void generate(String path,
|
| - Unit unit,
|
| - String resourcesDirectory,
|
| - String outputDirectory) {
|
| - _DartVisitor visitor = new _DartVisitor(path);
|
| - visitor.visit(unit);
|
| - String contents = visitor.buffer.toString();
|
| - String directory = join(outputDirectory, 'dart');
|
| - writeToFile(directory, path, contents, extension: 'dart');
|
| -
|
| - resourcesDirectory = join(resourcesDirectory, 'dart');
|
| - for (String resource in RESOURCES) {
|
| - String resourcePath = join(resourcesDirectory, resource);
|
| - File file = new File(resourcePath);
|
| - String contents = file.readAsStringSync();
|
| - writeToFile(directory, resource, contents);
|
| - }
|
| -}
|
| -
|
| -class _DartVisitor extends CodeGenerationVisitor {
|
| - final Set<Type> neededListTypes = new Set<Type>();
|
| - final List<Method> methods = new List();
|
| - _DartVisitor(String path) : super(path);
|
| -
|
| - static Map<String, String> _GETTERS = const {
|
| - 'bool' : 'getUint8',
|
| -
|
| - 'uint8' : 'getUint8',
|
| - 'uint16' : 'getUint16',
|
| -
|
| - 'int8' : 'getInt8',
|
| - 'int16' : 'getInt16',
|
| - 'int32' : 'getInt32',
|
| - 'int64' : 'getInt64',
|
| -
|
| - 'float32' : 'getFloat32',
|
| - 'float64' : 'getFloat64',
|
| - };
|
| -
|
| - static Map<String, String> _SETTERS = const {
|
| - 'bool' : 'setUint8',
|
| -
|
| - 'uint8' : 'setUint8',
|
| - 'uint16' : 'setUint16',
|
| -
|
| - 'int8' : 'setInt8',
|
| - 'int16' : 'setInt16',
|
| - 'int32' : 'setInt32',
|
| - 'int64' : 'setInt64',
|
| -
|
| - 'float32' : 'setFloat32',
|
| - 'float64' : 'setFloat64',
|
| - };
|
| -
|
| - visitUnit(Unit node) {
|
| - writeln(COPYRIGHT);
|
| -
|
| - writeln('// Generated file. Do not edit.');
|
| - writeln();
|
| -
|
| - String libraryName = basenameWithoutExtension(path);
|
| - writeln('library $libraryName;');
|
| - writeln();
|
| -
|
| - writeln('import "dart:dartino";');
|
| - writeln('import "dart:dartino.ffi";');
|
| - writeln('import "dart:dartino.service" as service;');
|
| - if (node.structs.isNotEmpty) {
|
| - writeln('import "struct.dart";');
|
| - }
|
| - writeln();
|
| -
|
| - writeln('final Channel _channel = new Channel();');
|
| - writeln('final Port _port = new Port(_channel);');
|
| - write('final ForeignFunction _postResult = ');
|
| - writeln('ForeignLibrary.main.lookup("PostResultToService");');
|
| -
|
| - node.services.forEach(visit);
|
| - node.structs.forEach(visit);
|
| -
|
| - for (Type listType in neededListTypes) {
|
| - String name = listType.identifier;
|
| - if (listType.isPrimitive) {
|
| - int elementSize = primitives.size(listType.primitiveType);
|
| - String getter = '\$segment.memory.${_GETTERS[name]}';
|
| - String setter = '\$segment.memory.${_SETTERS[name]}';
|
| - String offset = '\$offset + index * $elementSize';
|
| -
|
| - writeln();
|
| - write('class _${name}List extends ListReader<');
|
| - writeType(listType);
|
| - write('> implements List<');
|
| - writeType(listType);
|
| - writeln('> {');
|
| - write(' ');
|
| - writeType(listType);
|
| - writeln(' operator[](int index) => $getter($offset);');
|
| - writeln('}');
|
| -
|
| - writeln();
|
| - write('class _${name}BuilderList extends ListBuilder<');
|
| - writeType(listType);
|
| - write('> implements List<');
|
| - writeType(listType);
|
| - writeln('> {');
|
| - write(' ');
|
| - writeType(listType);
|
| - writeln(' operator[](int index) => $getter($offset);');
|
| - write(' void operator[]=(int index, ');
|
| - writeType(listType);
|
| - writeln(' value) { $setter($offset, value); }');
|
| - writeln('}');
|
| - } else {
|
| - Struct element = listType.resolved;
|
| - StructLayout elementLayout = element.layout;
|
| - int elementSize = elementLayout.size;
|
| -
|
| - writeln();
|
| - write('class _${name}List extends ListReader<$name>');
|
| - writeln(' implements List<$name> {');
|
| - writeln(' $name operator[](int index) => '
|
| - 'readListElement(new $name(), index, $elementSize);');
|
| - writeln('}');
|
| -
|
| - writeln();
|
| - write('class _${name}BuilderList extends ListBuilder<${name}Builder>');
|
| - writeln(' implements List<${name}Builder> {');
|
| - writeln(' ${name}Builder operator[](int index) => '
|
| - 'readListElement(new ${name}Builder(), index, $elementSize);');
|
| - writeln('}');
|
| - }
|
| - }
|
| - }
|
| -
|
| - writeImplCall(Method method) {
|
| - write('_impl.${method.name}(');
|
| - if (method.inputKind == InputKind.STRUCT) {
|
| - write('getRoot(new ');
|
| - writeType(method.arguments.single.type);
|
| - write('(), request)');
|
| - } else {
|
| - assert(method.inputKind == InputKind.PRIMITIVES);
|
| - StructLayout inputLayout = method.inputPrimitiveStructLayout;
|
| - for (int i = 0; i < method.arguments.length; i++) {
|
| - if (i != 0) write(', ');
|
| - Formal argument = method.arguments[i];
|
| - String getter = _GETTERS[argument.type.identifier];
|
| - int offset = inputLayout[argument].offset + HEADER_SIZE;
|
| - write('request.$getter($offset)');
|
| - }
|
| - }
|
| - }
|
| -
|
| - visitService(Service node) {
|
| - String serviceName = node.name;
|
| -
|
| - writeln();
|
| - writeln('bool _terminated = false;');
|
| - writeln('$serviceName _impl;');
|
| -
|
| - writeln();
|
| - writeln('abstract class $serviceName {');
|
| -
|
| - node.methods.forEach(visit);
|
| -
|
| - writeln();
|
| - writeln(' static void initialize($serviceName impl) {');
|
| - writeln(' if (_impl != null) {');
|
| - writeln(' throw new UnsupportedError("Cannot re-initialize");');
|
| - writeln(' }');
|
| - writeln(' _impl = impl;');
|
| - writeln(' _terminated = false;');
|
| - writeln(' service.register("$serviceName", _port);');
|
| - writeln(' }');
|
| -
|
| - writeln();
|
| - writeln(' static bool hasNextEvent() {');
|
| - writeln(' return !_terminated;');
|
| - writeln(' }');
|
| -
|
| -
|
| - List<String> methodIds = methods.map((method) =>
|
| - '_${strings.underscore(method.name).toUpperCase()}_METHOD_ID')
|
| - .toList();
|
| -
|
| - writeln();
|
| - writeln(' static void handleNextEvent() {');
|
| - writeln(' var request = _channel.receive();');
|
| - writeln(' switch (request.getInt32(0)) {');
|
| - writeln(' case _TERMINATE_METHOD_ID:');
|
| - writeln(' _terminated = true;');
|
| - writeln(' _postResult.vcall\$1(request);');
|
| - writeln(' break;');
|
| -
|
| - String setInt32() => 'request.setInt32($HEADER_SIZE, result)';
|
| - String setInt64() => 'request.setInt64($HEADER_SIZE, result)';
|
| -
|
| - for (int i = 0; i < methods.length; ++i) {
|
| - Method method = methods[i];
|
| - writeln(' case ${methodIds[i]}:');
|
| - if (method.returnType.isVoid) {
|
| - write(' ');
|
| - writeImplCall(method);
|
| - writeln(');');
|
| - } else if (method.returnType.isPrimitive) {
|
| - write(' var result = ');
|
| - writeImplCall(method);
|
| - writeln(');');
|
| - writeln(' ${setInt32()};');
|
| - } else {
|
| - Struct resultType = method.returnType.resolved;
|
| - StructLayout resultLayout = new StructLayout(resultType);
|
| - int size = resultLayout.size;
|
| - writeln(' MessageBuilder mb = new MessageBuilder(${size + 8});');
|
| - String builderName = '${method.returnType.identifier}Builder';
|
| - writeln(' $builderName builder = '
|
| - 'mb.initRoot(new $builderName(), $size);');
|
| - write(' ');
|
| - writeImplCall(method);
|
| - write('${method.arguments.length > 0 ? ", " : ""}builder');
|
| - writeln(');');
|
| - writeln(' var result = getResultMessage(builder);');
|
| - writeln(' ${setInt64()};');
|
| - }
|
| - writeln(' _postResult.vcall\$1(request);');
|
| - writeln(' break;');
|
| - }
|
| - writeln(' default:');
|
| - writeln(' throw new UnsupportedError("Unknown method");');
|
| - writeln(' }');
|
| - writeln(' }');
|
| -
|
| - writeln();
|
| - int nextId = 0;
|
| - writeln(' static const int _TERMINATE_METHOD_ID = ${nextId++};');
|
| - for (String id in methodIds) {
|
| - writeln(' static const int $id = ${nextId++};');
|
| - }
|
| -
|
| - writeln('}');
|
| - }
|
| -
|
| - visitStruct(Struct node) {
|
| - StructLayout layout = node.layout;
|
| -
|
| - writeln();
|
| - writeln('class ${node.name} extends Reader {');
|
| - for (StructSlot slot in layout.slots) {
|
| - String slotName = slot.slot.name;
|
| - Type slotType = slot.slot.type;
|
| -
|
| - if (slot.isUnionSlot) {
|
| - String camel = camelize(slotName);
|
| - String tagName = slot.union.tag.name;
|
| - int tag = slot.unionTag;
|
| - writeln(' bool get is$camel => $tag == this.$tagName;');
|
| - }
|
| -
|
| - if (slotType.isList) {
|
| - write(' List<');
|
| - writeType(slotType);
|
| - write('> get $slotName => ');
|
| - neededListTypes.add(slotType);
|
| - writeln('readList(new _${slotType.identifier}List(), ${slot.offset});');
|
| - } else if (slotType.isVoid) {
|
| - // No getters for void slots.
|
| - } else if (slotType.isString) {
|
| - Type uint16ListType = new ListType(new SimpleType("uint16", false));
|
| - uint16ListType.primitiveType = primitives.lookup("uint16");
|
| - neededListTypes.add(uint16ListType);
|
| - writeln(' String get $slotName => '
|
| - 'readString(new _uint16List(), ${slot.offset});');
|
| - writeln(' List<int> get ${slotName}Data => '
|
| - 'readList(new _uint16List(), ${slot.offset});');
|
| - } else if (slotType.isPrimitive) {
|
| - String getter = _GETTERS[slotType.identifier];
|
| - String offset = '\$offset + ${slot.offset}';
|
| -
|
| - write(' ');
|
| - writeType(slotType);
|
| - if (slotType.isBool) {
|
| - writeln(' get $slotName => \$segment.memory.$getter($offset) != 0;');
|
| - } else {
|
| - writeln(' get $slotName => \$segment.memory.$getter($offset);');
|
| - }
|
| - } else {
|
| - write(' ');
|
| - writeType(slotType);
|
| - write(' get $slotName => ');
|
| - if (!slotType.isPointer) {
|
| - write('new ');
|
| - writeType(slotType);
|
| - writeln('()');
|
| - writeln(' ..\$segment = \$segment');
|
| - writeln(' ..\$offset = \$offset + ${slot.offset};');
|
| - } else {
|
| - write('readStruct(new ');
|
| - writeType(slotType);
|
| - writeln('(), ${slot.offset});');
|
| - }
|
| - }
|
| - }
|
| - writeln('}');
|
| -
|
| - writeln();
|
| - writeln('class ${node.name}Builder extends Builder {');
|
| - for (StructSlot slot in layout.slots) {
|
| - String slotName = slot.slot.name;
|
| - Type slotType = slot.slot.type;
|
| -
|
| - String updateTag = '';
|
| - if (slot.isUnionSlot) {
|
| - String tagName = slot.union.tag.name;
|
| - int tag = slot.unionTag;
|
| - updateTag = ' $tagName = $tag;\n';
|
| - }
|
| -
|
| - String camel = camelize(slotName);
|
| - if (slotType.isList) {
|
| - write(' List<');
|
| - writeReturnType(slotType);
|
| - writeln('> init$camel(int length) {');
|
| - write(updateTag);
|
| - int size = 0;
|
| - if (slotType.isPrimitive) {
|
| - size = primitives.size(slotType.primitiveType);
|
| - } else {
|
| - Struct element = slotType.resolved;
|
| - StructLayout elementLayout = element.layout;
|
| - size = elementLayout.size;
|
| - }
|
| - String type = '_${slotType.identifier}BuilderList';
|
| - writeln(' $type result = NewList(new $type(), ${slot.offset},'
|
| - ' length, $size);');
|
| - writeln(' return result;');
|
| - writeln(' }');
|
| - } else if (slotType.isVoid) {
|
| - writeln(' void set$camel() {');
|
| - write(updateTag);
|
| - writeln(' }');
|
| - } else if (slotType.isString) {
|
| - String type = '_uint16BuilderList';
|
| - writeln(' void set ${slotName}(String value) {');
|
| - write(updateTag);
|
| - writeln(' NewString(new $type(), ${slot.offset}, value);');
|
| - writeln(' }');
|
| - writeln(' List<int> init${camel}Data(int length) {');
|
| - write(updateTag);
|
| - writeln(' $type result = NewList(new $type(), ${slot.offset},'
|
| - ' length, 2);');
|
| - writeln(' return result;');
|
| - writeln(' }');
|
| - } else if (slotType.isPrimitive) {
|
| - String setter = _SETTERS[slotType.identifier];
|
| - write(' void set ${slotName}(');
|
| - writeType(slotType);
|
| - writeln(' value) {');
|
| - write(updateTag);
|
| - String offset = '\$offset + ${slot.offset}';
|
| - if (slotType.isBool) {
|
| - writeln(' \$segment.memory.$setter($offset, value ? 1 : 0);');
|
| - } else {
|
| - writeln(' \$segment.memory.$setter($offset, value);');
|
| - }
|
| - writeln(' }');
|
| - } else {
|
| - write(' ');
|
| - writeReturnType(slotType);
|
| - writeln(' init$camel() {');
|
| - write(updateTag);
|
| - if (!slotType.isPointer) {
|
| - write(' return new ');
|
| - writeReturnType(slotType);
|
| - writeln('()');
|
| - writeln(' ..\$segment = \$segment');
|
| - writeln(' ..\$offset = \$offset + ${slot.offset};');
|
| - } else {
|
| - Struct element = slotType.resolved;
|
| - StructLayout elementLayout = element.layout;
|
| - int size = elementLayout.size;
|
| - write(' return NewStruct(new ');
|
| - writeReturnType(slotType);
|
| - writeln('(), ${slot.offset}, $size);');
|
| - }
|
| - writeln(' }');
|
| - }
|
| - }
|
| - writeln('}');
|
| - }
|
| -
|
| - visitUnion(Union node) {
|
| - // Ignored for now.
|
| - }
|
| -
|
| - visitMethod(Method node) {
|
| - methods.add(node);
|
| - if (node.outputKind == OutputKind.STRUCT) {
|
| - String builderName = '${node.returnType.identifier}Builder';
|
| - write(' void ${node.name}(');
|
| - visitNodes(node.arguments, (first) => first ? '' : ', ');
|
| - write('${node.arguments.length > 0 ? ", " : ""}$builderName result');
|
| - } else {
|
| - assert(node.outputKind == OutputKind.PRIMITIVE);
|
| - write(' ');
|
| - writeType(node.returnType);
|
| - write(' ${node.name}(');
|
| - visitNodes(node.arguments, (first) => first ? '' : ', ');
|
| - }
|
| - writeln(');');
|
| - }
|
| -
|
| - visitFormal(Formal node) {
|
| - writeType(node.type);
|
| - write(' ${node.name}');
|
| - }
|
| -
|
| - static const Map<String, String> _types = const {
|
| - 'void' : 'void',
|
| - 'bool' : 'bool',
|
| -
|
| - 'uint8' : 'int',
|
| - 'uint16' : 'int',
|
| -
|
| - 'int8' : 'int',
|
| - 'int16' : 'int',
|
| - 'int32' : 'int',
|
| - 'int64' : 'int',
|
| -
|
| - 'float32' : 'double',
|
| - 'float64' : 'double',
|
| - };
|
| -
|
| - void writeType(Type node) {
|
| - Node resolved = node.resolved;
|
| - if (resolved != null) {
|
| - write(node.identifier);
|
| - } else {
|
| - String type = _types[node.identifier];
|
| - write(type);
|
| - }
|
| - }
|
| -
|
| - void writeReturnType(Type node) {
|
| - Node resolved = node.resolved;
|
| - if (resolved != null) {
|
| - write('${node.identifier}Builder');
|
| - } else {
|
| - String type = _types[node.identifier];
|
| - write(type);
|
| - }
|
| - }
|
| -
|
| -}
|
|
|