blob: b62159da916c066eee76c3640dd5d3ea09ac7a6c [file] [log] [blame]
// Copyright (c) 2019, 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.
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/analysis/session.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/generated/engine.dart' as engine;
import 'package:analyzer/src/generated/utilities_dart.dart';
import 'package:analyzer/src/summary2/reference.dart';
import 'package:analyzer/src/utilities/extensions/string.dart';
class MockSdkElements {
final LibraryElementImpl coreLibrary;
final LibraryElementImpl asyncLibrary;
factory MockSdkElements(
engine.AnalysisContext analysisContext,
AnalysisSessionImpl analysisSession,
) {
var builder = _MockSdkElementsBuilder(analysisContext, analysisSession);
var coreLibrary = builder._buildCore();
var asyncLibrary = builder._buildAsync();
builder._populateCore();
builder._populateAsync();
return MockSdkElements._(coreLibrary, asyncLibrary);
}
MockSdkElements._(this.coreLibrary, this.asyncLibrary);
}
class _MockSdkElementsBuilder {
final engine.AnalysisContext analysisContext;
final AnalysisSessionImpl analysisSession;
ClassFragmentImpl? _boolElement;
ClassFragmentImpl? _comparableElement;
ClassFragmentImpl? _completerElement;
ClassFragmentImpl? _deprecatedElement;
ClassFragmentImpl? _doubleElement;
ClassFragmentImpl? _functionElement;
ClassFragmentImpl? _futureElement;
ClassFragmentImpl? _futureOrElement;
ClassFragmentImpl? _intElement;
ClassFragmentImpl? _iterableElement;
ClassFragmentImpl? _iteratorElement;
ClassFragmentImpl? _listElement;
ClassFragmentImpl? _mapElement;
ClassFragmentImpl? _nullElement;
ClassFragmentImpl? _numElement;
ClassFragmentImpl? _objectElement;
ClassFragmentImpl? _overrideElement;
ClassFragmentImpl? _recordElement;
ClassFragmentImpl? _setElement;
ClassFragmentImpl? _stackTraceElement;
ClassFragmentImpl? _streamElement;
ClassFragmentImpl? _streamSubscriptionElement;
ClassFragmentImpl? _stringElement;
ClassFragmentImpl? _symbolElement;
ClassFragmentImpl? _typeElement;
InterfaceTypeImpl? _boolType;
InterfaceTypeImpl? _doubleType;
InterfaceTypeImpl? _intType;
InterfaceTypeImpl? _numType;
InterfaceTypeImpl? _objectType;
InterfaceTypeImpl? _stringType;
InterfaceTypeImpl? _typeType;
late LibraryElementImpl _asyncLibrary;
late LibraryFragmentImpl _asyncUnit;
late LibraryElementImpl _coreLibrary;
late LibraryFragmentImpl _coreUnit;
_MockSdkElementsBuilder(this.analysisContext, this.analysisSession);
ClassFragmentImpl get boolElement {
var boolElement = _boolElement;
if (boolElement != null) return boolElement;
_boolElement = boolElement = _class(name: 'bool', unit: _coreUnit);
boolElement.supertype = objectType;
boolElement.constructors = [
_constructor(
name: 'fromEnvironment',
isConst: true,
isFactory: true,
parameters: [
_requiredParameter('name', stringType),
_namedParameter('defaultValue', boolType),
],
),
];
_buildClassElement(boolElement);
return boolElement;
}
InterfaceTypeImpl get boolType {
return _boolType ??= _interfaceType(boolElement);
}
ClassFragmentImpl get comparableElement {
var comparableElement = _comparableElement;
if (comparableElement != null) return comparableElement;
var tElement = _typeParameter('T');
_comparableElement =
comparableElement = _class(
name: 'Comparable',
isAbstract: true,
typeParameters: [tElement],
unit: _coreUnit,
);
comparableElement.supertype = objectType;
_buildClassElement(comparableElement);
return comparableElement;
}
ClassFragmentImpl get completerElement {
var completerElement = _completerElement;
if (completerElement != null) return completerElement;
var tElement = _typeParameter('T');
_completerElement =
completerElement = _class(
name: 'Completer',
isAbstract: true,
typeParameters: [tElement],
unit: _asyncUnit,
);
completerElement.supertype = objectType;
_buildClassElement(completerElement);
return completerElement;
}
ClassFragmentImpl get deprecatedElement {
var deprecatedElement = _deprecatedElement;
if (deprecatedElement != null) return deprecatedElement;
_deprecatedElement =
deprecatedElement = _class(name: 'Deprecated', unit: _coreUnit);
deprecatedElement.supertype = objectType;
deprecatedElement.fields = [_field('message', stringType, isFinal: true)];
deprecatedElement.accessors =
deprecatedElement.fields.map((f) => f.getter!).toList();
deprecatedElement.constructors = [
_constructor(
isConst: true,
parameters: [_requiredParameter('message', stringType)],
),
];
_buildClassElement(deprecatedElement);
return deprecatedElement;
}
ClassFragmentImpl get doubleElement {
var doubleElement = _doubleElement;
if (doubleElement != null) return doubleElement;
_doubleElement =
doubleElement = _class(
name: 'double',
isAbstract: true,
unit: _coreUnit,
);
doubleElement.supertype = numType;
FieldFragmentImpl staticConstDoubleField(String name) {
return _field(name, doubleType, isStatic: true, isConst: true);
}
doubleElement.fields = <FieldFragmentImpl>[
staticConstDoubleField('nan'),
staticConstDoubleField('infinity'),
staticConstDoubleField('negativeInfinity'),
staticConstDoubleField('minPositive'),
staticConstDoubleField('maxFinite'),
];
doubleElement.accessors =
doubleElement.fields.map((field) => field.getter!).toList();
doubleElement.methods = [
_method(
'+',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'*',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'-',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'%',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'/',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'~/',
intType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'-',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method('abs', doubleType),
_method('ceil', doubleType),
_method('floor', doubleType),
_method(
'remainder',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method('round', doubleType),
_method('toString', stringType),
_method('truncate', doubleType),
];
_buildClassElement(doubleElement);
return doubleElement;
}
InterfaceTypeImpl get doubleType {
return _doubleType ??= _interfaceType(doubleElement);
}
DynamicTypeImpl get dynamicType => DynamicTypeImpl.instance;
ClassFragmentImpl get functionElement {
var functionElement = _functionElement;
if (functionElement != null) return functionElement;
_functionElement =
functionElement = _class(
name: 'Function',
isAbstract: true,
unit: _coreUnit,
);
functionElement.supertype = objectType;
_buildClassElement(functionElement);
return functionElement;
}
InterfaceTypeImpl get functionType {
return _interfaceType(functionElement);
}
ClassFragmentImpl get futureElement {
var futureElement = _futureElement;
if (futureElement != null) return futureElement;
var tElement = _typeParameter('T');
var tType = _typeParameterType(tElement);
_futureElement =
futureElement = _class(
name: 'Future',
isAbstract: true,
typeParameters: [tElement],
unit: _asyncUnit,
);
futureElement.supertype = objectType;
// factory Future.value([FutureOr<T> value])
futureElement.constructors = [
_constructor(
isFactory: true,
parameters: [_positionalParameter('value', futureOrType(tType))],
),
];
// Future<R> then<R>(FutureOr<R> onValue(T value), {Function onError})
var rElement = _typeParameter('R');
var rType = _typeParameterType(rElement);
futureElement.methods = [
_method(
'then',
futureType(rType),
parameters: [
_requiredParameter(
'onValue',
_functionType(
returnType: futureOrType(rType),
parameters: [_requiredParameter('value', tType)],
),
),
_positionalParameter('onError', functionType),
],
),
];
_buildClassElement(futureElement);
return futureElement;
}
ClassFragmentImpl get futureOrElement {
var futureOrElement = _futureOrElement;
if (futureOrElement != null) return futureOrElement;
var tElement = _typeParameter('T');
_futureOrElement =
futureOrElement = _class(
name: 'FutureOr',
typeParameters: [tElement],
unit: _asyncUnit,
);
futureOrElement.supertype = objectType;
_buildClassElement(futureOrElement);
return futureOrElement;
}
ClassFragmentImpl get intElement {
var intElement = _intElement;
if (intElement != null) return intElement;
_intElement =
intElement = _class(name: 'int', isAbstract: true, unit: _coreUnit);
intElement.supertype = numType;
intElement.constructors = [
_constructor(
name: 'fromEnvironment',
isConst: true,
isFactory: true,
parameters: [
_requiredParameter('name', stringType),
_namedParameter('defaultValue', intType),
],
),
];
intElement.methods = [
_method('&', intType, parameters: [_requiredParameter('other', intType)]),
_method('|', intType, parameters: [_requiredParameter('other', intType)]),
_method('^', intType, parameters: [_requiredParameter('other', intType)]),
_method('~', intType),
_method(
'<<',
intType,
parameters: [_requiredParameter('shiftAmount', intType)],
),
_method(
'>>',
intType,
parameters: [_requiredParameter('shiftAmount', intType)],
),
_method('-', intType),
_method('abs', intType),
_method('round', intType),
_method('floor', intType),
_method('ceil', intType),
_method('truncate', intType),
_method('toString', stringType),
];
_buildClassElement(intElement);
return intElement;
}
InterfaceTypeImpl get intType {
return _intType ??= _interfaceType(intElement);
}
ClassFragmentImpl get iterableElement {
var iterableElement = _iterableElement;
if (iterableElement != null) return iterableElement;
var eElement = _typeParameter('E');
var eType = _typeParameterType(eElement);
_iterableElement =
iterableElement = _class(
name: 'Iterable',
isAbstract: true,
typeParameters: [eElement],
unit: _coreUnit,
);
iterableElement.supertype = objectType;
iterableElement.constructors = [_constructor(isConst: true)];
_setAccessors(iterableElement, [
_getter('iterator', iteratorType(eType)),
_getter('last', eType),
]);
_buildClassElement(iterableElement);
return iterableElement;
}
ClassFragmentImpl get iteratorElement {
var iteratorElement = _iteratorElement;
if (iteratorElement != null) return iteratorElement;
var eElement = _typeParameter('E');
var eType = _typeParameterType(eElement);
_iteratorElement =
iteratorElement = _class(
name: 'Iterator',
isAbstract: true,
typeParameters: [eElement],
unit: _coreUnit,
);
iteratorElement.supertype = objectType;
_setAccessors(iterableElement, [_getter('current', eType)]);
_buildClassElement(iteratorElement);
return iteratorElement;
}
ClassFragmentImpl get listElement {
var listElement = _listElement;
if (listElement != null) return listElement;
var eElement = _typeParameter('E');
var eType = _typeParameterType(eElement);
_listElement =
listElement = _class(
name: 'List',
isAbstract: true,
typeParameters: [eElement],
unit: _coreUnit,
);
listElement.supertype = objectType;
listElement.interfaces = [iterableType(eType)];
listElement.constructors = [
_constructor(
isFactory: true,
parameters: [_positionalParameter('length', intType)],
),
];
_setAccessors(listElement, [_getter('length', intType)]);
listElement.methods = [
_method('[]', eType, parameters: [_requiredParameter('index', intType)]),
_method(
'[]=',
voidType,
parameters: [
_requiredParameter('index', intType),
_requiredParameter('value', eType),
],
),
_method(
'add',
voidType,
parameters: [_requiredParameter('value', eType)],
),
];
_buildClassElement(listElement);
return listElement;
}
ClassFragmentImpl get mapElement {
var mapElement = _mapElement;
if (mapElement != null) return mapElement;
var kElement = _typeParameter('K');
var vElement = _typeParameter('V');
var kType = _typeParameterType(kElement);
var vType = _typeParameterType(vElement);
_mapElement =
mapElement = _class(
name: 'Map',
isAbstract: true,
typeParameters: [kElement, vElement],
unit: _coreUnit,
);
mapElement.supertype = objectType;
_setAccessors(mapElement, [_getter('length', intType)]);
mapElement.methods = [
_method('[]', vType, parameters: [_requiredParameter('key', objectType)]),
_method(
'[]=',
voidType,
parameters: [
_requiredParameter('key', kType),
_requiredParameter('value', vType),
],
),
];
_buildClassElement(mapElement);
return mapElement;
}
ClassFragmentImpl get nullElement {
var nullElement = _nullElement;
if (nullElement != null) return nullElement;
_nullElement = nullElement = _class(name: 'Null', unit: _coreUnit);
nullElement.supertype = objectType;
nullElement.constructors = [
_constructor(name: '_uninstantiatable', isFactory: true),
];
_buildClassElement(nullElement);
return nullElement;
}
ClassFragmentImpl get numElement {
var numElement = _numElement;
if (numElement != null) return numElement;
_numElement =
numElement = _class(name: 'num', isAbstract: true, unit: _coreUnit);
numElement.supertype = objectType;
numElement.interfaces = [
_interfaceType(comparableElement, typeArguments: [numType]),
];
numElement.methods = [
_method('+', numType, parameters: [_requiredParameter('other', numType)]),
_method('-', numType, parameters: [_requiredParameter('other', numType)]),
_method('*', numType, parameters: [_requiredParameter('other', numType)]),
_method('%', numType, parameters: [_requiredParameter('other', numType)]),
_method(
'/',
doubleType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'~/',
intType,
parameters: [_requiredParameter('other', numType)],
),
_method('-', numType, parameters: [_requiredParameter('other', numType)]),
_method(
'remainder',
numType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'<',
boolType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'<=',
boolType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'>',
boolType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'>=',
boolType,
parameters: [_requiredParameter('other', numType)],
),
_method(
'==',
boolType,
parameters: [_requiredParameter('other', objectType)],
),
_method('abs', numType),
_method('floor', numType),
_method('ceil', numType),
_method('round', numType),
_method('truncate', numType),
_method('toInt', intType),
_method('toDouble', doubleType),
_method(
'toStringAsFixed',
stringType,
parameters: [_requiredParameter('fractionDigits', intType)],
),
_method(
'toStringAsExponential',
stringType,
parameters: [_requiredParameter('fractionDigits', intType)],
),
_method(
'toStringAsPrecision',
stringType,
parameters: [_requiredParameter('precision', intType)],
),
];
_setAccessors(numElement, [
_getter('isInfinite', boolType),
_getter('isNaN', boolType),
_getter('isNegative', boolType),
]);
_buildClassElement(numElement);
return numElement;
}
InterfaceTypeImpl get numType {
return _numType ??= _interfaceType(numElement);
}
ClassFragmentImpl get objectElement {
var objectElement = _objectElement;
if (objectElement != null) return objectElement;
_objectElement = objectElement = _class(name: 'Object', unit: _coreUnit);
_coreUnit.encloseElement(objectElement);
objectElement.interfaces = const <InterfaceType>[];
objectElement.mixins = const <InterfaceType>[];
objectElement.typeParameters = const <TypeParameterFragmentImpl>[];
objectElement.constructors = [_constructor(isConst: true)];
objectElement.methods = [
_method('toString', stringType),
_method(
'==',
boolType,
parameters: [_requiredParameter('other', objectType)],
),
_method(
'noSuchMethod',
dynamicType,
parameters: [_requiredParameter('other', dynamicType)],
),
];
_setAccessors(objectElement, [
_getter('hashCode', intType),
_getter('runtimeType', typeType),
]);
_buildClassElement(objectElement);
return objectElement;
}
InterfaceTypeImpl get objectType {
return _objectType ??= _interfaceType(objectElement);
}
ClassFragmentImpl get overrideElement {
var overrideElement = _overrideElement;
if (overrideElement != null) return overrideElement;
_overrideElement =
overrideElement = _class(name: '_Override', unit: _coreUnit);
overrideElement.supertype = objectType;
overrideElement.constructors = [_constructor(isConst: true)];
_buildClassElement(overrideElement);
return overrideElement;
}
ClassFragmentImpl get recordElement {
var recordElement = _recordElement;
if (recordElement != null) return recordElement;
_recordElement =
recordElement = _class(
name: 'Record',
isAbstract: true,
unit: _coreUnit,
);
recordElement.supertype = objectType;
_buildClassElement(recordElement);
return recordElement;
}
InterfaceTypeImpl get recordType {
return _interfaceType(recordElement);
}
ClassFragmentImpl get setElement {
var setElement = _setElement;
if (setElement != null) return setElement;
var eElement = _typeParameter('E');
var eType = _typeParameterType(eElement);
_setElement =
setElement = _class(
name: 'Set',
isAbstract: true,
typeParameters: [eElement],
unit: _coreUnit,
);
setElement.supertype = objectType;
setElement.interfaces = [iterableType(eType)];
_buildClassElement(setElement);
return setElement;
}
ClassFragmentImpl get stackTraceElement {
var stackTraceElement = _stackTraceElement;
if (stackTraceElement != null) return stackTraceElement;
_stackTraceElement =
stackTraceElement = _class(
name: 'StackTrace',
isAbstract: true,
unit: _coreUnit,
);
stackTraceElement.supertype = objectType;
_buildClassElement(stackTraceElement);
return stackTraceElement;
}
ClassFragmentImpl get streamElement {
var streamElement = _streamElement;
if (streamElement != null) return streamElement;
var tElement = _typeParameter('T');
var tType = _typeParameterType(tElement);
_streamElement =
streamElement = _class(
name: 'Stream',
isAbstract: true,
typeParameters: [tElement],
unit: _asyncUnit,
);
streamElement.isAbstract = true;
streamElement.supertype = objectType;
// StreamSubscription<T> listen(void onData(T event),
// {Function onError, void onDone(), bool cancelOnError});
streamElement.methods = [
_method(
'listen',
streamSubscriptionType(tType),
parameters: [
_requiredParameter(
'onData',
_functionType(
returnType: voidType,
parameters: [_requiredParameter('event', tType)],
),
),
_namedParameter('onError', functionType),
_namedParameter('onDone', _functionType(returnType: voidType)),
_namedParameter('cancelOnError', boolType),
],
),
];
_buildClassElement(streamElement);
return streamElement;
}
ClassFragmentImpl get streamSubscriptionElement {
var streamSubscriptionElement = _streamSubscriptionElement;
if (streamSubscriptionElement != null) return streamSubscriptionElement;
var tElement = _typeParameter('T');
_streamSubscriptionElement =
streamSubscriptionElement = _class(
name: 'StreamSubscription',
isAbstract: true,
typeParameters: [tElement],
unit: _asyncUnit,
);
streamSubscriptionElement.supertype = objectType;
_buildClassElement(streamSubscriptionElement);
return streamSubscriptionElement;
}
ClassFragmentImpl get stringElement {
var stringElement = _stringElement;
if (stringElement != null) return stringElement;
_stringElement =
stringElement = _class(
name: 'String',
isAbstract: true,
unit: _coreUnit,
);
stringElement.supertype = objectType;
stringElement.constructors = [
_constructor(
name: 'fromEnvironment',
isConst: true,
isFactory: true,
parameters: [
_requiredParameter('name', stringType),
_namedParameter('defaultValue', stringType),
],
),
];
_setAccessors(stringElement, [
_getter('isEmpty', boolType),
_getter('length', intType),
_getter('codeUnits', listType(intType)),
]);
stringElement.methods = [
_method(
'+',
stringType,
parameters: [_requiredParameter('other', stringType)],
),
_method('toLowerCase', stringType),
_method('toUpperCase', stringType),
];
_buildClassElement(stringElement);
return stringElement;
}
InterfaceTypeImpl get stringType {
return _stringType ??= _interfaceType(stringElement);
}
ClassFragmentImpl get symbolElement {
var symbolElement = _symbolElement;
if (symbolElement != null) return symbolElement;
_symbolElement =
symbolElement = _class(
name: 'Symbol',
isAbstract: true,
unit: _coreUnit,
);
symbolElement.supertype = objectType;
symbolElement.constructors = [
_constructor(
isConst: true,
isFactory: true,
parameters: [_requiredParameter('name', stringType)],
),
];
_buildClassElement(symbolElement);
return symbolElement;
}
ClassFragmentImpl get typeElement {
var typeElement = _typeElement;
if (typeElement != null) return typeElement;
_typeElement =
typeElement = _class(name: 'Type', isAbstract: true, unit: _coreUnit);
typeElement.supertype = objectType;
_buildClassElement(typeElement);
return typeElement;
}
InterfaceTypeImpl get typeType {
return _typeType ??= _interfaceType(typeElement);
}
VoidTypeImpl get voidType => VoidTypeImpl.instance;
InterfaceTypeImpl futureOrType(TypeImpl elementType) {
return _interfaceType(futureOrElement, typeArguments: [elementType]);
}
InterfaceTypeImpl futureType(TypeImpl elementType) {
return _interfaceType(futureElement, typeArguments: [elementType]);
}
InterfaceTypeImpl iterableType(TypeImpl elementType) {
return _interfaceType(iterableElement, typeArguments: [elementType]);
}
InterfaceTypeImpl iteratorType(TypeImpl elementType) {
return _interfaceType(iteratorElement, typeArguments: [elementType]);
}
InterfaceTypeImpl listType(TypeImpl elementType) {
return _interfaceType(listElement, typeArguments: [elementType]);
}
InterfaceTypeImpl streamSubscriptionType(TypeImpl valueType) {
return _interfaceType(
streamSubscriptionElement,
typeArguments: [valueType],
);
}
LibraryElementImpl _buildAsync() {
var asyncSource = analysisContext.sourceFactory.forUri('dart:async')!;
_asyncLibrary = LibraryElementImpl(
analysisContext,
analysisSession,
'dart.async',
0,
0,
FeatureSet.latestLanguageVersion(),
);
_asyncUnit = LibraryFragmentImpl(
library: _asyncLibrary,
source: asyncSource,
lineInfo: LineInfo([0]),
);
_asyncLibrary.definingCompilationUnit = _asyncUnit;
return _asyncLibrary;
}
void _buildClassElement(ClassFragmentImpl fragment) {}
LibraryElementImpl _buildCore() {
var coreSource = analysisContext.sourceFactory.forUri('dart:core')!;
_coreLibrary = LibraryElementImpl(
analysisContext,
analysisSession,
'dart.core',
0,
0,
FeatureSet.latestLanguageVersion(),
);
_coreUnit = LibraryFragmentImpl(
library: _coreLibrary,
source: coreSource,
lineInfo: LineInfo([0]),
);
_coreLibrary.definingCompilationUnit = _coreUnit;
return _coreLibrary;
}
ClassFragmentImpl _class({
required String name,
bool isAbstract = false,
List<TypeParameterElementImpl2> typeParameters = const [],
required LibraryFragmentImpl unit,
}) {
var fragment = ClassFragmentImpl(name, 0);
ClassElementImpl2(Reference.root(), fragment);
fragment.typeParameters =
typeParameters.map((tp) => tp.firstFragment).toList();
fragment.constructors = <ConstructorFragmentImpl>[_constructor()];
unit.encloseElement(fragment);
return fragment;
}
ConstructorFragmentImpl _constructor({
String name = '',
bool isConst = false,
bool isFactory = false,
List<FormalParameterElement> parameters = const [],
}) {
var element = ConstructorFragmentImpl(name, 0);
element.name2 = name.ifNotEmptyOrElse('new');
element.isFactory = isFactory;
element.isConst = isConst;
element.parameters =
parameters
.map((p) => p.firstFragment as FormalParameterFragmentImpl)
.toList();
return element;
}
FieldFragmentImpl _field(
String name,
TypeImpl type, {
bool isConst = false,
bool isFinal = false,
bool isStatic = false,
}) {
var fragment =
isConst ? ConstFieldFragmentImpl(name, 0) : FieldFragmentImpl(name, 0);
fragment.isConst = isConst;
fragment.isFinal = isFinal;
fragment.isStatic = isStatic;
fragment.type = type;
PropertyAccessorElementImpl_ImplicitGetter(fragment);
if (!isConst && !isFinal) {
PropertyAccessorElementImpl_ImplicitSetter(fragment);
}
return fragment;
}
TopLevelFunctionFragmentImpl _function(
String name,
DartType returnType, {
List<TypeParameterFragmentImpl> typeFormals = const [],
List<FormalParameterElement> parameters = const [],
}) {
var fragment =
TopLevelFunctionFragmentImpl(name, 0)
..parameters =
parameters
.map((p) => p.firstFragment as FormalParameterFragmentImpl)
.toList()
..returnType = returnType
..typeParameters = typeFormals;
TopLevelFunctionElementImpl(Reference.root(), fragment);
return fragment;
}
FunctionTypeImpl _functionType({
required TypeImpl returnType,
List<TypeParameterElementImpl2> typeFormals = const [],
List<FormalParameterElement> parameters = const [],
}) {
return FunctionTypeImpl.v2(
typeParameters: typeFormals,
formalParameters: parameters.cast(),
returnType: returnType,
nullabilitySuffix: NullabilitySuffix.none,
);
}
PropertyAccessorFragmentImpl _getter(
String name,
TypeImpl type, {
bool isStatic = false,
}) {
var field = FieldFragmentImpl(name, -1);
field.isStatic = isStatic;
field.isSynthetic = true;
field.type = type;
var getter = GetterFragmentImpl(name, 0);
getter.isStatic = isStatic;
getter.isSynthetic = false;
getter.returnType = type;
getter.variable2 = field;
field.getter = getter;
return getter;
}
InterfaceTypeImpl _interfaceType(
InterfaceFragmentImpl element, {
List<TypeImpl> typeArguments = const [],
}) {
return InterfaceTypeImpl(
element: element.element,
typeArguments: typeArguments,
nullabilitySuffix: NullabilitySuffix.none,
);
}
MethodFragmentImpl _method(
String name,
DartType returnType, {
List<TypeParameterFragmentImpl> typeFormals = const [],
List<FormalParameterElement> parameters = const [],
}) {
var fragment =
MethodFragmentImpl(name, 0)
..parameters =
parameters
.map((p) => p.firstFragment as FormalParameterFragmentImpl)
.toList()
..returnType = returnType
..typeParameters = typeFormals;
return fragment;
}
FormalParameterElement _namedParameter(
String name,
TypeImpl type, {
String? initializerCode,
}) {
var fragment = DefaultParameterFragmentImpl(
name: name,
nameOffset: 0,
name2: name,
nameOffset2: 0,
parameterKind: ParameterKind.NAMED,
);
fragment.type = type;
fragment.defaultValueCode = initializerCode;
return FormalParameterElementImpl(fragment);
}
void _populateAsync() {
_asyncUnit.classes = <ClassFragmentImpl>[
completerElement,
futureElement,
futureOrElement,
streamElement,
streamSubscriptionElement,
];
_fillLibraryFromFragment(_asyncLibrary, _asyncUnit);
}
void _populateCore() {
_coreUnit.classes = <ClassFragmentImpl>[
boolElement,
comparableElement,
deprecatedElement,
doubleElement,
functionElement,
intElement,
iterableElement,
iteratorElement,
listElement,
mapElement,
nullElement,
numElement,
objectElement,
overrideElement,
recordElement,
setElement,
stackTraceElement,
stringElement,
symbolElement,
typeElement,
];
_coreUnit.functions = <TopLevelFunctionFragmentImpl>[
_function(
'identical',
boolType,
parameters: [
_requiredParameter('a', objectType),
_requiredParameter('b', objectType),
],
),
_function(
'print',
voidType,
parameters: [_requiredParameter('object', objectType)],
),
];
var deprecatedVariable = _topLevelVariableConst(
'deprecated',
_interfaceType(deprecatedElement),
);
var overrideVariable = _topLevelVariableConst(
'override',
_interfaceType(overrideElement),
);
_coreUnit.accessors = <PropertyAccessorFragmentImpl>[
deprecatedVariable.getter!,
overrideVariable.getter!,
];
_coreUnit.topLevelVariables = <TopLevelVariableFragmentImpl>[
deprecatedVariable,
overrideVariable,
];
_fillLibraryFromFragment(_coreLibrary, _coreUnit);
}
FormalParameterElement _positionalParameter(String name, TypeImpl type) {
var fragment = FormalParameterFragmentImpl(
name: name,
nameOffset: 0,
name2: name,
nameOffset2: 0,
parameterKind: ParameterKind.POSITIONAL,
);
fragment.type = type;
return FormalParameterElementImpl(fragment);
}
FormalParameterElement _requiredParameter(String name, TypeImpl type) {
var fragment = FormalParameterFragmentImpl(
name: name,
nameOffset: 0,
name2: name,
nameOffset2: 0,
parameterKind: ParameterKind.REQUIRED,
);
fragment.type = type;
return FormalParameterElementImpl(fragment);
}
/// Set the [accessors] and the corresponding fields for the [classElement].
void _setAccessors(
ClassFragmentImpl classElement,
List<PropertyAccessorFragmentImpl> accessors,
) {
classElement.accessors = accessors;
classElement.fields =
accessors
.map((accessor) => accessor.variable2)
.cast<FieldFragmentImpl>()
.toList();
}
TopLevelVariableFragmentImpl _topLevelVariableConst(
String name,
TypeImpl type,
) {
var fragment =
ConstTopLevelVariableFragmentImpl(name, -1)
..isConst = true
..type = type;
TopLevelVariableElementImpl2(Reference.root(), fragment);
PropertyAccessorElementImpl_ImplicitGetter(fragment);
return fragment;
}
TypeParameterElementImpl2 _typeParameter(String name) {
return TypeParameterElementImpl2(
firstFragment: TypeParameterFragmentImpl(name, 0),
name3: name.nullIfEmpty,
);
}
TypeParameterTypeImpl _typeParameterType(TypeParameterElementImpl2 element) {
return TypeParameterTypeImpl(
element3: element,
nullabilitySuffix: NullabilitySuffix.none,
);
}
static void _fillLibraryFromFragment(
LibraryElementImpl library,
LibraryFragmentImpl fragment,
) {
library.classes = fragment.classes.map((f) => f.element).toList();
library.topLevelFunctions =
fragment.functions.map((f) => f.element).toList();
library.topLevelVariables =
fragment.topLevelVariables.map((f) => f.element).toList();
}
}