28d7984e31
Issue: https://github.com/dart-lang/sdk/issues/61635 Change-Id: I7476ec7e66edd958c66e31dabcd6ab8d818594e5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/509640 Reviewed-by: Slava Egorov <vegorov@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
251 lines
10 KiB
Dart
251 lines
10 KiB
Dart
// Copyright (c) 2025, 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:cfg/ir/global_context.dart';
|
|
import 'package:cfg/ir/functions.dart';
|
|
import 'package:cfg/ir/types.dart';
|
|
import 'package:kernel/ast.dart' as ast;
|
|
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
|
|
import 'package:kernel/core_types.dart' show CoreTypes;
|
|
import 'package:kernel/type_environment.dart';
|
|
import 'package:test/test.dart';
|
|
import '../test_helpers.dart';
|
|
|
|
void main() {
|
|
final component = readVmPlatformKernelFile();
|
|
final coreTypes = CoreTypes(component);
|
|
final classHierarchy = ClassHierarchy(component, coreTypes);
|
|
final typeEnvironment = TypeEnvironment(coreTypes, classHierarchy);
|
|
final globalContext = GlobalContext(typeEnvironment: typeEnvironment);
|
|
late FunctionRegistry functionRegistry;
|
|
|
|
setUp(() {
|
|
GlobalContext.setCurrentContext(globalContext);
|
|
functionRegistry = FunctionRegistry();
|
|
});
|
|
|
|
tearDown(() {
|
|
GlobalContext.setCurrentContext(null);
|
|
});
|
|
|
|
test('getter', () {
|
|
final member = coreTypes.iteratorGetCurrent;
|
|
final func =
|
|
functionRegistry.getFunction(member, isGetter: true) as GetterFunction;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isTrue);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isTrue);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
final returnType = func.returnType;
|
|
expect(returnType is StaticType, isTrue);
|
|
expect(returnType.dartType, equals(member.getterType));
|
|
expect(functionRegistry.getFunction(member, isGetter: true), same(func));
|
|
});
|
|
|
|
test('setter', () {
|
|
final member = coreTypes.index.getMember('dart:core', 'List', 'set:length');
|
|
final func =
|
|
functionRegistry.getFunction(member, isSetter: true) as SetterFunction;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isTrue);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isTrue);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
final returnType = func.returnType;
|
|
expect(returnType is TopType, isTrue);
|
|
expect(returnType.dartType, equals(ast.VoidType()));
|
|
expect(func.valueType, equals(const IntType()));
|
|
expect(functionRegistry.getFunction(member, isSetter: true), same(func));
|
|
});
|
|
|
|
test('field getter', () {
|
|
final member = coreTypes.pragmaName;
|
|
final func = functionRegistry.getFunction(
|
|
member,
|
|
isGetter: true,
|
|
) as ImplicitFieldGetter;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isTrue);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
expect(func.returnType, equals(StringType()));
|
|
expect(functionRegistry.getFunction(member, isGetter: true), same(func));
|
|
});
|
|
|
|
test('field setter', () {
|
|
final member = coreTypes.index.getField(
|
|
'dart:core',
|
|
'Error',
|
|
'_stackTrace',
|
|
);
|
|
final func = functionRegistry.getFunction(
|
|
member,
|
|
isSetter: true,
|
|
) as ImplicitFieldSetter;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isTrue);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
expect(func.returnType, equals(TopType(const ast.VoidType())));
|
|
expect(functionRegistry.getFunction(member, isSetter: true), same(func));
|
|
expect(
|
|
functionRegistry.getFunction(member, isGetter: true),
|
|
isNot(same(func)),
|
|
);
|
|
});
|
|
|
|
test('field initializer', () {
|
|
final member = coreTypes.index.getField('dart:core', 'double', 'nan');
|
|
final func = functionRegistry.getFunction(
|
|
member,
|
|
isInitializer: true,
|
|
) as FieldInitializerFunction;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isFalse);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
expect(func.returnType, equals(DoubleType()));
|
|
expect(
|
|
functionRegistry.getFunction(member, isInitializer: true),
|
|
same(func),
|
|
);
|
|
expect(
|
|
functionRegistry.getFunction(member, isGetter: true),
|
|
isNot(same(func)),
|
|
);
|
|
});
|
|
|
|
test('regular', () {
|
|
final member = coreTypes.index.getProcedure('dart:core', 'List', 'filled');
|
|
final func = functionRegistry.getFunction(member) as RegularFunction;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isFalse);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isTrue);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(1));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
final returnType = func.returnType;
|
|
expect(returnType is StaticType, isTrue);
|
|
expect(returnType.dartType, equals(member.function.returnType));
|
|
expect(functionRegistry.getFunction(member), same(func));
|
|
});
|
|
|
|
test('constructor', () {
|
|
final member = coreTypes.index.getConstructor('dart:core', 'Object', '');
|
|
final func = functionRegistry.getFunction(member) as GenerativeConstructor;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isTrue);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
final returnType = func.returnType;
|
|
expect(returnType is TopType, isTrue);
|
|
expect(returnType.dartType, equals(ast.VoidType()));
|
|
expect(functionRegistry.getFunction(member), same(func));
|
|
});
|
|
|
|
test('tear-off', () {
|
|
final member = coreTypes.index.getProcedure('dart:core', 'List', 'empty');
|
|
final func = functionRegistry.getFunction(
|
|
member,
|
|
isTearOff: true,
|
|
) as TearOffFunction;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isFalse);
|
|
expect(func.hasClosureParameter, isTrue);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isTrue);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(1));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
final returnType = func.returnType;
|
|
expect(returnType is StaticType, isTrue);
|
|
expect(returnType.dartType, equals(member.function.returnType));
|
|
expect(functionRegistry.getFunction(member, isTearOff: true), same(func));
|
|
expect(functionRegistry.getFunction(member), isNot(same(func)));
|
|
});
|
|
|
|
test('local function', () {
|
|
final member = coreTypes.futureValueFactory;
|
|
final enclosingFunction = functionRegistry.getFunction(member);
|
|
final localFunction = ast.FunctionDeclaration(
|
|
ast.Variable('foo'),
|
|
ast.FunctionNode(
|
|
ast.Block([]),
|
|
returnType: coreTypes.boolNonNullableRawType,
|
|
),
|
|
);
|
|
final func = functionRegistry.getFunction(
|
|
member,
|
|
enclosingFunction: enclosingFunction,
|
|
localFunction: localFunction,
|
|
) as LocalFunction;
|
|
expect(func.member, same(member));
|
|
expect(func.localFunction, same(localFunction));
|
|
expect(func.hasReceiverParameter, isFalse);
|
|
expect(func.hasClosureParameter, isTrue);
|
|
expect(func.hasClassTypeParameters, isFalse);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isTrue);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(1));
|
|
expect(func.returnType, equals(BoolType()));
|
|
expect(
|
|
functionRegistry.getFunction(member, localFunction: localFunction),
|
|
same(func),
|
|
);
|
|
});
|
|
|
|
test('method-extractor', () {
|
|
final member = coreTypes.index.getProcedure('dart:core', 'List', 'add');
|
|
final func = functionRegistry.getFunction(
|
|
member,
|
|
isMethodExtractor: true,
|
|
) as MethodExtractor;
|
|
expect(func.member, same(member));
|
|
expect(func.hasReceiverParameter, isTrue);
|
|
expect(func.hasClosureParameter, isFalse);
|
|
expect(func.hasClassTypeParameters, isTrue);
|
|
expect(func.hasFunctionTypeParameters, isFalse);
|
|
expect(func.hasEnclosingFunctionTypeParameters, isFalse);
|
|
expect(func.numberOfFunctionTypeParameters, equals(0));
|
|
expect(func.numberOfEnclosingFunctionTypeParameters, equals(0));
|
|
final returnType = func.returnType;
|
|
expect(returnType is StaticType, isTrue);
|
|
expect(
|
|
returnType.dartType,
|
|
equals(member.function.computeFunctionType(.nonNullable)),
|
|
);
|
|
expect(
|
|
functionRegistry.getFunction(member, isMethodExtractor: true),
|
|
same(func),
|
|
);
|
|
expect(functionRegistry.getFunction(member), isNot(same(func)));
|
|
});
|
|
}
|