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