This file was autogenerated from running the shaker test suite.
To update this file, either copy the output from a failing test or run
pkg/front_end/tool/fasta testing shaker -DupdateExpectations=true

library dart:async:
  - member dart.async::_asyncThenWrapperHelper
  - member dart.async::_asyncErrorWrapperHelper
  - member dart.async::_awaitHelper
  - typedef ControllerCallback
  - typedef ControllerCancelCallback
  - class _AsyncStarStreamController
    - controller
    - asyncStarBody
    - isAdding
    - onListenReceived
    - isScheduled
    - isSuspendedAtYield
    - cancellationCompleter
    - (default constructor)
    - stream
    - runBody
    - scheduleGenerator
    - add
    - addStream
    - addError
    - close
    - onListen
    - onResume
    - onCancel
  - class FutureOr
  - class Future
    - microtask
    - then
    - catchError
    - whenComplete
    - asStream
    - timeout
  - class Completer
    - sync
    - future
    - complete
    - completeError
    - isCompleted
  - class Stream
    - isBroadcast
    - asBroadcastStream
    - listen
    - where
    - map
    - asyncMap
    - asyncExpand
    - handleError
    - expand
    - pipe
    - transform
    - reduce
    - fold
    - join
    - contains
    - forEach
    - every
    - any
    - length
    - isEmpty
    - cast
    - retype
    - toList
    - toSet
    - drain
    - take
    - takeWhile
    - skip
    - skipWhile
    - distinct
    - first
    - last
    - single
    - firstWhere
    - lastWhere
    - singleWhere
    - elementAt
    - timeout
  - class StreamSubscription
    - cancel
    - onData
    - onError
    - onDone
    - pause
    - resume
    - isPaused
    - asFuture
  - class EventSink
    - add
    - addError
    - close
  - class StreamConsumer
    - addStream
    - close
  - class StreamSink
    - close
    - done
  - class StreamTransformer
    - bind
    - cast
    - retype
  - class StreamIterator
    - moveNext
    - current
    - cancel
  - class StreamController
    - stream
    - onListen
    - onListen
    - onPause
    - onPause
    - onResume
    - onResume
    - onCancel
    - onCancel
    - sink
    - isClosed
    - isPaused
    - hasListener
    - add
    - addError
    - close
    - addStream
  - class _StreamIterator
    - (default constructor)
    - current
    - moveNext
    - cancel

library dart:collection:
  - class IterableBase

library dart:_internal:
  - class ExternalName
    - name
    - (default constructor)
  - class EfficientLengthIterable
    - length
  - class Symbol
    - ==
    - hashCode
    - toString

library dart:math:
  - class Random
    - nextInt
    - nextDouble
    - nextBool

