// 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 {
  final Node parentNode;

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