|  | // 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. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  | library test.method_location; | 
|  |  | 
|  | import "dart:mirrors"; | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | part 'method_mirror_location_other.dart'; | 
|  |  | 
|  | // We only check for a suffix of the uri because the test might be run from | 
|  | // any number of absolute paths. | 
|  | expectLocation(Mirror mirror, String uriSuffix, int line, int column) { | 
|  | MethodMirror methodMirror; | 
|  | if (mirror is ClosureMirror) { | 
|  | methodMirror = mirror.function; | 
|  | } else { | 
|  | methodMirror = mirror as MethodMirror; | 
|  | } | 
|  | Expect.isTrue(methodMirror is MethodMirror); | 
|  | final location = methodMirror.location; | 
|  | final uri = location.sourceUri; | 
|  | Expect.isTrue(uri.toString().endsWith(uriSuffix), "Expected suffix $uriSuffix in $uri"); | 
|  | Expect.equals(line, location.line, "line"); | 
|  | Expect.equals(column, location.column, "column"); | 
|  | } | 
|  |  | 
|  | class ClassInMainFile { | 
|  |  | 
|  | ClassInMainFile(); | 
|  |  | 
|  | method() {} | 
|  | } | 
|  |  | 
|  | void topLevelInMainFile() {} | 
|  | spaceIdentedInMainFile() {} | 
|  | tabIdentedInMainFile() {} | 
|  |  | 
|  | class HasImplicitConstructor {} | 
|  |  | 
|  | typedef bool Predicate(num n); | 
|  |  | 
|  | main() { | 
|  | localFunction(x) { | 
|  | return x; | 
|  | } | 
|  |  | 
|  | String mainSuffix = 'method_mirror_location_test.dart'; | 
|  | String otherSuffix = 'method_mirror_location_other.dart'; | 
|  |  | 
|  | // This file. | 
|  | expectLocation(reflectClass(ClassInMainFile).declarations[#ClassInMainFile], | 
|  | mainSuffix, 31, 3); | 
|  | expectLocation( | 
|  | reflectClass(ClassInMainFile).declarations[#method], mainSuffix, 33, 3); | 
|  | expectLocation(reflect(topLevelInMainFile), mainSuffix, 36, 1); | 
|  | expectLocation(reflect(spaceIdentedInMainFile), mainSuffix, 37, 3); | 
|  | expectLocation(reflect(tabIdentedInMainFile), mainSuffix, 38, 2); | 
|  | expectLocation(reflect(localFunction), mainSuffix, 45, 3); | 
|  |  | 
|  | // Another part. | 
|  | expectLocation(reflectClass(ClassInOtherFile).declarations[#ClassInOtherFile], | 
|  | otherSuffix, 8, 3); | 
|  | expectLocation( | 
|  | reflectClass(ClassInOtherFile).declarations[#method], otherSuffix, 10, 3); | 
|  | expectLocation(reflect(topLevelInOtherFile), otherSuffix, 13, 1); | 
|  | expectLocation(reflect(spaceIdentedInOtherFile), otherSuffix, 15, 3); | 
|  | expectLocation(reflect(tabIdentedInOtherFile), otherSuffix, 17, 2); | 
|  |  | 
|  | // Synthetic methods. | 
|  | Expect.isNull(reflectClass(HasImplicitConstructor) | 
|  | .declarations[#HasImplicitConstructor] | 
|  | .location); | 
|  | Expect.isNull( | 
|  | (reflectType(Predicate) as TypedefMirror).referent.callMethod.location); | 
|  | } |