// 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. // @dart = 2.9 import 'package:expect/expect.dart'; import 'package:kernel/ast.dart'; import 'text_representation_test.dart'; 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}"); } 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}"); } main() { testTypes(); testMembers(); } void testTypes() { testType(new InterfaceType.byReference(null, Nullability.nonNullable, []), ''); testType(new TypedefType.byReference(null, Nullability.nonNullable, []), ''); Reference unlinkedClassName = new Reference(); testType( new InterfaceType.byReference( unlinkedClassName, Nullability.nonNullable, []), ''); testType( new TypedefType.byReference( unlinkedClassName, Nullability.nonNullable, []), ''); CanonicalName root = new CanonicalName.root(); Reference rootReference = new Reference()..canonicalName = root; testType( new InterfaceType.byReference(rootReference, Nullability.nonNullable, []), ''); testType( new TypedefType.byReference(rootReference, Nullability.nonNullable, []), ''); CanonicalName library = root.getChild('library'); Reference libraryReference = new Reference()..canonicalName = library; testType( new InterfaceType.byReference( libraryReference, Nullability.nonNullable, []), 'library'); testType( new TypedefType.byReference( libraryReference, Nullability.nonNullable, []), 'library'); CanonicalName className = library.getChild('Class'); Reference classNameReference = new Reference()..canonicalName = className; testType( new InterfaceType.byReference( classNameReference, Nullability.nonNullable, []), 'Class', verbose: 'library::Class'); testType( new TypedefType.byReference( classNameReference, Nullability.nonNullable, []), 'Class', verbose: 'library::Class'); } void testMembers() { testExpression(new PropertyGet(new IntLiteral(0), new Name('foo')), ''' 0.foo'''); testExpression(new StaticGet.byReference(null), ''' '''); Reference unlinkedMemberName = new Reference(); testExpression( new PropertyGet.byReference( new IntLiteral(0), new Name('foo'), unlinkedMemberName), ''' 0.foo'''); testExpression(new StaticGet.byReference(unlinkedMemberName), ''' '''); CanonicalName root = new CanonicalName.root(); Reference rootReference = new Reference()..canonicalName = root; testExpression( new PropertyGet.byReference( new IntLiteral(0), new Name('foo'), rootReference), ''' 0.foo'''); testExpression(new StaticGet.byReference(rootReference), ''' '''); CanonicalName library = root.getChild('library'); Reference libraryReference = new Reference()..canonicalName = library; testExpression( new PropertyGet.byReference( new IntLiteral(0), new Name('foo'), libraryReference), ''' 0.foo'''); testExpression(new StaticGet.byReference(libraryReference), ''' library'''); CanonicalName topLevelMemberName = library.getChild('member'); Reference topLevelMemberNameReference = new Reference() ..canonicalName = topLevelMemberName; testExpression( new PropertyGet.byReference( new IntLiteral(0), new Name('foo'), topLevelMemberNameReference), ''' 0.foo'''); testExpression(new StaticGet.byReference(topLevelMemberNameReference), ''' member''', verbose: ''' library::member'''); CanonicalName className = library.getChild('Class'); Reference classNameReference = new Reference()..canonicalName = className; testExpression( new PropertyGet.byReference( new IntLiteral(0), new Name('foo'), classNameReference), ''' 0.foo'''); testExpression(new StaticGet.byReference(classNameReference), ''' Class''', verbose: ''' library::Class'''); CanonicalName classMemberName = className.getChild('member'); Reference classMemberNameReference = new Reference() ..canonicalName = classMemberName; testExpression( new PropertyGet.byReference( new IntLiteral(0), new Name('foo'), classMemberNameReference), ''' 0.foo'''); testExpression(new StaticGet.byReference(classMemberNameReference), ''' Class.member''', verbose: ''' library::Class.member'''); }