| // Copyright (c) 2018, 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. | 
 |  | 
 | import 'dart:async'; | 
 | import 'dart:developer'; | 
 |  | 
 | import 'package:observatory/service_io.dart'; | 
 |  | 
 | import 'service_test_common.dart'; | 
 | import 'test_helper.dart'; | 
 |  | 
 | void testFunction() { | 
 |   debugger(); | 
 | } | 
 |  | 
 | Future validateLocation(Location? location, Object object) async { | 
 |   if (location == null) return; | 
 |   if (location.tokenPos! < 0) return; | 
 |   if (location.script!.uri == 'dart:_internal-patch/class_id_fasta.dart') { | 
 |     // Injected fields from this script cannot be reloaded. | 
 |     return; | 
 |   } | 
 |  | 
 |   // Ensure the script is loaded. | 
 |   final Script script = await location.script!.load() as Script; | 
 |  | 
 |   // Use the more low-level functions. | 
 |   final line = script.tokenToLine(location.tokenPos); | 
 |   if (line == null) { | 
 |     throw 'missing location for $object in script ${script.uri}'; | 
 |   } | 
 |   script.getLine(line); | 
 |   script.tokenToCol(location.tokenPos); | 
 |  | 
 |   // Use the helper functions. | 
 |   await location.getLine(); | 
 |   await location.getColumn(); | 
 | } | 
 |  | 
 | Future validateFieldLocation(Field field) async { | 
 |   field = await field.load() as Field; | 
 |   await validateLocation(field.location, field); | 
 | } | 
 |  | 
 | Future validateFunctionLocation(ServiceFunction fun) async { | 
 |   fun = await fun.load() as ServiceFunction; | 
 |   await validateLocation(fun.location, fun); | 
 | } | 
 |  | 
 | Future validateClassLocation(Class klass) async { | 
 |   klass = await klass.load() as Class; | 
 |   await validateLocation(klass.location, klass); | 
 |  | 
 |   for (Field field in klass.fields) { | 
 |     await validateFieldLocation(field); | 
 |   } | 
 |   for (ServiceFunction fun in klass.functions) { | 
 |     await validateFunctionLocation(fun); | 
 |   } | 
 | } | 
 |  | 
 | var tests = <IsolateTest>[ | 
 |   hasStoppedAtBreakpoint, | 
 |   (Isolate isolate) async { | 
 |     // Force everything to be compiled. | 
 |     final params = { | 
 |       'reports': ['Coverage'], | 
 |       'forceCompile': true | 
 |     }; | 
 |     await isolate.invokeRpcNoUpgrade('getSourceReport', params); | 
 |  | 
 |     // Loop over all libraries, classes, functions and fields to ensure . | 
 |     for (Library lib in isolate.libraries) { | 
 |       lib = await lib.load() as Library; | 
 |  | 
 |       for (Field field in lib.variables) { | 
 |         await validateFieldLocation(field); | 
 |       } | 
 |       for (ServiceFunction fun in lib.functions) { | 
 |         await validateFunctionLocation(fun); | 
 |       } | 
 |       for (Class klass in lib.classes) { | 
 |         await validateClassLocation(klass); | 
 |       } | 
 |     } | 
 |   }, | 
 | ]; | 
 |  | 
 | main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction); |