Skip to content

Commit

Permalink
Version 3.3.0-197.0.dev
Browse files Browse the repository at this point in the history
Merge a0cc7ae into dev
  • Loading branch information
Dart CI committed Dec 6, 2023
2 parents 9e54241 + a0cc7ae commit 691e465
Show file tree
Hide file tree
Showing 7 changed files with 231 additions and 15 deletions.
24 changes: 20 additions & 4 deletions pkg/analyzer/lib/src/dart/element/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,12 @@ class AugmentedEnumElementImpl extends AugmentedInterfaceElementImpl
implements AugmentedEnumElement {}

class AugmentedExtensionElementImpl extends AugmentedInstanceElementImpl
implements AugmentedExtensionElement {}
implements AugmentedExtensionElement {
@override
final ExtensionElementImpl declaration;

AugmentedExtensionElementImpl(this.declaration);
}

class AugmentedExtensionTypeElementImpl extends AugmentedInterfaceElementImpl
implements AugmentedExtensionTypeElement {}
Expand Down Expand Up @@ -2912,6 +2917,9 @@ abstract class ExecutableElementImpl extends _ExistingElementImpl
class ExtensionElementImpl extends InstanceElementImpl
with AugmentableElement<ExtensionElementImpl>
implements ExtensionElement {
late AugmentedExtensionElement augmentedInternal =
NotAugmentedExtensionElementImpl(this);

/// The type being extended.
DartType? _extendedType;

Expand All @@ -2922,8 +2930,12 @@ class ExtensionElementImpl extends InstanceElementImpl

@override
AugmentedExtensionElement? get augmented {
// TODO(scheglov): implement
throw UnimplementedError();
if (isAugmentation) {
return augmentationTarget?.augmented;
} else {
linkedData?.read(this);
return augmentedInternal;
}
}

@override
Expand Down Expand Up @@ -5565,11 +5577,15 @@ class NotAugmentedEnumElementImpl extends NotAugmentedInterfaceElementImpl
EnumElementImpl get declaration => element;
}

class NotAugmentedExtensionElementImpl extends AugmentedInstanceElementImpl
class NotAugmentedExtensionElementImpl extends NotAugmentedInstanceElementImpl
implements AugmentedExtensionElement {
@override
final ExtensionElementImpl element;

NotAugmentedExtensionElementImpl(this.element);

@override
ExtensionElementImpl get declaration => element;
}

class NotAugmentedExtensionTypeElementImpl
Expand Down
19 changes: 18 additions & 1 deletion pkg/analyzer/lib/src/summary2/macro_application.dart
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,21 @@ class LibraryMacroApplier {
declarationsPhaseInterface: declarationElement,
members: declaration.members,
);
case ast.ExtensionDeclaration():
final element = declaration.declaredElement;
element as ExtensionElementImpl;
final declarationElement = element.augmented?.declaration ?? element;
declarationElement as ExtensionElementImpl;
await _addClassLike(
libraryElement: libraryElement,
container: container,
targetElement: declarationElement,
classNode: declaration,
classDeclarationKind: macro.DeclarationKind.extension,
classAnnotations: declaration.metadata,
declarationsPhaseInterface: null,
members: declaration.members,
);
case ast.MixinDeclaration():
final element = declaration.declaredElement;
element as MixinElementImpl;
Expand Down Expand Up @@ -774,7 +789,7 @@ class _DeclarationPhaseIntrospector extends _TypePhaseIntrospector
.map(declarationBuilder.fromElement.constructorElement)
.toList();
}
throw StateError('Unexpected: ${type.runtimeType}');
return [];
}

@override
Expand All @@ -789,6 +804,7 @@ class _DeclarationPhaseIntrospector extends _TypePhaseIntrospector
.map(declarationBuilder.fromElement.fieldElement)
.toList();
}
// TODO(scheglov): can we test this?
throw StateError('Unexpected: ${type.runtimeType}');
}

Expand All @@ -806,6 +822,7 @@ class _DeclarationPhaseIntrospector extends _TypePhaseIntrospector
.map(declarationBuilder.fromElement.methodElement)
.toList();
}
// TODO(scheglov): can we test this?
throw StateError('Unexpected: ${type.runtimeType}');
}

Expand Down
44 changes: 44 additions & 0 deletions pkg/analyzer/lib/src/summary2/macro_declarations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ class DeclarationBuilder {
return fromNode.classDeclaration(node);
case ast.ConstructorDeclarationImpl():
return fromNode.constructorDeclaration(node);
case ast.ExtensionDeclarationImpl():
return fromNode.extensionDeclaration(node);
case ast.MethodDeclarationImpl():
return fromNode.methodDeclaration(node);
case ast.MixinDeclarationImpl():
Expand Down Expand Up @@ -542,6 +544,12 @@ class DeclarationBuilderFromNode {
);
}

macro.ExtensionDeclarationImpl extensionDeclaration(
ast.ExtensionDeclarationImpl node,
) {
return _introspectableExtensionDeclaration(node);
}

