// Copyright (c) 2016, 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. /// @docImport 'strong_mode_test.dart'; library; // import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:test/test.dart'; import '../src/dart/resolution/context_collection_resolution.dart'; /// Shared infrastructure for [StrongModeStaticTypeAnalyzer2Test]. class StaticTypeAnalyzer2TestShared extends PubPackageResolutionTest { /// Looks up the identifier with [name] and validates that its type type /// stringifies to [type] and that its generics match the given stringified /// output. FunctionType expectFunctionType( String name, String type, { String typeParams = '[]', String typeFormals = '[]', String? identifierType, }) { identifierType ??= type; String typeParametersStr(List elements) { var elementsStr = elements .map((e) { return e.displayString(); }) .join(', '); return '[$elementsStr]'; } SimpleIdentifier identifier = findNode.simple(name); var functionType = _getFunctionTypedElementType(identifier); assertType(functionType, type); expect(identifier.staticType, isNull); expect(typeParametersStr(functionType.typeParameters), typeFormals); return functionType; } /// Looks up the identifier with [name] and validates its static [type]. /// /// If [type] is a string, validates that the identifier's static type /// stringifies to that text. Otherwise, [type] is used directly a [Matcher] /// to match the type. void expectIdentifierType(String name, String type) { SimpleIdentifier identifier = findNode.simple(name); assertType(identifier.staticType, type); } /// Looks up the initializer for the declaration containing [name] and /// validates its static [type]. /// /// If [type] is a string, validates that the identifier's static type /// stringifies to that text. Otherwise, [type] is used directly a [Matcher] /// to match the type. void expectInitializerType(String name, String type) { var declaration = findNode.variableDeclaration(name); var initializer = declaration.initializer!; assertType(initializer.staticType, type); } FunctionType _getFunctionTypedElementType(SimpleIdentifier identifier) { var element = identifier.element; if (element is ExecutableElement) { return element.type; } else if (element is VariableElement) { return element.type as FunctionType; } else { fail('Unexpected element: (${element.runtimeType}) $element'); } } }