Index: pkg/smoke/lib/static_debug.dart |
diff --git a/pkg/smoke/lib/static_debug.dart b/pkg/smoke/lib/static_debug.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3c4b9a6719e8c44c1b8059b9438c04499f757190 |
--- /dev/null |
+++ b/pkg/smoke/lib/static_debug.dart |
@@ -0,0 +1,122 @@ |
+// Copyright (c) 2014, the Dart 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. |
+ |
+/// Static implementation of smoke services that uses code-generated data and |
+/// verifies that the results match what we would get with a mirror-based |
+/// implementation. |
+library smoke.static_debug; |
+ |
+export 'package:smoke/static.dart' show StaticConfiguration, Getter, Setter; |
+import 'package:smoke/static.dart'; |
+import 'package:smoke/mirrors.dart'; |
+import 'package:smoke/smoke.dart'; |
+ |
+import 'src/common.dart' show compareLists; |
+ |
+/// Set up the smoke package to use a static implementation based on the given |
+/// [configuration]. |
+useGeneratedCode(StaticConfiguration configuration) { |
+ configure(new _DebugObjectAccessorService(configuration), |
+ new _DebugTypeInspectorService(configuration), |
+ new _DebugSymbolConverterService(configuration)); |
+} |
+ |
+/// Implements [ObjectAccessorService] using a static configuration. |
+class _DebugObjectAccessorService implements ObjectAccessorService { |
+ GeneratedObjectAccessorService _static; |
+ ReflectiveObjectAccessorService _mirrors; |
+ |
+ _DebugObjectAccessorService(StaticConfiguration configuration) |
+ : _static = new GeneratedObjectAccessorService(configuration), |
+ _mirrors = new ReflectiveObjectAccessorService(); |
+ |
+ read(Object object, Symbol name) => |
+ _check('read', [object, name], |
+ _static.read(object, name), |
+ _mirrors.read(object, name)); |
+ |
+ // Note: we can't verify operations with side-effects like write or invoke. |
+ void write(Object object, Symbol name, value) => |
+ _static.write(object, name, value); |
+ |
+ invoke(object, Symbol name, List args, {Map namedArgs, bool adjust: false}) => |
+ _static.invoke(object, name, args, namedArgs: namedArgs, adjust: adjust); |
+} |
+ |
+/// Implements [TypeInspectorService] using a static configuration. |
+class _DebugTypeInspectorService implements TypeInspectorService { |
+ GeneratedTypeInspectorService _static; |
+ ReflectiveTypeInspectorService _mirrors; |
+ |
+ _DebugTypeInspectorService(StaticConfiguration configuration) |
+ : _static = new GeneratedTypeInspectorService(configuration), |
+ _mirrors = new ReflectiveTypeInspectorService(); |
+ |
+ bool isSubclassOf(Type type, Type supertype) => |
+ _check('isSubclassOf', [type, supertype], |
+ _static.isSubclassOf(type, supertype), |
+ _mirrors.isSubclassOf(type, supertype)); |
+ |
+ bool hasGetter(Type type, Symbol name) => |
+ _check('hasGetter', [type, name], |
+ _static.hasGetter(type, name), |
+ _mirrors.hasGetter(type, name)); |
+ |
+ bool hasSetter(Type type, Symbol name) => |
+ _check('hasSetter', [type, name], |
+ _static.hasSetter(type, name), |
+ _mirrors.hasSetter(type, name)); |
+ |
+ bool hasInstanceMethod(Type type, Symbol name) => |
+ _check('hasInstanceMethod', [type, name], |
+ _static.hasInstanceMethod(type, name), |
+ _mirrors.hasInstanceMethod(type, name)); |
+ |
+ bool hasStaticMethod(Type type, Symbol name) => |
+ _check('hasStaticMethod', [type, name], |
+ _static.hasStaticMethod(type, name), |
+ _mirrors.hasStaticMethod(type, name)); |
+ |
+ Declaration getDeclaration(Type type, Symbol name) => |
+ _check('getDeclaration', [type, name], |
+ _static.getDeclaration(type, name), |
+ _mirrors.getDeclaration(type, name)); |
+ |
+ List<Declaration> query(Type type, QueryOptions options) => |
+ _check('query', [type, options], |
+ _static.query(type, options), |
+ _mirrors.query(type, options)); |
+} |
+ |
+/// Implements [SymbolConverterService] using a static configuration. |
+class _DebugSymbolConverterService implements SymbolConverterService { |
+ GeneratedSymbolConverterService _static; |
+ ReflectiveSymbolConverterService _mirrors; |
+ |
+ _DebugSymbolConverterService(StaticConfiguration configuration) |
+ : _static = new GeneratedSymbolConverterService(configuration), |
+ _mirrors = new ReflectiveSymbolConverterService(); |
+ |
+ String symbolToName(Symbol symbol) => |
+ _check('symbolToName', [symbol], |
+ _static.symbolToName(symbol), |
+ _mirrors.symbolToName(symbol)); |
+ |
+ Symbol nameToSymbol(String name) => |
+ _check('nameToSymbol', [name], |
+ _static.nameToSymbol(name), |
+ _mirrors.nameToSymbol(name)); |
+} |
+ |
+_check(String operation, List arguments, staticResult, mirrorResult) { |
+ if (staticResult == mirrorResult) return staticResult; |
+ if (staticResult is List && mirrorResult is List && |
+ compareLists(staticResult, mirrorResult, unordered: true)) { |
+ return staticResult; |
+ } |
+ print('warning: inconsistent result on $operation(${arguments.join(', ')})\n' |
+ 'smoke.mirrors result: $mirrorResult\n' |
+ 'smoke.static result: $staticResult\n'); |
+ return staticResult; |
+} |