Skip to content

Commit d2e5d47

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Fix for crash when annotation references synthtic constructor of a generic class alias.
FAILURE: mixi@:class<s=a(=m [NoSuchMethodError: The getter 'enclosingElement' was called on null. Receiver: null Tried calling: enclosingElement, #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5) flutter#1 LinkedResolutionReader.nextElement (package:analyzer/src/summary2/bundle_reader.dart:602:22) flutter#2 ApplyResolutionVisitor._nextElement (package:analyzer/src/summary2/apply_resolution.dart:1106:24) flutter#3 ApplyResolutionVisitor.visitAnnotation (package:analyzer/src/summary2/apply_resolution.dart:83:20) flutter#4 AnnotationImpl.accept (package:analyzer/src/dart/ast/ast.dart:280:49) #5 NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7611:20) flutter#6 ApplyResolutionVisitor.visitClassTypeAlias (package:analyzer/src/summary2/apply_resolution.dart:167:20) flutter#7 ClassTypeAliasImpl.accept (package:analyzer/src/dart/ast/ast.dart:1794:49) flutter#8 LinkedContext.applyResolution (package:analyzer/src/summary2/bundle_reader.dart:512:11) flutter#9 LinkedUnitContext.applyResolution (package:analyzer/src/summary2/linked_unit_context.dart:93:25) flutter#10 ElementImpl.metadata (package:analyzer/src/dart/element/element.dart:2893:21) flutter#11 ResolutionVisitor.visitClassTypeAlias (package:analyzer/src/dart/resolver/resolution_visitor.dart:256:51) flutter#12 ClassTypeAliasImpl.accept (package:analyzer/src/dart/ast/ast.dart:1794:49) flutter#13 NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:7611:20) flutter#14 CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2141:21) flutter#15 RecursiveAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:731:10) flutter#16 CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2134:49) flutter#17 LibraryAnalyzer._resolveFile (package:analyzer/src/dart/analysis/library_analyzer.dart:680:10) flutter#18 LibraryAnalyzer.analyzeSync.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:139:7) flutter#19 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:387:8) flutter#20 LibraryAnalyzer.analyzeSync (package:analyzer/src/dart/analysis/library_analyzer.dart:138:11) #21 LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:107:12) #22 AnalysisDriver._computeResolvedLibrary2.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1414:65) #23 PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:32:15) #24 AnalysisDriver._computeResolvedLibrary2 (package:analyzer/src/dart/analysis/driver.dart:1400:20) #25 AnalysisDriver._computeResolvedLibrary.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1393:15) Change-Id: I6f04a325b30d9dc61e7eb1a4bba91ed8b9bcd1d3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/176060 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 9dad187 commit d2e5d47

File tree

2 files changed

+106
-2
lines changed

2 files changed

+106
-2
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -956,9 +956,13 @@ class ClassElementImpl extends AbstractClassElementImpl
956956
// substituting type parameters as appropriate.
957957
return constructorsToForward
958958
.map((ConstructorElement superclassConstructor) {
959-
ConstructorElementImpl implicitConstructor =
960-
ConstructorElementImpl(superclassConstructor.name, -1);
959+
var containerRef = reference.getChild('@constructor');
960+
var name = superclassConstructor.name;
961+
var implicitConstructor = ConstructorElementImpl.forLinkedNode(
962+
this, containerRef.getChild(name), null);
961963
implicitConstructor.isSynthetic = true;
964+
implicitConstructor.name = name;
965+
implicitConstructor.nameOffset = -1;
962966
implicitConstructor.redirectedConstructor = superclassConstructor;
963967
var hasMixinWithInstanceVariables = mixins.any(typeHasInstanceVariables);
964968
implicitConstructor.isConst =

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

+100
Original file line numberDiff line numberDiff line change
@@ -9547,6 +9547,62 @@ class C {
95479547
''');
95489548
}
95499549

9550+
test_metadata_constructor_call_named_synthetic_ofClassAlias_generic() async {
9551+
var library = await checkLibrary('''
9552+
class A {
9553+
const A.named();
9554+
}
9555+
9556+
mixin B {}
9557+
9558+
class C<T> = A with B;
9559+
9560+
@C.named()
9561+
class D {}
9562+
''');
9563+
checkElementText(
9564+
library,
9565+
r'''
9566+
class A {
9567+
const A.named();
9568+
}
9569+
class alias C extends A with B {
9570+
synthetic const C.named() = A.named;
9571+
}
9572+
typeParameters
9573+
T
9574+
bound: null
9575+
defaultType: dynamic
9576+
class D {
9577+
}
9578+
metadata
9579+
Annotation
9580+
arguments: ArgumentList
9581+
element: ConstructorMember
9582+
base: self::@class::C::@constructor::named
9583+
substitution: {T: dynamic}
9584+
name: PrefixedIdentifier
9585+
identifier: SimpleIdentifier
9586+
staticElement: ConstructorMember
9587+
base: self::@class::C::@constructor::named
9588+
substitution: {T: dynamic}
9589+
staticType: null
9590+
token: named
9591+
period: .
9592+
prefix: SimpleIdentifier
9593+
staticElement: self::@class::C
9594+
staticType: null
9595+
token: C
9596+
staticElement: ConstructorMember
9597+
base: self::@class::C::@constructor::named
9598+
substitution: {T: dynamic}
9599+
staticType: null
9600+
mixin B on Object {
9601+
}
9602+
''',
9603+
withFullyResolvedAst: true);
9604+
}
9605+
95509606
test_metadata_constructor_call_unnamed() async {
95519607
var library = await checkLibrary('class A { const A(); } @A() class C {}');
95529608
checkElementText(library, r'''
@@ -9574,6 +9630,50 @@ class C {
95749630
''');
95759631
}
95769632

9633+
test_metadata_constructor_call_unnamed_synthetic_ofClassAlias_generic() async {
9634+
var library = await checkLibrary('''
9635+
class A {
9636+
const A();
9637+
}
9638+
9639+
mixin B {}
9640+
9641+
class C<T> = A with B;
9642+
9643+
@C()
9644+
class D {}
9645+
''');
9646+
checkElementText(
9647+
library,
9648+
r'''
9649+
class A {
9650+
const A();
9651+
}
9652+
class alias C extends A with B {
9653+
synthetic const C() = A;
9654+
}
9655+
typeParameters
9656+
T
9657+
bound: null
9658+
defaultType: dynamic
9659+
class D {
9660+
}
9661+
metadata
9662+
Annotation
9663+
arguments: ArgumentList
9664+
element: ConstructorMember
9665+
base: self::@class::C::@constructor::•
9666+
substitution: {T: dynamic}
9667+
name: SimpleIdentifier
9668+
staticElement: self::@class::C
9669+
staticType: null
9670+
token: C
9671+
mixin B on Object {
9672+
}
9673+
''',
9674+
withFullyResolvedAst: true);
9675+
}
9676+
95779677
test_metadata_constructor_call_with_args() async {
95789678
var library =
95799679
await checkLibrary('class A { const A(x); } @A(null) class C {}');

0 commit comments

Comments
 (0)