Skip to content

Commit a9a3ce1

Browse files
author
Dart CI
committed
Version 2.11.0-206.0.dev
Merge commit '45a46ca2b8833f62ecfb53f0a8cc63e1802132e1' into 'dev'
2 parents 712e35f + 45a46ca commit a9a3ce1

File tree

57 files changed

+3778
-959
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+3778
-959
lines changed

pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2879,8 +2879,7 @@ class DelayedGetterSetterCheck implements DelayedCheck {
28792879

28802880
void check(ClassHierarchyBuilder hierarchy) {
28812881
classBuilder.checkGetterSetter(hierarchy.types, getter.getMember(hierarchy),
2882-
setter.getMember(hierarchy),
2883-
isInterfaceCheck: !classBuilder.isMixinApplication);
2882+
setter.getMember(hierarchy));
28842883
}
28852884
}
28862885

pkg/front_end/lib/src/fasta/source/source_class_builder.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,8 +1126,7 @@ class SourceClassBuilder extends ClassBuilderImpl
11261126
// TODO(ahe): Handle other cases: accessors, operators, and fields.
11271127
}
11281128

1129-
void checkGetterSetter(Types types, Member getter, Member setter,
1130-
{bool isInterfaceCheck = false}) {
1129+
void checkGetterSetter(Types types, Member getter, Member setter) {
11311130
if (getter == setter) {
11321131
return;
11331132
}

pkg/front_end/lib/src/fasta/source/source_extension_builder.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,14 @@ class SourceExtensionBuilder extends ExtensionBuilderImpl {
255255
} else if (builder is ProcedureBuilder) {
256256
// Check procedures
257257
library.checkTypesInProcedureBuilder(builder, typeEnvironment);
258+
if (builder.isGetter) {
259+
Builder setterDeclaration =
260+
scope.lookupLocalMember(builder.name, setter: true);
261+
if (setterDeclaration != null) {
262+
library.checkGetterSetterTypes(
263+
builder, setterDeclaration, typeEnvironment);
264+
}
265+
}
258266
} else {
259267
assert(false, "Unexpected member: $builder.");
260268
}

pkg/front_end/lib/src/fasta/source/source_library_builder.dart

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import 'package:kernel/src/bounds_checks.dart'
6767
findTypeArgumentIssuesForInvocation,
6868
getGenericTypeName;
6969

70-
import 'package:kernel/type_algebra.dart' show substitute;
70+
import 'package:kernel/type_algebra.dart' show Substitution, substitute;
7171

7272
import 'package:kernel/type_environment.dart'
7373
show SubtypeCheckMode, TypeEnvironment;
@@ -1610,6 +1610,100 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
16101610
return typeVariablesByName;
16111611
}
16121612

1613+
void checkGetterSetterTypes(ProcedureBuilder getterBuilder,
1614+
ProcedureBuilder setterBuilder, TypeEnvironment typeEnvironment) {
1615+
DartType getterType;
1616+
List<TypeParameter> getterExtensionTypeParameters;
1617+
if (getterBuilder.isExtensionInstanceMember) {
1618+
// An extension instance getter
1619+
//
1620+
// extension E<T> on A {
1621+
// T get property => ...
1622+
// }
1623+
//
1624+
// is encoded as a top level method
1625+
//
1626+
// T# E#get#property<T#>(A #this) => ...
1627+
//
1628+
Procedure procedure = getterBuilder.procedure;
1629+
getterType = procedure.function.returnType;
1630+
getterExtensionTypeParameters = procedure.function.typeParameters;
1631+
} else {
1632+
getterType = getterBuilder.procedure.getterType;
1633+
}
1634+
DartType setterType;
1635+
if (setterBuilder.isExtensionInstanceMember) {
1636+
// An extension instance setter
1637+
//
1638+
// extension E<T> on A {
1639+
// void set property(T value) { ... }
1640+
// }
1641+
//
1642+
// is encoded as a top level method
1643+
//
1644+
// void E#set#property<T#>(A #this, T# value) { ... }
1645+
//
1646+
Procedure procedure = setterBuilder.procedure;
1647+
setterType = procedure.function.positionalParameters[1].type;
1648+
if (getterExtensionTypeParameters != null &&
1649+
getterExtensionTypeParameters.isNotEmpty) {
1650+
// We substitute the setter type parameters for the getter type
1651+
// parameters to check them below in a shared context.
1652+
List<TypeParameter> setterExtensionTypeParameters =
1653+
procedure.function.typeParameters;
1654+
assert(getterExtensionTypeParameters.length ==
1655+
setterExtensionTypeParameters.length);
1656+
setterType = Substitution.fromPairs(
1657+
setterExtensionTypeParameters,
1658+
new List<DartType>.generate(
1659+
getterExtensionTypeParameters.length,
1660+
(int index) => new TypeParameterType.forAlphaRenaming(
1661+
setterExtensionTypeParameters[index],
1662+
getterExtensionTypeParameters[index])))
1663+
.substituteType(setterType);
1664+
}
1665+
} else {
1666+
setterType = setterBuilder.procedure.setterType;
1667+
}
1668+
1669+
if (getterType is InvalidType || setterType is InvalidType) {
1670+
// Don't report a problem as something else is wrong that has already
1671+
// been reported.
1672+
} else {
1673+
bool isValid = typeEnvironment.isSubtypeOf(
1674+
getterType,
1675+
setterType,
1676+
library.isNonNullableByDefault
1677+
? SubtypeCheckMode.withNullabilities
1678+
: SubtypeCheckMode.ignoringNullabilities);
1679+
if (!isValid && !library.isNonNullableByDefault) {
1680+
// Allow assignability in legacy libraries.
1681+
isValid = typeEnvironment.isSubtypeOf(
1682+
setterType, getterType, SubtypeCheckMode.ignoringNullabilities);
1683+
}
1684+
if (!isValid) {
1685+
String getterMemberName = getterBuilder.fullNameForErrors;
1686+
String setterMemberName = setterBuilder.fullNameForErrors;
1687+
Template<Message Function(DartType, String, DartType, String, bool)>
1688+
template = library.isNonNullableByDefault
1689+
? templateInvalidGetterSetterType
1690+
: templateInvalidGetterSetterTypeLegacy;
1691+
addProblem(
1692+
template.withArguments(getterType, getterMemberName, setterType,
1693+
setterMemberName, library.isNonNullableByDefault),
1694+
getterBuilder.charOffset,
1695+
getterBuilder.name.length,
1696+
getterBuilder.fileUri,
1697+
context: [
1698+
templateInvalidGetterSetterTypeSetterContext
1699+
.withArguments(setterMemberName)
1700+
.withLocation(setterBuilder.fileUri, setterBuilder.charOffset,
1701+
setterBuilder.name.length)
1702+
]);
1703+
}
1704+
}
1705+
}
1706+
16131707
void addExtensionDeclaration(
16141708
String documentationComment,
16151709
List<MetadataBuilder> metadata,
@@ -3579,6 +3673,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
35793673
checkTypesInField(declaration, typeEnvironment);
35803674
} else if (declaration is ProcedureBuilder) {
35813675
checkTypesInProcedureBuilder(declaration, typeEnvironment);
3676+
if (declaration.isGetter) {
3677+
Builder setterDeclaration =
3678+
scope.lookupLocalMember(declaration.name, setter: true);
3679+
if (setterDeclaration != null) {
3680+
checkGetterSetterTypes(
3681+
declaration, setterDeclaration, typeEnvironment);
3682+
}
3683+
}
35823684
} else if (declaration is SourceClassBuilder) {
35833685
declaration.checkTypesInOutline(typeEnvironment);
35843686
} else if (declaration is SourceExtensionBuilder) {

pkg/front_end/test/spell_checking_list_tests.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,14 @@ producer
508508
profile
509509
profiler
510510
propagated
511+
property2a
512+
property2b
513+
property4a
514+
property4b
515+
property5a
516+
property5b
517+
property8a
518+
property8b
511519
protected
512520
proved
513521
provider
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
extension Extension<T> on int {
6+
int get duplicateInstanceGetter => 0;
7+
int get duplicateInstanceGetter => 0;
8+
9+
void set duplicateInstanceSetter(int value) {}
10+
void set duplicateInstanceSetter(int value) {}
11+
12+
void duplicateInstanceMethod() {}
13+
void duplicateInstanceMethod() {}
14+
15+
static int duplicateStaticField = 0;
16+
static int duplicateStaticField = 0;
17+
18+
static int get duplicateStaticGetter => 0;
19+
static int get duplicateStaticGetter => 0;
20+
21+
static void set duplicateStaticSetter(int value) {}
22+
static void set duplicateStaticSetter(int value) {}
23+
24+
static void duplicateStaticMethod() {}
25+
static void duplicateStaticMethod() {}
26+
27+
int get duplicateInstanceGetterPlusSetter => 0;
28+
int get duplicateInstanceGetterPlusSetter => 0;
29+
void set duplicateInstanceGetterPlusSetter(int value) {}
30+
31+
int get duplicateInstanceSetterPlusGetter => 0;
32+
void set duplicateInstanceSetterPlusGetter(int value) {}
33+
void set duplicateInstanceSetterPlusGetter(int value) {}
34+
35+
int get duplicateInstanceGetterAndSetter => 0;
36+
int get duplicateInstanceGetterAndSetter => 0;
37+
void set duplicateInstanceGetterAndSetter(int value) {}
38+
void set duplicateInstanceGetterAndSetter(int value) {}
39+
40+
static int get duplicateStaticGetterPlusSetter => 0;
41+
static int get duplicateStaticGetterPlusSetter => 0;
42+
static void set duplicateStaticGetterPlusSetter(int value) {}
43+
44+
static int get duplicateStaticSetterPlusGetter => 0;
45+
static void set duplicateStaticSetterPlusGetter(int value) {}
46+
static void set duplicateStaticSetterPlusGetter(int value) {}
47+
48+
static int get duplicateStaticGetterAndSetter => 0;
49+
static int get duplicateStaticGetterAndSetter => 0;
50+
static void set duplicateStaticGetterAndSetter(int value) {}
51+
static void set duplicateStaticGetterAndSetter(int value) {}
52+
53+
int get instanceGetterAndStaticSetter => 0;
54+
static void set instanceGetterAndStaticSetter(int value) {}
55+
56+
static int get instanceSetterAndStaticGetter => 0;
57+
void set instanceSetterAndStaticGetter(int value) {}
58+
59+
int get instanceGetterAndStaticField => 0;
60+
static int instanceGetterAndStaticField = 0;
61+
62+
void set instanceSetterAndStaticField(int value) {}
63+
static final int instanceGetterAndStaticField = 0;
64+
}
65+
66+
main() {}

0 commit comments

Comments
 (0)