blob: 76ae2be244b72909e51d636ad665b86576cfe403 [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 file.
import 'dart:mirrors';
import 'package:_macros/src/api.dart';
import 'package:_macros/src/executor.dart';
import 'package:_macros/src/executor/introspection_impls.dart';
import 'package:_macros/src/executor/remote_instance.dart';
import 'package:test/test.dart';
class TestTypePhaseIntrospector implements TypePhaseIntrospector {
@override
Future<Identifier> resolveIdentifier(Uri library, String name) async {
if (library == Uri.parse('dart:core') && name == 'String') {
return Fixtures.stringType.identifier;
}
if (library == Uri.parse('dart:core') && name == 'List') {
return Fixtures.listIdentifier;
}
if (library == Fixtures.library.uri &&
name == Fixtures.mySuperclass.identifier.name) {
return Fixtures.mySuperclass.identifier;
}
throw UnimplementedError('Cannot resolve the identifier $library:$name');
}
}
class TestDeclarationPhaseIntrospector extends TestTypePhaseIntrospector
implements DeclarationPhaseIntrospector {
final Map<TypeDeclaration, List<ConstructorDeclaration>> constructors;
final Map<EnumDeclaration, List<EnumValueDeclaration>> enumValues;
final Map<TypeDeclaration, List<FieldDeclaration>> fields;
final Map<TypeDeclaration, List<MethodDeclaration>> methods;
final Map<Library, List<TypeDeclaration>> libraryTypes;
final Map<Identifier, StaticType> staticTypes;
final Map<Identifier, Declaration> identifierDeclarations;
TestDeclarationPhaseIntrospector(
{required this.constructors,
required this.enumValues,
required this.fields,
required this.methods,
required this.libraryTypes,
required this.staticTypes,
required this.identifierDeclarations});
@override
Future<TypeDeclaration> typeDeclarationOf(
covariant Identifier identifier) async {
var declaration = identifierDeclarations[identifier];
if (declaration != null) return declaration as TypeDeclaration;
throw 'No declaration found for ${identifier.name}';
}
@override
Future<StaticType> resolve(covariant TypeAnnotationCode type) async {
assert(type.parts.length == 1);
return staticTypes[type.parts.first]!;
}
@override
Future<List<ConstructorDeclaration>> constructorsOf(
covariant TypeDeclaration type) async =>
constructors[type]!;
@override
Future<List<EnumValueDeclaration>> valuesOf(
covariant EnumDeclaration enuum) async =>
enumValues[enuum]!;
@override
Future<List<FieldDeclaration>> fieldsOf(
covariant TypeDeclaration clazz) async =>
fields[clazz]!;
@override
Future<List<MethodDeclaration>> methodsOf(
covariant TypeDeclaration clazz) async =>
methods[clazz]!;
@override
Future<List<TypeDeclaration>> typesOf(covariant Library library) async =>
libraryTypes[library]!;
}
/// Doesn't handle generics etc but thats ok for now
class TestNamedStaticType extends NamedStaticTypeImpl {
final List<TestNamedStaticType> superTypes;
TestNamedStaticType(
super.id, {
required this.superTypes,
required super.declaration,
required super.typeArguments,
});
@override
Future<bool> isExactly(TestNamedStaticType other) async => _isExactly(other);
@override
Future<bool> isSubtypeOf(TestNamedStaticType other) async =>
_isExactly(other) ||
superTypes.any((superType) => superType._isExactly(other));
bool _isExactly(TestNamedStaticType other) =>
identical(other, this) ||
(declaration.library == other.declaration.library &&
declaration.identifier == other.declaration.identifier);
@override
Future<NamedStaticType?> asInstanceOf(TypeDeclaration declaration) async {
for (TestNamedStaticType superType in superTypes) {
if (superType.declaration.identifier == declaration.identifier) {
return superType;
}
}
return null;
}
}
/// Assumes all omitted types are [TestOmittedTypeAnnotation]s and just returns
/// the inferred type directly.
class TestDefinitionsPhaseIntrospector extends TestDeclarationPhaseIntrospector
implements DefinitionPhaseIntrospector {
final Map<Library, List<Declaration>> libraryDeclarations;
TestDefinitionsPhaseIntrospector(
{required this.libraryDeclarations,
required super.constructors,
required super.enumValues,
required super.fields,
required super.methods,
required super.libraryTypes,
required super.staticTypes,
required super.identifierDeclarations});
@override
Future<Declaration> declarationOf(Identifier identifier) async =>
identifierDeclarations[identifier]!;
@override
Future<TypeAnnotation> inferType(
TestOmittedTypeAnnotation omittedType) async =>
omittedType.inferredType!;
@override
Future<List<Declaration>> topLevelDeclarationsOf(Library library) async =>
libraryDeclarations[library]!;
@override
Future<TypeDeclaration> typeDeclarationOf(Identifier identifier) async =>
await super.typeDeclarationOf(identifier);
}
/// Knows its inferred type ahead of time.
class TestOmittedTypeAnnotation extends OmittedTypeAnnotationImpl {
final TypeAnnotation? inferredType;
TestOmittedTypeAnnotation([this.inferredType])
: super(id: RemoteInstance.uniqueId);
}
/// An identifier that knows the resolved version of itself.
class TestIdentifier extends IdentifierImpl {
final ResolvedIdentifier resolved;
TestIdentifier({
required super.id,
required super.name,
required IdentifierKind kind,
required Uri? uri,
required String? staticScope,
}) : resolved = ResolvedIdentifier(
kind: kind, name: name, staticScope: staticScope, uri: uri);
}
extension DebugCodeString on Code {
StringBuffer debugString([StringBuffer? buffer]) {
buffer ??= StringBuffer();
for (var part in parts) {
if (part is Code) {
part.debugString(buffer);
} else if (part is IdentifierImpl) {
buffer.write(part.name);
} else if (part is TestOmittedTypeAnnotation) {
if (part.inferredType != null) {
buffer.write('/*inferred*/');
part.inferredType!.code.debugString(buffer);
} else {
buffer.write('/*omitted*/');
}
} else {
buffer.write(part as String);
}
}
return buffer;
}
}
extension IterableToDebugCodeString on Iterable<Code> {
Iterable<String> mapToDebugCodeString() =>
map((a) => a.debugString().toString())
// Avoid doing this repeatedly when used in unorderedEquals etc.
.toList();
}
extension MapValuesToDebugCodeString<K> on Map<K, Iterable<Code>> {
Map<K, Iterable<String>> mapValuesToDebugCodeString() =>
map((key, values) => MapEntry(key, values.mapToDebugCodeString()));
}
/// Checks if two [Code] objects are of the same type and all their fields are
/// equal.
Matcher deepEqualsCode(Code other) => _DeepEqualityMatcher(other);
/// Checks if two [Declaration]s are of the same type and all their fields are
/// equal.
Matcher deepEqualsDeclaration(Declaration declaration) =>
_DeepEqualityMatcher(declaration);
/// Checks if two [TypeAnnotation]s are of the same type and all their fields
/// are equal.
Matcher deepEqualsTypeAnnotation(TypeAnnotation declaration) =>
_DeepEqualityMatcher(declaration);
/// Checks if two [Arguments]s are identical
Matcher deepEqualsArguments(Arguments arguments) =>
_DeepEqualityMatcher(arguments);
/// Checks if two [MacroException]s are identical
Matcher deepEqualsMacroException(MacroException macroException) =>
_DeepEqualityMatcher(macroException);
/// Checks if two [MetadataAnnotation]s are identical
Matcher deepEqualsMetadataAnnotation(MetadataAnnotation metadata) =>
_DeepEqualityMatcher(metadata);
/// Checks if two [StaticType]s are identical
Matcher deepEqualsStaticType(StaticType type) => _DeepEqualityMatcher(type);
/// Checks if two [Declaration]s, [TypeAnnotation]s, [Code]s or
/// [MacroException]s are of the same type and all their fields are equal.
class _DeepEqualityMatcher extends Matcher {
final Object? instance;
_DeepEqualityMatcher(this.instance);
@override
Description describe(Description description) => description;
@override
bool matches(item, Map matchState) {
// For type promotion.
final instance = this.instance;
if (!equals(item.runtimeType).matches(instance.runtimeType, matchState)) {
return false;
}
if (instance is Declaration ||
instance is TypeAnnotation ||
instance is MetadataAnnotation ||
instance is MacroException ||
instance is StaticType) {
var instanceReflector = reflect(instance);
var itemReflector = reflect(item);
var type = instanceReflector.type;
for (var getter
in type.instanceMembers.values.where((member) => member.isGetter)) {
// We only care about synthetic field getters
if (!getter.isSynthetic) continue;
var instanceField = instanceReflector.getField(getter.simpleName);
var itemField = itemReflector.getField(getter.simpleName);
var instanceValue = instanceField.reflectee;
var itemValue = itemField.reflectee;
if (!_DeepEqualityMatcher(instanceValue)
.matches(itemValue, matchState)) {
return false;
}
}
} else if (instance is Code) {
item as Code;
if (!_DeepEqualityMatcher(instance.parts)
.matches(item.parts, matchState)) {
return false;
}
} else if (instance is Arguments) {
item as Arguments;
if (!equals(instance.positional.length)
.matches(item.positional.length, matchState)) {
return false;
}
for (var i = 0; i < instance.positional.length; i++) {
if (!_DeepEqualityMatcher(instance.positional[i].value)
.matches(item.positional[i].value, matchState)) {
return false;
}
}
if (instance.named.length != item.named.length) return false;
if (!equals(instance.named.keys).matches(item.named.keys, matchState)) {
return false;
}
for (var key in instance.named.keys) {
if (!_DeepEqualityMatcher(instance.named[key]!.value)
.matches(item.named[key]!.value, matchState)) {
return false;
}
}
} else if (instance is List) {
item as List;
if (!equals(instance.length).matches(item.length, matchState)) {
return false;
}
for (var i = 0; i < instance.length; i++) {
if (!_DeepEqualityMatcher(instance[i]).matches(item[i], matchState)) {
return false;
}
}
} else if (instance is Map) {
item as Map;
if (!equals(instance.length).matches(item.length, matchState)) {
return false;
}
for (var key in instance.keys) {
// Key sets are same size, so they are equal if every key in `instance`
// is also a key in `item`.
if (!contains(key).matches(item, matchState)) {
return false;
}
// Maps are equal if keys are equal and every value is equal.
if (!_DeepEqualityMatcher(instance[key])
.matches(item[key], matchState)) {
return false;
}
}
} else {
// Handles basic values and identity
if (!equals(instance).matches(item, matchState)) {
return false;
}
}
return true;
}
}
class Fixtures {
static final library = LibraryImpl(
id: RemoteInstance.uniqueId,
languageVersion: LanguageVersionImpl(3, 0),
metadata: [],
uri: Uri.parse('package:foo/bar.dart'));
static final listIdentifier =
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'List');
static final nullableBoolType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'bool'),
isNullable: true,
typeArguments: const []);
static final stringType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'String'),
isNullable: false,
typeArguments: const []);
static final stringClass = ClassDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: stringType.identifier,
library: Fixtures.library,
metadata: [],
typeParameters: [],
interfaces: [],
hasAbstract: false,
hasBase: false,
hasExternal: false,
hasFinal: false,
hasInterface: false,
hasMixin: false,
hasSealed: false,
mixins: [],
superclass: null);
static final inferredStringType = TestOmittedTypeAnnotation(stringType);
static final voidType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'void'),
isNullable: false,
typeArguments: const []);
static final recordType = RecordTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
isNullable: false,
namedFields: [
RecordFieldImpl(
id: RemoteInstance.uniqueId, name: 'world', type: stringType),
],
positionalFields: [
RecordFieldImpl(
id: RemoteInstance.uniqueId, name: null, type: stringType),
RecordFieldImpl(
id: RemoteInstance.uniqueId, name: 'hello', type: nullableBoolType),
]);
// Top level, non-class declarations.
static final myFunction = FunctionDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myFunction'),
library: Fixtures.library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: false,
isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
returnType: stringType,
typeParameters: []);
static final myVariable = VariableDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: '_myVariable'),
library: Fixtures.library,
metadata: [],
hasConst: false,
hasExternal: false,
hasFinal: true,
hasInitializer: false,
hasLate: false,
type: inferredStringType);
static final myVariableGetter = FunctionDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myVariable'),
library: Fixtures.library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: true,
isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
returnType: stringType,
typeParameters: []);
static final myVariableSetter = FunctionDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myVariable'),
library: Fixtures.library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: false,
isOperator: false,
isSetter: true,
namedParameters: [],
positionalParameters: [
FormalParameterDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'value'),
library: Fixtures.library,
metadata: [],
isNamed: false,
isRequired: true,
type: stringType)
],
returnType: voidType,
typeParameters: []);
static final libraryVariable = VariableDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'library'),
library: Fixtures.library,
metadata: [],
hasConst: false,
hasExternal: false,
hasFinal: true,
hasInitializer: false,
hasLate: false,
type: NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
isNullable: false,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'LibraryInfo'),
typeArguments: []));
// Class and member declarations
static final myInterfaceType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MyInterface'),
isNullable: false,
typeArguments: const []);
static final myMixinType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MyMixin'),
isNullable: false,
typeArguments: const []);
static final mySuperclassType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MySuperclass'),
isNullable: false,
typeArguments: const []);
static final myClassType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MyClass'),
isNullable: false,
typeArguments: const []);
static final myClass = ClassDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: myClassType.identifier,
library: Fixtures.library,
metadata: [],
typeParameters: [],
interfaces: [myInterfaceType],
hasAbstract: false,
hasBase: false,
hasExternal: false,
hasFinal: false,
hasInterface: false,
hasMixin: false,
hasSealed: false,
mixins: [myMixinType],
superclass: mySuperclassType);
static final myConstructor = ConstructorDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myConstructor'),
library: Fixtures.library,
metadata: [],
hasBody: false, // we will augment with one
hasExternal: false,
namedParameters: [],
positionalParameters: [
FormalParameterDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myField'),
library: Fixtures.library,
metadata: [],
isNamed: false,
isRequired: true,
type: TestOmittedTypeAnnotation(myField.type))
],
returnType: myClassType,
typeParameters: [],
definingType: myClassType.identifier,
isFactory: false);
static final myField = FieldDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myField'),
library: Fixtures.library,
metadata: [],
hasAbstract: false,
hasConst: false,
hasExternal: false,
hasFinal: false,
hasInitializer: false,
hasLate: false,
type: stringType,
definingType: myClassType.identifier,
hasStatic: false);
static final myInterface = ClassDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: myInterfaceType.identifier,
library: Fixtures.library,
metadata: [],
typeParameters: [],
interfaces: [],
hasAbstract: false,
hasBase: false,
hasExternal: false,
hasFinal: false,
hasInterface: true,
hasMixin: false,
hasSealed: false,
mixins: [],
superclass: null);
static final myMethod = MethodDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myMethod'),
library: Fixtures.library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: false,
isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
returnType: recordType,
typeParameters: [],
definingType: myClassType.identifier,
hasStatic: false);
static final mySuperclass = ClassDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: mySuperclassType.identifier,
library: Fixtures.library,
metadata: [],
typeParameters: [
TypeParameterDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'T'),
library: library,
metadata: const [],
bound: null,
),
],
interfaces: [],
hasAbstract: false,
hasBase: false,
hasExternal: false,
hasFinal: false,
hasInterface: false,
hasMixin: false,
hasSealed: false,
mixins: [],
superclass: null);
static final mySuperTypeInstantiatedWithString = TestNamedStaticType(
RemoteInstance.uniqueId,
declaration: mySuperclass,
typeArguments: [],
superTypes: [
TestNamedStaticType(
RemoteInstance.uniqueId,
declaration: stringClass,
superTypes: [],
typeArguments: [],
)
],
);
static final myClassStaticType = TestNamedStaticType(
RemoteInstance.uniqueId,
declaration: myClass,
typeArguments: [],
superTypes: [
mySuperTypeInstantiatedWithString,
],
);
static final myEnumType = NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
isNullable: false,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MyEnum'),
typeArguments: []);
static final myEnum = EnumDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: myEnumType.identifier,
library: Fixtures.library,
metadata: [],
typeParameters: [],
interfaces: [],
mixins: []);
static final myEnumValues = [
EnumValueDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'a'),
library: Fixtures.library,
metadata: [],
definingEnum: myEnum.identifier,
),
];
static final myEnumConstructor = ConstructorDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(
id: RemoteInstance.uniqueId, name: 'myEnumConstructor'),
library: Fixtures.library,
metadata: [],
hasBody: false, // We will augment with one
hasExternal: false,
namedParameters: [],
positionalParameters: [
FormalParameterDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myField'),
library: Fixtures.library,
metadata: [],
isNamed: false,
isRequired: true,
type: stringType)
],
returnType: myEnumType,
typeParameters: [],
definingType: myEnum.identifier,
isFactory: false);
static final myMixin = MixinDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: myMixinType.identifier,
library: Fixtures.library,
metadata: [],
typeParameters: [],
hasBase: false,
interfaces: [],
superclassConstraints: [myClassType],
);
static final myMixinMethod = MethodDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'myMixinMethod'),
library: Fixtures.library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: false,
isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
returnType: recordType,
typeParameters: [],
definingType: myMixinType.identifier,
hasStatic: false);
static final myExtension = ExtensionDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MyExtension'),
library: Fixtures.library,
metadata: [],
typeParameters: [],
onType: myClassType);
static final myExtensionType = ExtensionTypeDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'MyExtensionType'),
library: Fixtures.library,
metadata: [],
typeParameters: [],
representationType: myClassType);
static final myTypeAlias = TypeAliasDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier: IdentifierImpl(
id: RemoteInstance.uniqueId,
name: 'MyTypeAlias',
),
library: Fixtures.library,
metadata: [],
typeParameters: [],
aliasedType: myClassType,
);
static final myGeneratedExtensionMethod = MethodDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'onTypeFieldNames'),
library: library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: true,
isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
returnType: NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
isNullable: false,
identifier: listIdentifier,
typeArguments: [stringType]),
typeParameters: [],
definingType: myExtension.identifier,
// TODO: This is a bit weird, the method is actually static, but doesn't
// have the keyword because it is implicit.
hasStatic: false);
static final myGeneratedExtensionTypeMethod = MethodDeclarationImpl(
id: RemoteInstance.uniqueId,
identifier:
IdentifierImpl(id: RemoteInstance.uniqueId, name: 'onTypeFieldNames'),
library: library,
metadata: [],
hasBody: true,
hasExternal: false,
isGetter: true,
isOperator: false,
isSetter: false,
namedParameters: [],
positionalParameters: [],
returnType: NamedTypeAnnotationImpl(
id: RemoteInstance.uniqueId,
isNullable: false,
identifier: listIdentifier,
typeArguments: [stringType]),
typeParameters: [],
definingType: myExtensionType.identifier,
// TODO: This is a bit weird, the method is actually static, but doesn't
// have the keyword because it is implicit.
hasStatic: false);
static final testDeclarationPhaseIntrospector =
TestDeclarationPhaseIntrospector(constructors: {
myClass: [myConstructor],
myEnum: [myEnumConstructor],
myMixin: [],
}, enumValues: {
myEnum: myEnumValues,
}, fields: {
myClass: [myField],
myMixin: [],
myEnum: [],
}, methods: {
myClass: [myMethod],
myMixin: [myMixinMethod],
myEnum: [],
myExtension: [myGeneratedExtensionMethod],
myExtensionType: [myGeneratedExtensionTypeMethod],
}, libraryTypes: {
Fixtures.library: [
myClass,
myEnum,
myExtension,
myMixin,
],
}, staticTypes: {
stringType.identifier: TestNamedStaticType(
RemoteInstance.uniqueId,
declaration: stringClass,
superTypes: [],
typeArguments: [],
),
myClass.identifier: myClassStaticType,
mySuperclass.identifier: TestNamedStaticType(
RemoteInstance.uniqueId,
declaration: mySuperclass,
superTypes: [],
typeArguments: [],
),
}, identifierDeclarations: {
myClass.identifier: myClass,
myEnum.identifier: myEnum,
myExtension.identifier: myExtension,
mySuperclass.identifier: mySuperclass,
myInterface.identifier: myInterface,
myMixin.identifier: myMixin,
myConstructor.identifier: myConstructor,
myEnumConstructor.identifier: myEnumConstructor,
for (EnumValueDeclaration value in myEnumValues) value.identifier: value,
myField.identifier: myField,
myMixinMethod.identifier: myMixinMethod,
myMethod.identifier: myMethod,
});
static final testDefinitionPhaseIntrospector =
TestDefinitionsPhaseIntrospector(
constructors: testDeclarationPhaseIntrospector.constructors,
enumValues: testDeclarationPhaseIntrospector.enumValues,
fields: testDeclarationPhaseIntrospector.fields,
methods: testDeclarationPhaseIntrospector.methods,
libraryDeclarations: {
Fixtures.library: [
myClass,
myEnum,
myMixin,
myFunction,
myVariable,
libraryVariable,
],
},
libraryTypes: testDeclarationPhaseIntrospector.libraryTypes,
staticTypes: testDeclarationPhaseIntrospector.staticTypes,
identifierDeclarations:
testDeclarationPhaseIntrospector.identifierDeclarations);
}