// Copyright (c) 2011, 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.

// A native class has no defined constructor.
// This regression test verifies that compiler accounts for hidden constructor
// when analysing field values.

import "native_testing.dart";

@Native("Node")
class Node {
  Node get parentNode native;

  ModelSource? _modelSource; // If null, inherited from parent.

  ModelSource? get modelSource {
    for (Node node = this; node != null; node = node.parentNode) {
      ModelSource? source = node._modelSource;
      if (source != null) return source;
    }
    return null;
  }

  // Copy of above code renamed with suffix '2'.

  ModelSource? _modelSource2; // If null, inherited from parent.

  ModelSource? get modelSource2 {
    for (Node node = this; node != null; node = node.parentNode) {
      ModelSource? source = node._modelSource2;
      if (source != null) return source;
    }
    return null;
  }
}

makeNode(parent) native;

class ModelSource {
  var name;
  ModelSource(this.name);
  toString() => 'ModelSource($name)';
}

void setup() {
  JS('', r"""
(function(){
  // This code is inside 'setup' and so not accessible from the global scope.
  function Node(parent){ this.parentNode = parent; }
  makeNode = function(p){return new Node(p);};
  self.nativeConstructor(Node);
})()""");
}

main() {
  nativeTesting();
  setup();

  var n1 = makeNode(null);
  var n2 = makeNode(n1);
  var n3 = makeNode(n2);

  var m1 = new ModelSource('1');
  n2._modelSource = null; // null write.
  n2._modelSource = m1; // Non-null write.
  var x1 = n3.modelSource;
  Expect.identical(m1, x1);

  var m2 = new ModelSource('2');
  n2._modelSource2 = m2; // The only write is non-null.
  var x2 = n3.modelSource2;
  Expect.identical(m2, x2);
}