library dart:core:
  - member print
  - typedef _SyncGeneratorCallback
  - class _SyncIterable
    - (default constructor)
    - iterator
  - class _SyncIterator
    - current
    - moveNext
  - class _CompileTimeError
    - (default constructor)
    - toString
  - class _DuplicatedFieldInitializerError
    - (default constructor)
    - toString
  - class _InvocationMirror
    - dart.core::_withoutType
    - memberName
    - typeArguments
    - positionalArguments
    - namedArguments
    - isMethod
    - isAccessor
    - isGetter
    - isSetter
  - class bool
    - hashCode
    - toString
  - class Comparable
    - compareTo
  - class double
    - remainder
    - +
    - -
    - *
    - %
    - /
    - ~/
    - unary-
    - abs
    - sign
    - round
    - floor
    - ceil
    - truncate
    - roundToDouble
    - floorToDouble
    - ceilToDouble
    - truncateToDouble
    - toString
  - class Duration
    - +
    - -
    - *
    - ~/
    - <
    - >
    - <=
    - >=
    - inDays
    - inHours
    - inMinutes
    - inSeconds
    - inMilliseconds
    - inMicroseconds
    - ==
    - hashCode
    - compareTo
    - toString
    - isNegative
    - abs
    - unary-
  - class Error
    - stackTrace
  - class FallThroughError
    - dart.core::_create
    - toString
  - class _ConstantExpressionError
    - (default constructor)
  - class Function
    - hashCode
    - ==
  - class int
    - &
    - |
    - ^
    - ~
    - <<
    - >>
    - modPow
    - modInverse
    - gcd
    - isEven
    - isOdd
    - bitLength
    - toUnsigned
    - toSigned
    - unary-
    - abs
    - sign
    - round
    - floor
    - ceil
    - truncate
    - roundToDouble
    - floorToDouble
    - ceilToDouble
    - truncateToDouble
    - toString
    - toRadixString
  - class Invocation
    - memberName
    - positionalArguments
    - namedArguments
    - isMethod
    - isGetter
    - isSetter
    - isAccessor
  - class Iterable
    - iterator
    - cast
    - retype
    - followedBy
    - map
    - where
    - whereType
    - expand
    - contains
    - forEach
    - reduce
    - fold
    - every
    - join
    - any
    - toList
    - toSet
    - length
    - isEmpty
    - isNotEmpty
    - take
    - takeWhile
    - skip
    - skipWhile
    - first
    - last
    - single
    - firstWhere
    - lastWhere
    - singleWhere
    - elementAt
    - toString
  - class BidirectionalIterator
    - movePrevious
  - class Iterator
    - moveNext
    - current
  - class List
    - from
    - cast
    - retype
    - []
    - []=
    - first
    - last
    - length
    - length
    - add
    - addAll
    - reversed
    - sort
    - shuffle
    - indexOf
    - indexWhere
    - lastIndexWhere
    - lastIndexOf
    - clear
    - insert
    - insertAll
    - setAll
    - remove
    - removeAt
    - removeLast
    - removeWhere
    - retainWhere
    - +
    - sublist
    - getRange
    - setRange
    - removeRange
    - fillRange
    - replaceRange
    - asMap
  - class Map
    - cast
    - retype
    - containsValue
    - containsKey
    - []
    - []=
    - entries
    - map
    - addEntries
    - update
    - updateAll
    - removeWhere
    - putIfAbsent
    - addAll
    - remove
    - clear
    - forEach
    - keys
    - values
    - length
    - isEmpty
    - isNotEmpty
  - class MapEntry
    - key
    - value
  - class Null
    - hashCode
    - toString
  - class num
    - ==
    - hashCode
    - compareTo
    - +
    - -
    - *
    - %
    - /
    - ~/
    - unary-
    - remainder
    - <
    - <=
    - >
    - >=
    - isNaN
    - isNegative
    - isInfinite
    - isFinite
    - abs
    - sign
    - round
    - floor
    - ceil
    - truncate
    - roundToDouble
    - floorToDouble
    - ceilToDouble
    - truncateToDouble
    - clamp
    - toInt
    - toDouble
    - toStringAsFixed
    - toStringAsExponential
    - toStringAsPrecision
    - toString
  - class Object
    - dart.core::_hashCodeRnd
    - (default constructor)
    - dart.core::_objectHashCode
    - dart.core::_identityHashCode
    - dart.core::_toString
    - dart.core::_haveSameRuntimeType
    - dart.core::_instanceOf
    - dart.core::_simpleInstanceOf
    - dart.core::_simpleInstanceOfTrue
    - dart.core::_simpleInstanceOfFalse
    - dart.core::_as
    - ==
    - hashCode
    - toString
    - noSuchMethod
    - runtimeType
  - class Pattern
    - allMatches
    - matchAsPrefix
  - class Match
    - start
    - end
    - group
    - []
    - groups
    - groupCount
    - input
    - pattern
  - class Set
    - cast
    - retype
    - iterator
    - contains
    - add
    - addAll
    - remove
    - lookup
    - removeAll
    - retainAll
    - removeWhere
    - retainWhere
    - containsAll
    - intersection
    - union
    - difference
    - clear
    - toSet
  - class Sink
    - add
    - close
  - class StackTrace
    - toString
  - class String
    - []
    - codeUnitAt
    - length
    - hashCode
    - ==
    - endsWith
    - startsWith
    - indexOf
    - lastIndexOf
    - isEmpty
    - isNotEmpty
    - +
    - substring
    - trim
    - trimLeft
    - trimRight
    - *
    - padLeft
    - padRight
    - contains
    - replaceFirst
    - replaceFirstMapped
    - replaceAll
    - replaceAllMapped
    - replaceRange
    - split
    - splitMapJoin
    - codeUnits
    - runes
    - toLowerCase
    - toUpperCase
  - class Runes
    - string
    - iterator
    - last
  - class RuneIterator
    - string
    - rawIndex
    - rawIndex
    - reset
    - current
    - currentSize
    - currentAsString
    - moveNext
    - movePrevious
  - class Symbol
    - hashCode
    - ==
  - class Type
