Index: tools/servicec/lib/src/resolver.dart |
diff --git a/tools/servicec/lib/src/resolver.dart b/tools/servicec/lib/src/resolver.dart |
deleted file mode 100644 |
index 3e4c6c7166239931ed4a78bf0d2b4328445fe253..0000000000000000000000000000000000000000 |
--- a/tools/servicec/lib/src/resolver.dart |
+++ /dev/null |
@@ -1,196 +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.resolver; |
- |
-import 'dart:core' hide Type; |
- |
-import 'parser.dart'; |
-import 'primitives.dart' as primitives; |
-import 'struct_layout.dart'; |
- |
-void resolve(Unit unit) { |
- Definer definer = new Definer(); |
- definer.visit(unit); |
- Resolver resolver = new Resolver(definer.definitions); |
- resolver.visit(unit); |
- resolver.resolveAllStructs(); |
-} |
- |
-class Definer extends ResolutionVisitor { |
- final Map<String, Node> definitions = <String, Node>{}; |
- |
- visitService(Service node) { |
- define(node.name, node); |
- super.visitService(node); |
- } |
- |
- visitStruct(Struct node) { |
- define(node.name, node); |
- super.visitStruct(node); |
- } |
- |
- void define(String name, Node node) { |
- if (definitions.containsKey(name)) { |
- throw "Multiple definitions for $name"; |
- } |
- definitions[name] = node; |
- } |
-} |
- |
-class Resolver extends ResolutionVisitor { |
- final Map<String, Node> definitions; |
- final Map<Struct, Set<Struct>> dependencyMap = <Struct, Set<Struct>>{}; |
- Resolver(this.definitions); |
- |
- void resolveAllStructs() { |
- for (Struct struct in dependencyMap.keys) { |
- resolveStruct(struct, new Set<Struct>()); |
- } |
- } |
- |
- void resolveStruct(Struct struct, Set<Struct> visited) { |
- if (visited.contains(struct)) { |
- if (struct.layout != null) return; |
- throw new UnsupportedError("Cyclic struct graph at ${struct.name}."); |
- } |
- |
- visited.add(struct); |
- Set<Struct> dependencies = dependencyMap[struct]; |
- dependencies.forEach((Struct each) { resolveStruct(each, visited); }); |
- struct.layout = new StructLayout(struct); |
- } |
- |
- visitMethod(Method node) { |
- super.visitMethod(node); |
- |
- if (node.returnType.isPrimitive) { |
- node.outputKind = OutputKind.PRIMITIVE; |
- } else { |
- node.outputKind = OutputKind.STRUCT; |
- if (!node.returnType.isPointer) { |
- throw new UnsupportedError("Cannot return structs by value."); |
- } |
- } |
- |
- List<Formal> arguments = node.arguments; |
- if (arguments.any((e) => !e.type.isPrimitive && !e.type.isPointer)) { |
- throw new UnsupportedError("Cannot pass structs by value as arguments."); |
- } |
- |
- if (arguments.any((e) => e.type.isVoid)) { |
- throw new UnsupportedError("Cannot pass void as argument."); |
- } |
- |
- if (arguments.length == 1) { |
- node.inputKind = arguments[0].type.isPrimitive |
- ? InputKind.PRIMITIVES |
- : InputKind.STRUCT; |
- } else if (arguments.any((Formal each) => !each.type.isPrimitive)) { |
- throw new UnsupportedError("Methods accepting multiple arguments can " |
- "only take primitive values."); |
- } else { |
- node.inputKind = InputKind.PRIMITIVES; |
- } |
- |
- if (node.inputKind == InputKind.PRIMITIVES) { |
- StructLayout layout = new StructLayout.forArguments(arguments); |
- node.inputPrimitiveStructLayout = layout; |
- } |
- } |
- |
- visitStruct(Struct node) { |
- super.visitStruct(node); |
- |
- Iterable<Struct> computeDependencies(Iterable<Formal> slots) { |
- return slots |
- .where((Formal slot) => !slot.type.isPointer) |
- .where((Formal slot) => !slot.type.isPrimitive && |
- !slot.type.isList && |
- !slot.type.isString) |
- .map((Formal slot) => definitions[slot.type.identifier]); |
- } |
- |
- Set<Struct> dependencies = dependencyMap[node] = |
- computeDependencies(node.slots).toSet(); |
- |
- if (node.slots.any((Formal slot) => slot.type.isVoid)) { |
- throw new UnsupportedError("Cannot have void slots in struct"); |
- } |
- |
- if (node.unions.isNotEmpty) { |
- if (node.unions.length != 1) { |
- throw new UnsupportedError("Structs can have at most one union"); |
- } |
- Union union = node.unions.single; |
- union.struct = node; |
- node.slots.add(union.tag); |
- dependencies.addAll(computeDependencies(union.slots)); |
- } |
- } |
- |
- void resolveType(Type node) { |
- if (node.isString) return; |
- primitives.PrimitiveType primitiveType = primitives.lookup(node.identifier); |
- if (primitiveType != null) { |
- node.primitiveType = primitiveType; |
- } else { |
- String type = node.identifier; |
- if (definitions.containsKey(type)) { |
- node.resolved = definitions[type]; |
- } else { |
- throw new UnsupportedError("Cannot deal with type $type"); |
- } |
- } |
- } |
- |
- visitFormal(Formal node) { |
- super.visitFormal(node); |
- if (node.type.isList) { |
- ListType listType = node.type; |
- if (listType.elementType.isPointer) { |
- throw new UnsupportedError("Cannot handle lists of pointers"); |
- } |
- } else if (node.type.isPointer) { |
- if (node.type.isPrimitive) { |
- throw new UnsupportedError("Cannot handle pointers to primitive types"); |
- } |
- } |
- } |
-} |
- |
-class ResolutionVisitor extends Visitor { |
- visit(Node node) => node.accept(this); |
- |
- visitUnit(Unit node) { |
- node.services.forEach(visit); |
- node.structs.forEach(visit); |
- } |
- |
- visitService(Service node) { |
- node.methods.forEach(visit); |
- } |
- |
- visitStruct(Struct node) { |
- node.slots.forEach(visit); |
- node.unions.forEach(visit); |
- } |
- |
- visitUnion(Union node) { |
- visit(node.tag); |
- node.slots.forEach(visit); |
- } |
- |
- visitMethod(Method node) { |
- node.arguments.forEach(visit); |
- resolveType(node.returnType); |
- } |
- |
- visitFormal(Formal node) { |
- resolveType(node.type); |
- } |
- |
- void resolveType(Type node) { |
- } |
-} |