blob: 4559e7cce60d82c2b8b87df91e607cc55d708974 [file] [log] [blame]
// Copyright (c) 2020, 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:expect/expect.dart';
import 'package:kernel/ast.dart';
import 'text_representation_test.dart';
void testExpression(
Expression node,
String normal, {
String? verbose,
String? limited,
}) {
Expect.stringEquals(
normal,
node.toText(normalStrategy),
"Unexpected normal strategy text for ${node.runtimeType}",
);
Expect.stringEquals(
verbose ?? normal,
node.toText(verboseStrategy),
"Unexpected verbose strategy text for ${node.runtimeType}",
);
Expect.stringEquals(
limited ?? normal,
node.toText(limitedStrategy),
"Unexpected limited strategy text for ${node.runtimeType}",
);
}
void testType(
DartType node,
String normal, {
String? verbose,
String? limited,
}) {
Expect.stringEquals(
normal,
node.toText(normalStrategy),
"Unexpected normal strategy text for ${node.runtimeType}",
);
Expect.stringEquals(
verbose ?? normal,
node.toText(verboseStrategy),
"Unexpected verbose strategy text for ${node.runtimeType}",
);
Expect.stringEquals(
limited ?? normal,
node.toText(limitedStrategy),
"Unexpected limited strategy text for ${node.runtimeType}",
);
}
void main() {
testTypes();
testMembers();
}
void testTypes() {
Reference unlinkedClassName = new Reference();
testType(
new InterfaceType.byReference(
unlinkedClassName,
Nullability.nonNullable,
[],
),
'<unlinked-class-reference>',
);
testType(
new TypedefType.byReference(unlinkedClassName, Nullability.nonNullable, []),
'<unlinked-typedef-reference>',
);
CanonicalName root = new CanonicalName.root();
Reference rootReference = new Reference()..canonicalName = root;
testType(
new InterfaceType.byReference(rootReference, Nullability.nonNullable, []),
'<root>',
);
testType(
new TypedefType.byReference(rootReference, Nullability.nonNullable, []),
'<root>',
);
CanonicalName library = root.getChild('lib');
Reference libraryReference = new Reference()..canonicalName = library;
testType(
new InterfaceType.byReference(
libraryReference,
Nullability.nonNullable,
[],
),
'library lib',
);
testType(
new TypedefType.byReference(libraryReference, Nullability.nonNullable, []),
'library lib',
);
CanonicalName className = library.getChild('Class');
Reference classNameReference = new Reference()..canonicalName = className;
testType(
new InterfaceType.byReference(
classNameReference,
Nullability.nonNullable,
[],
),
'Class',
verbose: 'library lib::Class',
);
testType(
new TypedefType.byReference(
classNameReference,
Nullability.nonNullable,
[],
),
'Class',
verbose: 'library lib::Class',
);
}
void testMembers() {
Reference unlinkedMemberName = new Reference();
testExpression(
new InstanceGet.byReference(
InstanceAccessKind.Instance,
new IntLiteral(0),
new Name('foo'),
interfaceTargetReference: unlinkedMemberName,
resultType: const DynamicType(),
),
'''
0.foo''',
);
testExpression(new StaticGet.byReference(unlinkedMemberName), '''
<unlinked-member-reference>''');
CanonicalName root = new CanonicalName.root();
Reference rootReference = new Reference()..canonicalName = root;
testExpression(
new InstanceGet.byReference(
InstanceAccessKind.Instance,
new IntLiteral(0),
new Name('foo'),
interfaceTargetReference: rootReference,
resultType: const DynamicType(),
),
'''
0.foo''',
);
testExpression(new StaticGet.byReference(rootReference), '''
<root>''');
CanonicalName library = root.getChild('lib');
Reference libraryReference = new Reference()..canonicalName = library;
testExpression(
new InstanceGet.byReference(
InstanceAccessKind.Instance,
new IntLiteral(0),
new Name('foo'),
interfaceTargetReference: libraryReference,
resultType: const DynamicType(),
),
'''
0.foo''',
);
testExpression(new StaticGet.byReference(libraryReference), '''
library lib''');
CanonicalName topLevelMemberName = library
.getChild(CanonicalName.methodsName)
.getChild('member');
Reference topLevelMemberNameReference = new Reference()
..canonicalName = topLevelMemberName;
testExpression(
new InstanceGet.byReference(
InstanceAccessKind.Instance,
new IntLiteral(0),
new Name('foo'),
interfaceTargetReference: topLevelMemberNameReference,
resultType: const DynamicType(),
),
'''
0.foo''',
);
testExpression(
new StaticGet.byReference(topLevelMemberNameReference),
'''
member''',
verbose: '''
library lib::member''',
);
CanonicalName className = library.getChild('Class');
Reference classNameReference = new Reference()..canonicalName = className;
testExpression(
new InstanceGet.byReference(
InstanceAccessKind.Instance,
new IntLiteral(0),
new Name('foo'),
interfaceTargetReference: classNameReference,
resultType: const DynamicType(),
),
'''
0.foo''',
);
testExpression(
new StaticGet.byReference(classNameReference),
'''
Class''',
verbose: '''
library lib::Class''',
);
CanonicalName classMemberName = className
.getChild(CanonicalName.methodsName)
.getChild('member');
Reference classMemberNameReference = new Reference()
..canonicalName = classMemberName;
testExpression(
new InstanceGet.byReference(
InstanceAccessKind.Instance,
new IntLiteral(0),
new Name('foo'),
interfaceTargetReference: classMemberNameReference,
resultType: const DynamicType(),
),
'''
0.foo''',
);
testExpression(
new StaticGet.byReference(classMemberNameReference),
'''
Class.member''',
verbose: '''
library lib::Class.member''',
);
}