Files
sdk/pkg/cfg/test/ir/functions_test.dart
T
Alexander Markov 28d7984e31 [modular_aot] Use primary constructors
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>
2026-06-08 10:32:03 -07:00

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