Skip to content

Commit 17826a8

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Fix for updating field/getter type when inferred setter value type.
Change-Id: Ib1339e023c5f5f6f4a50a817365a824471bc4730 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/442540 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent c324e0c commit 17826a8

File tree

2 files changed

+127
-8
lines changed

2 files changed

+127
-8
lines changed

pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -216,17 +216,21 @@ class InstanceMemberInferrer {
216216
return;
217217
}
218218

219+
void setSetterValueType(TypeImpl valueType) {
220+
valueFormalParameter.type = valueType;
221+
var field = setter.variable as FieldElementImpl;
222+
if (field.getter == null) {
223+
field.type = valueType;
224+
}
225+
}
226+
219227
// The return type of a getter, parameter type of a setter or type of a
220228
// field which overrides/implements only one or more getters is inferred
221229
// to be the return type of the combined member signature of said getter
222230
// in the direct superinterfaces.
223231
if (overriddenGetters.isNotEmpty && overriddenSetters.isEmpty) {
224232
var valueType = combinedGetterType();
225-
valueFormalParameter.type = valueType;
226-
var fieldElement = setter.variable as FieldElementImpl;
227-
if (fieldElement.getter == null) {
228-
fieldElement.type = valueType;
229-
}
233+
setSetterValueType(valueType);
230234
return;
231235
}
232236

@@ -240,9 +244,7 @@ class InstanceMemberInferrer {
240244
// combined member signature of said setter in the direct superinterfaces.
241245
if (overriddenSetters.isNotEmpty) {
242246
var valueType = combinedSetterType();
243-
valueFormalParameter.type = valueType;
244-
var fieldElement = setter.variable as FieldElementImpl;
245-
fieldElement.type = valueType;
247+
setSetterValueType(valueType);
246248
return;
247249
}
248250

pkg/analyzer/test/src/summary/top_level_inference_test.dart

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8506,6 +8506,123 @@ library
85068506
''');
85078507
}
85088508

8509+
test_instanceField_fromField_finalFieldTyped_setterNotTyped() async {
8510+
var library = await _encodeDecodeLibrary(r'''
8511+
abstract class A {
8512+
int? foo;
8513+
}
8514+
class B implements A {
8515+
final int foo;
8516+
set foo(_) {}
8517+
}
8518+
''');
8519+
checkElementText(library, r'''
8520+
library
8521+
reference: <testLibrary>
8522+
fragments
8523+
#F0 <testLibraryFragment>
8524+
element: <testLibrary>
8525+
classes
8526+
#F1 class A (nameOffset:15) (firstTokenOffset:0) (offset:15)
8527+
element: <testLibrary>::@class::A
8528+
fields
8529+
#F2 foo (nameOffset:26) (firstTokenOffset:26) (offset:26)
8530+
element: <testLibrary>::@class::A::@field::foo
8531+
constructors
8532+
#F3 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
8533+
element: <testLibrary>::@class::A::@constructor::new
8534+
typeName: A
8535+
getters
8536+
#F4 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
8537+
element: <testLibrary>::@class::A::@getter::foo
8538+
setters
8539+
#F5 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
8540+
element: <testLibrary>::@class::A::@setter::foo
8541+
formalParameters
8542+
#F6 value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
8543+
element: <testLibrary>::@class::A::@setter::foo::@formalParameter::value
8544+
#F7 class B (nameOffset:39) (firstTokenOffset:33) (offset:39)
8545+
element: <testLibrary>::@class::B
8546+
fields
8547+
#F8 foo (nameOffset:68) (firstTokenOffset:68) (offset:68)
8548+
element: <testLibrary>::@class::B::@field::foo
8549+
constructors
8550+
#F9 synthetic new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
8551+
element: <testLibrary>::@class::B::@constructor::new
8552+
typeName: B
8553+
getters
8554+
#F10 synthetic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
8555+
element: <testLibrary>::@class::B::@getter::foo
8556+
setters
8557+
#F11 foo (nameOffset:79) (firstTokenOffset:75) (offset:79)
8558+
element: <testLibrary>::@class::B::@setter::foo
8559+
formalParameters
8560+
#F12 _ (nameOffset:83) (firstTokenOffset:83) (offset:83)
8561+
element: <testLibrary>::@class::B::@setter::foo::@formalParameter::_
8562+
classes
8563+
abstract class A
8564+
reference: <testLibrary>::@class::A
8565+
firstFragment: #F1
8566+
fields
8567+
foo
8568+
reference: <testLibrary>::@class::A::@field::foo
8569+
firstFragment: #F2
8570+
type: int?
8571+
getter: <testLibrary>::@class::A::@getter::foo
8572+
setter: <testLibrary>::@class::A::@setter::foo
8573+
constructors
8574+
synthetic new
8575+
reference: <testLibrary>::@class::A::@constructor::new
8576+
firstFragment: #F3
8577+
getters
8578+
synthetic foo
8579+
reference: <testLibrary>::@class::A::@getter::foo
8580+
firstFragment: #F4
8581+
returnType: int?
8582+
variable: <testLibrary>::@class::A::@field::foo
8583+
setters
8584+
synthetic foo
8585+
reference: <testLibrary>::@class::A::@setter::foo
8586+
firstFragment: #F5
8587+
formalParameters
8588+
#E0 requiredPositional value
8589+
firstFragment: #F6
8590+
type: int?
8591+
returnType: void
8592+
class B
8593+
reference: <testLibrary>::@class::B
8594+
firstFragment: #F7
8595+
interfaces
8596+
A
8597+
fields
8598+
final foo
8599+
reference: <testLibrary>::@class::B::@field::foo
8600+
firstFragment: #F8
8601+
type: int
8602+
getter: <testLibrary>::@class::B::@getter::foo
8603+
setter: <testLibrary>::@class::B::@setter::foo
8604+
constructors
8605+
synthetic new
8606+
reference: <testLibrary>::@class::B::@constructor::new
8607+
firstFragment: #F9
8608+
getters
8609+
synthetic foo
8610+
reference: <testLibrary>::@class::B::@getter::foo
8611+
firstFragment: #F10
8612+
returnType: int
8613+
variable: <testLibrary>::@class::B::@field::foo
8614+
setters
8615+
foo
8616+
reference: <testLibrary>::@class::B::@setter::foo
8617+
firstFragment: #F11
8618+
formalParameters
8619+
#E1 requiredPositional hasImplicitType _
8620+
firstFragment: #F12
8621+
type: int?
8622+
returnType: void
8623+
''');
8624+
}
8625+
85098626
test_instanceField_fromField_generic() async {
85108627
var library = await _encodeDecodeLibrary(r'''
85118628
abstract class A<E> {

0 commit comments

Comments
 (0)