Skip to content

Commit 62a2752

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Translate ConstructorElement(s) of parameterized InterfaceType(s) to ConstructorMember(s).
[email protected], [email protected] Change-Id: I865a2e96f691d827165eabf382b5677d0831e831 Bug: #33506 Reviewed-on: https://dart-review.googlesource.com/68161 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent a19a468 commit 62a2752

File tree

9 files changed

+171
-158
lines changed

9 files changed

+171
-158
lines changed

pkg/analysis_server/test/analysis/get_hover_test.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -623,14 +623,4 @@ class AnalysisHoverTest_UseCFE extends AnalysisHoverTest {
623623
@override
624624
test_expression_literal_noElement() async =>
625625
super.test_expression_literal_noElement();
626-
627-
@failingTest
628-
@override
629-
test_expression_method_invocation_genericMethod() async =>
630-
super.test_expression_method_invocation_genericMethod();
631-
632-
@failingTest
633-
@override
634-
test_instanceCreation_implicit_withTypeArgument() async =>
635-
super.test_instanceCreation_implicit_withTypeArgument();
636626
}

pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:analyzer/src/dart/constant/evaluation.dart';
2020
import 'package:analyzer/src/dart/constant/utilities.dart';
2121
import 'package:analyzer/src/dart/element/element.dart';
2222
import 'package:analyzer/src/dart/element/handle.dart';
23+
import 'package:analyzer/src/dart/element/member.dart';
2324
import 'package:analyzer/src/error/codes.dart';
2425
import 'package:analyzer/src/error/pending_error.dart';
2526
import 'package:analyzer/src/fasta/error_converter.dart';
@@ -1145,7 +1146,8 @@ class _ResolutionApplierContext implements TypeContext {
11451146
Element translateReference(kernel.Node referencedNode,
11461147
{bool isWriteReference = false,
11471148
bool isTypeReference = false,
1148-
kernel.DartType inferredType}) {
1149+
kernel.DartType inferredType,
1150+
kernel.DartType receiverType}) {
11491151
if (referencedNode == null) {
11501152
if (isTypeReference && inferredType is kernel.DynamicType) {
11511153
return typeProvider.dynamicType.element;
@@ -1179,10 +1181,26 @@ class _ResolutionApplierContext implements TypeContext {
11791181
'TODO(paulberry): ${referencedNode.runtimeType}');
11801182
}
11811183
if (element is PropertyInducingElement) {
1182-
return isWriteReference ? element.setter : element.getter;
1183-
} else {
1184-
return element;
1184+
PropertyInducingElement property = element;
1185+
element = isWriteReference ? property.setter : property.getter;
1186+
}
1187+
if (element is ConstructorElement &&
1188+
inferredType is kernel.InterfaceType &&
1189+
inferredType.typeArguments.isNotEmpty) {
1190+
InterfaceType type = translateType(inferredType);
1191+
return ConstructorMember.from(element, type);
1192+
}
1193+
if (receiverType is kernel.InterfaceType &&
1194+
receiverType.typeArguments.isNotEmpty) {
1195+
InterfaceType type = translateType(receiverType);
1196+
if (element is MethodElement) {
1197+
return MethodMember.from(element, type);
1198+
}
1199+
if (element is PropertyAccessorElement) {
1200+
return PropertyAccessorMember.from(element, type);
1201+
}
11851202
}
1203+
return element;
11861204
}
11871205

11881206
@override

pkg/analyzer/lib/src/fasta/resolution_applier.dart

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -378,16 +378,8 @@ class ResolutionApplier extends GeneralizingAstVisitor {
378378
void visitIndexExpression(IndexExpression node) {
379379
node.target?.accept(this);
380380

381-
DartType targetType = node.realTarget.staticType;
382381
var data = _get(node.leftBracket);
383-
MethodElement element = _translateReference(data);
384-
385-
// Convert the raw element into a member.
386-
if (targetType is InterfaceType) {
387-
MethodElement member = MethodMember.from(element, targetType);
388-
node.staticElement = member;
389-
}
390-
382+
node.staticElement = _translateReference(data);
391383
node.staticType = _translateType(data.inferredType);
392384

393385
node.index.accept(this);
@@ -541,7 +533,7 @@ class ResolutionApplier extends GeneralizingAstVisitor {
541533
}
542534

543535
if (invokeElement is ConstructorElement) {
544-
_rewriteInfoInstanceCreation(node, invokeElement, invokeType, resultType);
536+
_rewriteIntoInstanceCreation(node, invokeElement, invokeType, resultType);
545537
}
546538
}
547539

@@ -769,7 +761,7 @@ class ResolutionApplier extends GeneralizingAstVisitor {
769761
}
770762

771763
/// Rewrite AST if the [node] represents an instance creation.
772-
void _rewriteInfoInstanceCreation(
764+
void _rewriteIntoInstanceCreation(
773765
MethodInvocation node,
774766
ConstructorElement invokeElement,
775767
DartType invokeType,
@@ -891,7 +883,8 @@ class ResolutionApplier extends GeneralizingAstVisitor {
891883
return _typeContext.translateReference(data.reference,
892884
isWriteReference: data.isWriteReference,
893885
isTypeReference: data.isTypeReference,
894-
inferredType: data.inferredType);
886+
inferredType: data.inferredType,
887+
receiverType: data.receiverType);
895888
}
896889

897890
DartType _translateType(kernel.DartType type) {
@@ -948,7 +941,8 @@ abstract class TypeContext {
948941
Element translateReference(kernel.Node referencedNode,
949942
{bool isWriteReference = false,
950943
bool isTypeReference = false,
951-
kernel.DartType inferredType});
944+
kernel.DartType inferredType,
945+
kernel.DartType receiverType});
952946

953947
/// Return the Analyzer [DartType] for the given [kernelType].
954948
DartType translateType(kernel.DartType kernelType);

pkg/analyzer/lib/src/fasta/resolution_storer.dart

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ResolutionData {
2424
final bool isWriteReference;
2525
final Node loadLibrary;
2626
final int prefixInfo;
27+
final DartType receiverType;
2728
final Node reference;
2829
final DartType writeContext;
2930

@@ -41,6 +42,7 @@ class ResolutionData {
4142
this.isWriteReference = false,
4243
this.loadLibrary,
4344
this.prefixInfo,
45+
this.receiverType,
4446
this.reference,
4547
this.writeContext});
4648
}
@@ -387,10 +389,18 @@ class ResolutionStorer
387389
void thenStatement,
388390
void elseStatement) {}
389391

390-
void indexAssign(ExpressionJudgment judgment, int location, Node writeMember,
391-
Node combiner, DartType inferredType) {
392+
void indexAssign(
393+
ExpressionJudgment judgment,
394+
int location,
395+
DartType receiverType,
396+
Node writeMember,
397+
Node combiner,
398+
DartType inferredType) {
392399
_store(location,
393-
reference: writeMember, inferredType: inferredType, combiner: combiner);
400+
reference: writeMember,
401+
inferredType: inferredType,
402+
combiner: combiner,
403+
receiverType: receiverType);
394404
}
395405

396406
IntLiteralTokens intLiteralTokens(Token literal) {
@@ -498,6 +508,7 @@ class ResolutionStorer
498508
void methodInvocation(
499509
ExpressionJudgment judgment,
500510
int resultOffset,
511+
DartType receiverType,
501512
List<DartType> argumentsTypes,
502513
bool isImplicitCall,
503514
Node interfaceMember,
@@ -513,6 +524,7 @@ class ResolutionStorer
513524
argumentTypes: argumentsTypes,
514525
invokeType: invokeType,
515526
isImplicitCall: isImplicitCall,
527+
receiverType: receiverType,
516528
reference: interfaceMember);
517529
}
518530

@@ -561,6 +573,7 @@ class ResolutionStorer
561573
void propertyAssign(
562574
ExpressionJudgment judgment,
563575
int location,
576+
DartType receiverType,
564577
Node writeMember,
565578
DartType writeContext,
566579
Node combiner,
@@ -570,15 +583,22 @@ class ResolutionStorer
570583
reference: writeMember,
571584
writeContext: writeContext,
572585
combiner: combiner,
573-
inferredType: inferredType);
586+
inferredType: inferredType,
587+
receiverType: receiverType);
574588
}
575589