macro.LibraryImpl library(Element element) {
final library = element.library!;

Expand Down Expand Up @@ -645,6 +653,10 @@ class DeclarationBuilderFromNode {
final parentElement = parentNode.declaredElement!;
final typeElement = parentElement.augmentationTarget ?? parentElement;
return _declaredIdentifier(parentNode.name, typeElement);
case ast.ExtensionDeclaration():
final parentElement = parentNode.declaredElement!;
final typeElement = parentElement.augmentationTarget ?? parentElement;
return _declaredIdentifier2(parentNode.name?.lexeme ?? '', typeElement);
case ast.MixinDeclaration():
final parentElement = parentNode.declaredElement!;
final typeElement = parentElement.augmentationTarget ?? parentElement;
Expand Down Expand Up @@ -748,6 +760,22 @@ class DeclarationBuilderFromNode {
);
}

IntrospectableExtensionDeclarationImpl _introspectableExtensionDeclaration(
ast.ExtensionDeclarationImpl node,
) {
final element = node.declaredElement!;

return IntrospectableExtensionDeclarationImpl._(
id: macro.RemoteInstance.uniqueId,
identifier: _declaredIdentifier2(node.name?.lexeme ?? '', element),
library: library(element),
metadata: _buildMetadata(element),
typeParameters: _typeParameters(node.typeParameters),
onType: _typeAnnotation(node.extendedType),
element: element,
);
}

IntrospectableMixinDeclarationImpl _introspectableMixinDeclaration(
ast.MixinDeclarationImpl node,
) {
Expand Down Expand Up @@ -1013,6 +1041,22 @@ class IntrospectableClassDeclarationImpl
});
}

class IntrospectableExtensionDeclarationImpl
extends macro.IntrospectableExtensionDeclarationImpl implements HasElement {
@override
final ExtensionElementImpl element;

IntrospectableExtensionDeclarationImpl._({
required super.id,
required super.identifier,
required super.library,
required super.metadata,
required super.typeParameters,
required super.onType,
required this.element,
});
}

class IntrospectableMixinDeclarationImpl
extends macro.IntrospectableMixinDeclarationImpl implements HasElement {
@override
Expand Down
16 changes: 14 additions & 2 deletions pkg/analyzer/test/src/summary/element_text.dart
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ class _ElementWriter {
_writeCodeRange(e);
_writeTypeParameterElements(e.typeParameters);
_writeType('extendedType', e.extendedType);
_writeMacroDiagnostics(e);
});

_sink.withIndent(() {
Expand Down Expand Up @@ -789,8 +790,18 @@ class _ElementWriter {
_sink.writelnWithIndent('message: ${diagnostic.message}');
});
case ExceptionMacroDiagnostic():
// TODO(scheglov): Handle this case.
throw UnimplementedError();
_sink.writelnWithIndent('ExceptionMacroDiagnostic');
_sink.withIndent(() {
_sink.writelnWithIndent(
'annotationIndex: ${diagnostic.annotationIndex}',
);
_sink.writelnWithIndent(
'message: ${diagnostic.message}',
);
_sink.writelnWithIndent(
'stackTrace:\n${diagnostic.stackTrace}',
);
});
case MacroDiagnostic():
_sink.writelnWithIndent('MacroDiagnostic');
_sink.withIndent(() {
Expand Down Expand Up @@ -1056,6 +1067,7 @@ class _ElementWriter {
_writeReturnType(e.returnType);
_writeNonSyntheticElement(e);
writeLinking();
_writeMacroDiagnostics(e);
_writeAugmentationTarget(e);
_writeAugmentation(e);
});
Expand Down
27 changes: 27 additions & 0 deletions pkg/analyzer/test/src/summary/macro/introspect.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:_fe_analyzer_shared/src/macros/api.dart';
implements
ClassDeclarationsMacro,
ConstructorDeclarationsMacro,
ExtensionDeclarationsMacro,
FieldDeclarationsMacro,
MethodDeclarationsMacro,
MixinDeclarationsMacro {
Expand Down Expand Up @@ -40,6 +41,16 @@ import 'package:_fe_analyzer_shared/src/macros/api.dart';
});
}

@override
FutureOr<void> buildDeclarationsForExtension(
IntrospectableExtensionDeclaration declaration,
MemberDeclarationBuilder builder,
) async {
await _write(builder, declaration, (printer) async {
await printer.writeExtensionDeclaration(declaration);
});
}

@override
FutureOr<void> buildDeclarationsForField(
FieldDeclaration declaration,
Expand Down Expand Up @@ -256,6 +267,22 @@ class _Printer {
});
}

Future<void> writeExtensionDeclaration(ExtensionDeclaration e) async {
if (!shouldWriteDetailsFor(e)) {
return;
}

sink.writelnWithIndent('extension ${e.identifier.name}');

await sink.withIndent(() async {
await _writeMetadata(e);

await _writeTypeParameters(e.typeParameters);
await _writeNamedTypeAnnotation('onType', e.onType);
await _writeTypeDeclarationMembers(e);
});
}

Future<void> writeField(FieldDeclaration e) async {
_assertEnclosingClass(e);
sink.writelnWithIndent(e.identifier.name);
Expand Down
Loading

0 comments on commit 691e465

Please sign in to comment.