blob: 2367a4517bc949bd5dfa83413201abc2804262ef [file] [log] [blame]
# Copyright (c) 2022, 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.md file.
# Test that shows that static interop erasure doesn't work with modular/
# incremental compilation.
type: newworld
target: dartdevc
worlds:
- entry: main.dart
sources:
main.dart: |
import 'lib1.dart';
import 'lib2.dart';
main() {
StaticJSClass foo = topLevelMethod();
StaticJSClass Function() fooFunction = topLevelMethod;
foo = topLevelGetter;
topLevelSetter = (StaticJSClass s) {};
StaticJSClass bar = Class.staticMethod();
StaticJSClass Function() barFunction = Class.staticMethod;
bar = Class.staticGetter;
Class.staticSetter = (StaticJSClass s) {};
Class c = new Class();
StaticJSClass baz = c.instanceMethod();
StaticJSClass Function() bazFunction = c.instanceMethod;
baz = c.instanceGetter;
c.instanceSetter = (StaticJSClass s) {};
}
class Subclass extends Class {
void method() {
StaticJSClass baz = super.instanceMethod();
StaticJSClass Function() bazFunction = super.instanceMethod;
baz = super.instanceGetter;
super.instanceSetter = (StaticJSClass s) {};
}
}
lib1.dart: |
import 'lib2.dart';
StaticJSClass topLevelMethod() => new StaticJSClass();
StaticJSClass get topLevelGetter => new StaticJSClass();
void set topLevelSetter(void Function(StaticJSClass) f) {}
class Class {
StaticJSClass instanceMethod() => new StaticJSClass.factory();
StaticJSClass get instanceGetter => new StaticJSClass();
void set instanceSetter(void Function(StaticJSClass) f) {}
static StaticJSClass staticMethod() => new StaticJSClass.factory();
static StaticJSClass get staticGetter => new StaticJSClass();
static void set staticSetter(void Function(StaticJSClass) f) {}
}
lib2.dart: |
@JS()
library static_interop;
import 'package:js/js.dart';
@JS()
external void eval(String code);
@JS('JSClass')
@staticInterop
class StaticJSClass {
external StaticJSClass();
factory StaticJSClass.factory() {
return StaticJSClass();
}
}
void setUp() {
eval('''function JSClass() {}''');
}
js/lib/js.dart: |
class JS {
final String? name;
const JS([this.name]);
}
class _StaticInterop {
const _StaticInterop();
}
const _StaticInterop staticInterop = _StaticInterop();
.dart_tool/package_config.json: |
{
"configVersion": 2,
"packages": [
{
"name": "js",
"rootUri": "../js",
"packageUri": "lib/"
}
]
}
expectedLibraryCount: 4
- entry: main.dart
worldType: updated
expectInitializeFromDill: false
invalidate:
- main.dart
sources:
main.dart: |
import 'lib1.dart';
import 'lib2.dart';
main() {
StaticJSClass foo = topLevelMethod();
StaticJSClass Function() fooFunction = topLevelMethod;
foo = topLevelGetter;
topLevelSetter = (StaticJSClass s) {};
StaticJSClass bar = Class.staticMethod();
StaticJSClass Function() barFunction = Class.staticMethod;
bar = Class.staticGetter;
Class.staticSetter = (StaticJSClass s) {};
Class c = new Class();
StaticJSClass baz = c.instanceMethod();
StaticJSClass Function() bazFunction = c.instanceMethod;
baz = c.instanceGetter;
c.instanceSetter = (StaticJSClass s) {};
print('Hello'); // In-body change.
}
class Subclass extends Class {
void method() {
StaticJSClass baz = super.instanceMethod();
StaticJSClass Function() bazFunction = super.instanceMethod;
baz = super.instanceGetter;
super.instanceSetter = (StaticJSClass s) {};
}
}
expectedLibraryCount: 4
errors: true
advancedInvalidation: bodiesOnly