576-
void propertyGet(ExpressionJudgment judgment, int location,
577-
bool forSyntheticToken, Node member, DartType inferredType) {
590+
void propertyGet(
591+
ExpressionJudgment judgment,
592+
int location,
593+
bool forSyntheticToken,
594+
DartType receiverType,
595+
Node member,
596+
DartType inferredType) {
578597
_store(location,
579598
reference: member,
580599
inferredType: inferredType,
581-
isSynthetic: forSyntheticToken);
600+
isSynthetic: forSyntheticToken,
601+
receiverType: receiverType);
582602
}
583603

584604
void propertyGetCall(
@@ -840,6 +860,7 @@ class ResolutionStorer
840860
bool isWriteReference = false,
841861
Node loadLibrary,
842862
int prefixInfo,
863+
DartType receiverType,
843864
Node reference,
844865
bool replace = false,
845866
DartType writeContext}) {
@@ -868,6 +889,7 @@ class ResolutionStorer
868889
isWriteReference: isWriteReference,
869890
loadLibrary: loadLibrary,
870891
prefixInfo: prefixInfo,
892+
receiverType: receiverType,
871893
reference: reference,
872894
writeContext: writeContext);
873895
}

pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,6 @@ class AnalysisDriverResolutionTest_Kernel extends AnalysisDriverResolutionTest {
4949
await super.test_invalid_fieldInitializer_this();
5050
}
5151

52-
@override
53-
@failingTest
54-
test_optionalConst_typeArguments() async {
55-
// We should get ConstructorMember, but convert to just ConstructorElement.
56-
await super.test_optionalConst_typeArguments();
57-
}
58-
5952
@override
6053
@failingTest
6154
test_unresolved_assignment_left_indexed1_simple() async {

0 commit comments

Comments
 (0)