// Copyright (c) 2015, 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 file for testing source mappings of invocations.

var counter = 0;

main(args) {
  counter++;
  invokes(args);
  return counter;
}

invokes(parameter) {
  counter++;
  toplevelFunction();
  toplevelField();
  toplevelFinalField();
  toplevelConstField();
  toplevelGetter();
  C.staticFunction();
  C.staticField();
  C.staticFinalField();
  C.staticConstField();
  C.staticGetter();

  var localVariable = () {
    counter++;
  };
  localFunction() {
    counter++;
  }

  parameter();
  localVariable();
  localFunction();
  (parameter)();

  parameter.dynamicInvoke();
  C(parameter).instanceInvokes();
  C(parameter).superInvokes();
  C(parameter).invalidInvokes();
  C(parameter).thisInstanceInvokes();
}

toplevelFunction() {
  counter++;
}

dynamic toplevelField = () {
  counter++;
};

final toplevelFinalField = toplevelFunction;

const toplevelConstField = toplevelFunction;

get toplevelGetter => () {
      counter++;
    };

typedef F();

class B {
  B(parameter);

  superMethod() {
    counter++;
  }

  dynamic superField = () {
    counter++;
  };

  get superGetter => () {
        counter++;
      };
}

class C<T> extends B {
  C(parameter) : super(parameter);

  static staticFunction() {
    counter++;
  }

  static dynamic staticField = () {
    counter++;
  };

  static final staticFinalField = staticFunction;

  static const staticConstField = staticFunction;

  static get staticGetter => () {
        counter++;
      };

  instanceMethod() {
    counter++;
  }

  dynamic instanceField = () {
    counter++;
  };

  get instanceGetter => () {
        counter++;
      };

  instanceInvokes() {
    instanceMethod();
    instanceField();
    instanceGetter();
  }

  superInvokes() {
    super.superMethod();
    super.superField();
    super.superGetter();
  }

  invalidInvokes() {
    (C as dynamic)();
    (dynamic as dynamic)();
    (F as dynamic)();
    (T as dynamic)();
  }

  thisInstanceInvokes() {
    this.instanceMethod();
    this.instanceField();
    this.instanceGetter();
  }
}
