| Index: sdk/lib/_internal/compiler/implementation/universe/universe.dart
|
| ===================================================================
|
| --- sdk/lib/_internal/compiler/implementation/universe/universe.dart (revision 22031)
|
| +++ sdk/lib/_internal/compiler/implementation/universe/universe.dart (working copy)
|
| @@ -91,6 +91,29 @@
|
| bool hasFieldSetter(Element member, Compiler compiler) {
|
| return fieldSetters.contains(member);
|
| }
|
| +
|
| + bool onlyReachesFinalFields(Selector getterSelector, Compiler compiler) {
|
| + assert(getterSelector.isGetter());
|
| + Selector setterSelector = new Selector.setterFrom(getterSelector);
|
| + if (getterSelector.mask != null) {
|
| + setterSelector = new TypedSelector(getterSelector.mask, setterSelector);
|
| + }
|
| +
|
| + bool hasInvokedSetter = invokedSetters[setterSelector.name] != null
|
| + && !invokedSetters[setterSelector.name].isEmpty;
|
| +
|
| + Iterable<Element> targets =
|
| + compiler.world.allFunctions.filter(setterSelector);
|
| + for (Element target in targets) {
|
| + assert(!target.isAbstractField());
|
| + // Final fields have been filtered out.
|
| + assert(!target.modifiers.isFinal());
|
| + if (target.isNative()) return false;
|
| + if (!target.isField()) return false;
|
| + if (hasInvokedSetter) return false;
|
| + }
|
| + return true;
|
| + }
|
| }
|
|
|
| class SelectorKind {
|
| @@ -140,6 +163,9 @@
|
| Selector.setter(SourceString name, LibraryElement library)
|
| : this(SelectorKind.SETTER, name, library, 1);
|
|
|
| + Selector.setterFrom(Selector selector)
|
| + : this(SelectorKind.SETTER, selector.name, selector.library, 1);
|
| +
|
| Selector.unaryOperator(SourceString name)
|
| : this(SelectorKind.OPERATOR,
|
| Elements.constructOperatorName(name, true),
|
|
|