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