Files
sdk/pkg/front_end/test/text_representation/empty_reference_test.dart
T
Jens Johansen 430abc54e8 [CFE] Add toText to Reference and CanonicalName
Add `toText` to both Reference and CanonicalName.
Change how CanonicalNames are printed through `text_util.dart` to be
more aligned with how the corresponding node would be printed had
it existed (and the CanonicalName thus normally not been used for
printing).
Add a test for (some definition of) common cases where printing should
be the same wherther done though the node, the reference or the
canonical name.
Fix usage of toStringInternal in the constant evaluator (though only
in use through an experiment) and add a test that showed that the
previous output was bad and the new isn't (at least in this case).

Change-Id: I10cbc1a542c7d8b079e0510bbd5eb5173b2e7563
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/242102
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
2022-04-25 11:13:44 +00:00

158 lines
5.7 KiB
Dart

// 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''');
}