// 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.

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);
}
