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

// Test that everything reachable from a [MirrorSystem] can be accessed.

library test.mirrors.reader;

import 'dart:mirrors';
import 'package:expect/expect.dart';
import 'mirrors_reader.dart';

class RuntimeMirrorsReader extends MirrorsReader {
  final MirrorSystem mirrorSystem;
  final String mirrorSystemType;

  RuntimeMirrorsReader(
    MirrorSystem mirrorSystem, {
    bool verbose = false,
    bool includeStackTrace = false,
  }) : this.mirrorSystem = mirrorSystem,
       this.mirrorSystemType = '${mirrorSystem.runtimeType}',
       super(verbose: verbose, includeStackTrace: includeStackTrace);

  visitLibraryMirror(LibraryMirror mirror) {
    super.visitLibraryMirror(mirror);
    Expect.equals(mirror, mirrorSystem.libraries[mirror.uri]);
  }

  visitClassMirror(ClassMirror mirror) {
    super.visitClassMirror(mirror);
    Expect.isNotNull(mirror.owner);
  }

  bool allowUnsupported(var receiver, String tag, UnsupportedError? exception) {
    if (mirrorSystemType == '_MirrorSystem') {
      // VM mirror system.
      if (tag.endsWith('location')) {
        return receiver is ParameterMirror;
      }
    } else if (mirrorSystemType == 'JsMirrorSystem') {
      // Dart2js runtime mirror system.
      if (tag.endsWith('.metadata')) {
        return true; // Issue 10905.
      }
    }
    return false;
  }

  bool expectUnsupported(
    var receiver,
    String tag,
    UnsupportedError? exception,
  ) {
    // [DeclarationMirror.location] is intentionally not supported in runtime
    // mirrors.

    if (mirrorSystemType == '_MirrorSystem') {
      // VM mirror system.
    } else if (mirrorSystemType == 'JsMirrorSystem') {
      // Dart2js runtime mirror system.
      if (receiver is DeclarationMirror && tag == 'location') {
        return true;
      }
    }
    return false;
  }
}

void main([List<String> arguments = const <String>[]]) {
  MirrorSystem mirrors = currentMirrorSystem();
  MirrorsReader reader = new RuntimeMirrorsReader(
    mirrors,
    verbose: arguments.contains('-v'),
    includeStackTrace: arguments.contains('-s'),
  );
  reader.checkMirrorSystem(mirrors);
}
