blob: c5b3be26041fb0887639019af860bd43bde5f38d [file] [log] [blame]
// 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.
// @dart = 2.7
// 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; }
self.makeNode = function(p){return new Node(p);};
self.nativeConstructor(Node);
})()""");
applyTestExtensions(['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);
}