Version 2.17.0-170.0.dev
Merge commit 'bd8ed80309714c00e306a270844e912d81cfe19b' into 'dev'
diff --git a/DEPS b/DEPS
index 276e2bd..f9788c5 100644
--- a/DEPS
+++ b/DEPS
@@ -142,7 +142,7 @@
"process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
"protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
"pub_rev": "8f5ab7b1aba3b9f66b56246d77e167990339d317",
- "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
+ "pub_semver_rev": "ea6c54019948dc03042c595ce9413e17aaf7aa38",
"root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
"rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
"shelf_static_rev": "202ec1a53c9a830c17cf3b718d089cf7eba568ad",
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
index 36b560b..03669ef 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
@@ -8,9 +8,23 @@
/// as augment existing ones.
abstract class Builder {}
+/// Allows you to resolve arbitrary [Identifier]s.
+///
+/// This class will likely disappear entirely once we have a different
+/// mechanism.
+abstract class IdentifierResolver {
+ /// Returns an [Identifier] for a top level [name] in [library].
+ ///
+ /// You should only do this for libraries that are definitely in the
+ /// transitive import graph of the library you are generating code into.
+ @Deprecated(
+ 'This api should eventually be replaced with a different, safer API.')
+ Future<Identifier> resolveIdentifier(Uri library, String name);
+}
+
/// The api used by [Macro]s to contribute new type declarations to the
/// current library, and get [TypeAnnotation]s from runtime [Type] objects.
-abstract class TypeBuilder implements Builder {
+abstract class TypeBuilder implements Builder, IdentifierResolver {
/// Adds a new type declaration to the surrounding library.
///
/// The [name] must match the name of the new [typeDeclaration] (this does
@@ -75,7 +89,7 @@
///
/// Can also be used to do subtype checks on types.
abstract class DeclarationBuilder
- implements Builder, TypeResolver, ClassIntrospector {
+ implements Builder, IdentifierResolver, TypeResolver, ClassIntrospector {
/// Adds a new regular declaration to the surrounding library.
///
/// Note that type declarations are not supported.
@@ -106,6 +120,7 @@
abstract class DefinitionBuilder
implements
Builder,
+ IdentifierResolver,
TypeResolver,
ClassIntrospector,
TypeDeclarationResolver {}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart b/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
index ed29787..a645eae 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
@@ -202,8 +202,13 @@
throw new StateError('Unrecognized macro instance \${request.macro}\\n'
'Known instances: \$_macroInstances)');
}
+ var identifierResolver = ClientIdentifierResolver(
+ sendRequest,
+ remoteInstance: request.identifierResolver,
+ serializationZoneId: request.serializationZoneId);
- var result = await executeTypesMacro(instance, request.declaration);
+ var result = await executeTypesMacro(
+ instance, request.declaration, identifierResolver);
return new SerializableResponse(
responseType: MessageType.macroExecutionResult,
response: result,
@@ -228,6 +233,10 @@
throw new StateError('Unrecognized macro instance \${request.macro}\\n'
'Known instances: \$_macroInstances)');
}
+ var identifierResolver = ClientIdentifierResolver(
+ sendRequest,
+ remoteInstance: request.identifierResolver,
+ serializationZoneId: request.serializationZoneId);
var classIntrospector = ClientClassIntrospector(
sendRequest,
remoteInstance: request.classIntrospector,
@@ -238,7 +247,8 @@
serializationZoneId: request.serializationZoneId);
var result = await executeDeclarationsMacro(
- instance, request.declaration, classIntrospector, typeResolver);
+ instance, request.declaration, identifierResolver, classIntrospector,
+ typeResolver);
return new SerializableResponse(
responseType: MessageType.macroExecutionResult,
response: result,
@@ -263,6 +273,10 @@
throw new StateError('Unrecognized macro instance \${request.macro}\\n'
'Known instances: \$_macroInstances)');
}
+ var identifierResolver = ClientIdentifierResolver(
+ sendRequest,
+ remoteInstance: request.identifierResolver,
+ serializationZoneId: request.serializationZoneId);
var typeResolver = ClientTypeResolver(
sendRequest,
remoteInstance: request.typeResolver,
@@ -277,8 +291,8 @@
serializationZoneId: request.serializationZoneId);
var result = await executeDefinitionMacro(
- instance, request.declaration, classIntrospector, typeResolver,
- typeDeclarationResolver);
+ instance, request.declaration, identifierResolver, classIntrospector,
+ typeResolver, typeDeclarationResolver);
return new SerializableResponse(
responseType: MessageType.macroExecutionResult,
response: result,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
index 8fde94e..c80c9a5 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -44,8 +44,8 @@
/// Runs the type phase for [macro] on a given [declaration].
///
/// Throws an exception if there is an error executing the macro.
- Future<MacroExecutionResult> executeTypesPhase(
- MacroInstanceIdentifier macro, covariant Declaration declaration);
+ Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+ covariant Declaration declaration, IdentifierResolver identifierResolver);
/// Runs the declarations phase for [macro] on a given [declaration].
///
@@ -53,6 +53,7 @@
Future<MacroExecutionResult> executeDeclarationsPhase(
MacroInstanceIdentifier macro,
covariant Declaration declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector);
@@ -62,6 +63,7 @@
Future<MacroExecutionResult> executeDefinitionsPhase(
MacroInstanceIdentifier macro,
covariant Declaration declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector,
TypeDeclarationResolver typeDeclarationResolver);
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
index 5225d79..6f522e0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
@@ -10,7 +10,7 @@
import '../api.dart';
import 'response_impls.dart';
-class TypeBuilderBase {
+class TypeBuilderBase implements IdentifierResolver {
/// The final result, will be built up over `augment` calls.
final List<DeclarationCode> _libraryAugmentations;
@@ -20,6 +20,8 @@
/// The names of any new types added in [_libraryAugmentations].
final List<String> _newTypeNames = [];
+ final IdentifierResolver identifierResolver;
+
/// Creates and returns a [MacroExecutionResult] out of the [_augmentations]
/// created by this builder.
MacroExecutionResult get result => new MacroExecutionResultImpl(
@@ -28,14 +30,22 @@
newTypeNames: _newTypeNames,
);
- TypeBuilderBase(
+ TypeBuilderBase(this.identifierResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
: _classAugmentations = parentClassAugmentations ?? {},
_libraryAugmentations = parentLibraryAugmentations ?? [];
+
+ @override
+ Future<Identifier> resolveIdentifier(Uri library, String identifier) =>
+ // ignore: deprecated_member_use_from_same_package
+ identifierResolver.resolveIdentifier(library, identifier);
}
class TypeBuilderImpl extends TypeBuilderBase implements TypeBuilder {
+ TypeBuilderImpl(IdentifierResolver identifierResolver)
+ : super(identifierResolver);
+
@override
void declareType(String name, DeclarationCode typeDeclaration) {
_newTypeNames.add(name);
@@ -49,10 +59,11 @@
final ClassIntrospector classIntrospector;
final TypeResolver typeResolver;
- DeclarationBuilderBase(this.classIntrospector, this.typeResolver,
+ DeclarationBuilderBase(IdentifierResolver identifierResolver,
+ this.classIntrospector, this.typeResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
- : super(
+ : super(identifierResolver,
parentClassAugmentations: parentClassAugmentations,
parentLibraryAugmentations: parentLibraryAugmentations);
@@ -87,9 +98,9 @@
class DeclarationBuilderImpl extends DeclarationBuilderBase
implements DeclarationBuilder {
- DeclarationBuilderImpl(
+ DeclarationBuilderImpl(IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector, TypeResolver typeResolver)
- : super(classIntrospector, typeResolver);
+ : super(identifierResolver, classIntrospector, typeResolver);
@override
void declareInLibrary(DeclarationCode declaration) {
@@ -101,9 +112,12 @@
implements ClassMemberDeclarationBuilder {
final Identifier definingClass;
- ClassMemberDeclarationBuilderImpl(this.definingClass,
- ClassIntrospector classIntrospector, TypeResolver typeResolver)
- : super(classIntrospector, typeResolver);
+ ClassMemberDeclarationBuilderImpl(
+ this.definingClass,
+ IdentifierResolver identifierResolver,
+ ClassIntrospector classIntrospector,
+ TypeResolver typeResolver)
+ : super(identifierResolver, classIntrospector, typeResolver);
@override
void declareInClass(DeclarationCode declaration) {
@@ -118,11 +132,14 @@
implements TypeDeclarationResolver {
final TypeDeclarationResolver typeDeclarationResolver;
- DefinitionBuilderBase(ClassIntrospector classIntrospector,
- TypeResolver typeResolver, this.typeDeclarationResolver,
+ DefinitionBuilderBase(
+ IdentifierResolver identifierResolver,
+ ClassIntrospector classIntrospector,
+ TypeResolver typeResolver,
+ this.typeDeclarationResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
- : super(classIntrospector, typeResolver,
+ : super(identifierResolver, classIntrospector, typeResolver,
parentClassAugmentations: parentClassAugmentations,
parentLibraryAugmentations: parentLibraryAugmentations);
@@ -138,12 +155,14 @@
ClassDefinitionBuilderImpl(
this.declaration,
+ IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver,
TypeDeclarationResolver typeDeclarationResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
- : super(classIntrospector, typeResolver, typeDeclarationResolver,
+ : super(identifierResolver, classIntrospector, typeResolver,
+ typeDeclarationResolver,
parentClassAugmentations: parentClassAugmentations,
parentLibraryAugmentations: parentLibraryAugmentations);
@@ -153,8 +172,8 @@
ConstructorDeclaration constructor =
(await classIntrospector.constructorsOf(declaration))
.firstWhere((constructor) => constructor.identifier == identifier);
- return new ConstructorDefinitionBuilderImpl(
- constructor, classIntrospector, typeResolver, typeDeclarationResolver,
+ return new ConstructorDefinitionBuilderImpl(constructor, identifierResolver,
+ classIntrospector, typeResolver, typeDeclarationResolver,
parentClassAugmentations: _classAugmentations,
parentLibraryAugmentations: _libraryAugmentations);
}
@@ -163,8 +182,8 @@
Future<VariableDefinitionBuilder> buildField(Identifier identifier) async {
FieldDeclaration field = (await classIntrospector.fieldsOf(declaration))
.firstWhere((field) => field.identifier == identifier);
- return new VariableDefinitionBuilderImpl(
- field, classIntrospector, typeResolver, typeDeclarationResolver,
+ return new VariableDefinitionBuilderImpl(field, identifierResolver,
+ classIntrospector, typeResolver, typeDeclarationResolver,
parentClassAugmentations: _classAugmentations,
parentLibraryAugmentations: _libraryAugmentations);
}
@@ -173,8 +192,8 @@
Future<FunctionDefinitionBuilder> buildMethod(Identifier identifier) async {
MethodDeclaration method = (await classIntrospector.methodsOf(declaration))
.firstWhere((method) => method.identifier == identifier);
- return new FunctionDefinitionBuilderImpl(
- method, classIntrospector, typeResolver, typeDeclarationResolver,
+ return new FunctionDefinitionBuilderImpl(method, identifierResolver,
+ classIntrospector, typeResolver, typeDeclarationResolver,
parentClassAugmentations: _classAugmentations,
parentLibraryAugmentations: _libraryAugmentations);
}
@@ -187,12 +206,14 @@
FunctionDefinitionBuilderImpl(
this.declaration,
+ IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver,
TypeDeclarationResolver typeDeclarationResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
- : super(classIntrospector, typeResolver, typeDeclarationResolver,
+ : super(identifierResolver, classIntrospector, typeResolver,
+ typeDeclarationResolver,
parentClassAugmentations: parentClassAugmentations,
parentLibraryAugmentations: parentLibraryAugmentations);
@@ -217,12 +238,14 @@
ConstructorDefinitionBuilderImpl(
this.declaration,
+ IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver,
TypeDeclarationResolver typeDeclarationResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
- : super(classIntrospector, typeResolver, typeDeclarationResolver,
+ : super(identifierResolver, classIntrospector, typeResolver,
+ typeDeclarationResolver,
parentClassAugmentations: parentClassAugmentations,
parentLibraryAugmentations: parentLibraryAugmentations);
@@ -245,12 +268,14 @@
VariableDefinitionBuilderImpl(
this.declaration,
+ IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver,
TypeDeclarationResolver typeDeclarationResolver,
{Map<String, List<DeclarationCode>>? parentClassAugmentations,
List<DeclarationCode>? parentLibraryAugmentations})
- : super(classIntrospector, typeResolver, typeDeclarationResolver,
+ : super(identifierResolver, classIntrospector, typeResolver,
+ typeDeclarationResolver,
parentClassAugmentations: parentClassAugmentations,
parentLibraryAugmentations: parentLibraryAugmentations);
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart
index 13ec76e..af3224f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart
@@ -7,9 +7,9 @@
import 'package:_fe_analyzer_shared/src/macros/api.dart';
/// Runs [macro] in the types phase and returns a [MacroExecutionResult].
-Future<MacroExecutionResult> executeTypesMacro(
- Macro macro, Declaration declaration) async {
- TypeBuilderImpl builder = new TypeBuilderImpl();
+Future<MacroExecutionResult> executeTypesMacro(Macro macro,
+ Declaration declaration, IdentifierResolver identifierResolver) async {
+ TypeBuilderImpl builder = new TypeBuilderImpl(identifierResolver);
if (declaration is FunctionDeclaration) {
if (macro is ConstructorTypesMacro &&
declaration is ConstructorDeclaration) {
@@ -42,18 +42,19 @@
Future<MacroExecutionResult> executeDeclarationsMacro(
Macro macro,
Declaration declaration,
+ IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver) async {
if (declaration is ClassDeclaration && macro is ClassDeclarationsMacro) {
ClassMemberDeclarationBuilderImpl builder =
- new ClassMemberDeclarationBuilderImpl(
- declaration.identifier, classIntrospector, typeResolver);
+ new ClassMemberDeclarationBuilderImpl(declaration.identifier,
+ identifierResolver, classIntrospector, typeResolver);
await macro.buildDeclarationsForClass(declaration, builder);
return builder.result;
} else if (declaration is ClassMemberDeclaration) {
ClassMemberDeclarationBuilderImpl builder =
- new ClassMemberDeclarationBuilderImpl(
- declaration.definingClass, classIntrospector, typeResolver);
+ new ClassMemberDeclarationBuilderImpl(declaration.definingClass,
+ identifierResolver, classIntrospector, typeResolver);
if (declaration is FunctionDeclaration) {
if (macro is ConstructorDeclarationsMacro &&
declaration is ConstructorDeclaration) {
@@ -73,16 +74,16 @@
await macro.buildDeclarationsForField(declaration, builder);
return builder.result;
} else if (macro is VariableDeclarationsMacro) {
- DeclarationBuilderImpl builder =
- new DeclarationBuilderImpl(classIntrospector, typeResolver);
+ DeclarationBuilderImpl builder = new DeclarationBuilderImpl(
+ identifierResolver, classIntrospector, typeResolver);
await macro.buildDeclarationsForVariable(
declaration as VariableDeclaration, builder);
return builder.result;
}
}
} else {
- DeclarationBuilderImpl builder =
- new DeclarationBuilderImpl(classIntrospector, typeResolver);
+ DeclarationBuilderImpl builder = new DeclarationBuilderImpl(
+ identifierResolver, classIntrospector, typeResolver);
if (declaration is FunctionDeclaration &&
macro is FunctionDeclarationsMacro) {
await macro.buildDeclarationsForFunction(declaration, builder);
@@ -101,6 +102,7 @@
Future<MacroExecutionResult> executeDefinitionMacro(
Macro macro,
Declaration declaration,
+ IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver,
TypeDeclarationResolver typeDeclarationResolver) async {
@@ -108,13 +110,14 @@
if (macro is ConstructorDefinitionMacro &&
declaration is ConstructorDeclaration) {
ConstructorDefinitionBuilderImpl builder =
- new ConstructorDefinitionBuilderImpl(declaration, classIntrospector,
- typeResolver, typeDeclarationResolver);
+ new ConstructorDefinitionBuilderImpl(declaration, identifierResolver,
+ classIntrospector, typeResolver, typeDeclarationResolver);
await macro.buildDefinitionForConstructor(declaration, builder);
return builder.result;
} else {
FunctionDefinitionBuilderImpl builder = new FunctionDefinitionBuilderImpl(
declaration,
+ identifierResolver,
classIntrospector,
typeResolver,
typeDeclarationResolver);
@@ -128,7 +131,11 @@
}
} else if (declaration is VariableDeclaration) {
VariableDefinitionBuilderImpl builder = new VariableDefinitionBuilderImpl(
- declaration, classIntrospector, typeResolver, typeDeclarationResolver);
+ declaration,
+ identifierResolver,
+ classIntrospector,
+ typeResolver,
+ typeDeclarationResolver);
if (macro is FieldDefinitionMacro && declaration is FieldDeclaration) {
await macro.buildDefinitionForField(declaration, builder);
return builder.result;
@@ -138,7 +145,11 @@
}
} else if (macro is ClassDefinitionMacro && declaration is ClassDeclaration) {
ClassDefinitionBuilderImpl builder = new ClassDefinitionBuilderImpl(
- declaration, classIntrospector, typeResolver, typeDeclarationResolver);
+ declaration,
+ identifierResolver,
+ classIntrospector,
+ typeResolver,
+ typeDeclarationResolver);
await macro.buildDefinitionForClass(declaration, builder);
return builder.result;
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart
index 018b47a..940fa5a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart
@@ -64,6 +64,34 @@
}
completer.complete(response);
break;
+ case MessageType.resolveIdentifierRequest:
+ ResolveIdentifierRequest request =
+ new ResolveIdentifierRequest.deserialize(
+ deserializer, zoneId);
+ SerializableResponse response;
+ try {
+ IdentifierImpl identifier = await (request
+ .identifierResolver.instance as IdentifierResolver)
+ // ignore: deprecated_member_use_from_same_package
+ .resolveIdentifier(request.library, request.name)
+ as IdentifierImpl;
+ response = new SerializableResponse(
+ response: identifier,
+ requestId: request.id,
+ responseType: MessageType.remoteInstance,
+ serializationZoneId: zoneId);
+ } catch (error, stackTrace) {
+ response = new SerializableResponse(
+ error: '$error',
+ stackTrace: '$stackTrace',
+ requestId: request.id,
+ responseType: MessageType.error,
+ serializationZoneId: zoneId);
+ }
+ Serializer serializer = serializerFactory();
+ response.serialize(serializer);
+ sendResult(serializer);
+ break;
case MessageType.resolveTypeRequest:
ResolveTypeRequest request =
new ResolveTypeRequest.deserialize(deserializer, zoneId);
@@ -258,12 +286,17 @@
Future<MacroExecutionResult> executeDeclarationsPhase(
MacroInstanceIdentifier macro,
DeclarationImpl declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector) =>
_sendRequest((zoneId) => new ExecuteDeclarationsPhaseRequest(
macro,
declaration,
new RemoteInstanceImpl(
+ instance: identifierResolver,
+ id: RemoteInstance.uniqueId,
+ kind: RemoteInstanceKind.identifierResolver),
+ new RemoteInstanceImpl(
instance: typeResolver,
id: RemoteInstance.uniqueId,
kind: RemoteInstanceKind.typeResolver),
@@ -277,6 +310,7 @@
Future<MacroExecutionResult> executeDefinitionsPhase(
MacroInstanceIdentifier macro,
DeclarationImpl declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector,
TypeDeclarationResolver typeDeclarationResolver) =>
@@ -284,6 +318,10 @@
macro,
declaration,
new RemoteInstanceImpl(
+ instance: identifierResolver,
+ id: RemoteInstance.uniqueId,
+ kind: RemoteInstanceKind.identifierResolver),
+ new RemoteInstanceImpl(
instance: typeResolver,
id: RemoteInstance.uniqueId,
kind: RemoteInstanceKind.typeResolver),
@@ -298,9 +336,15 @@
serializationZoneId: zoneId));
@override
- Future<MacroExecutionResult> executeTypesPhase(
- MacroInstanceIdentifier macro, DeclarationImpl declaration) =>
- _sendRequest((zoneId) => new ExecuteTypesPhaseRequest(macro, declaration,
+ Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+ DeclarationImpl declaration, IdentifierResolver identifierResolver) =>
+ _sendRequest((zoneId) => new ExecuteTypesPhaseRequest(
+ macro,
+ declaration,
+ new RemoteInstanceImpl(
+ instance: identifierResolver,
+ id: RemoteInstance.uniqueId,
+ kind: RemoteInstanceKind.identifierResolver),
serializationZoneId: zoneId));
@override
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart
index 81b8107..aa7c907 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart
@@ -36,25 +36,33 @@
Future<MacroExecutionResult> executeDeclarationsPhase(
MacroInstanceIdentifier macro,
DeclarationImpl declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector) =>
- _executors[macro]!.executeDeclarationsPhase(
- macro, declaration, typeResolver, classIntrospector);
+ _executors[macro]!.executeDeclarationsPhase(macro, declaration,
+ identifierResolver, typeResolver, classIntrospector);
@override
Future<MacroExecutionResult> executeDefinitionsPhase(
MacroInstanceIdentifier macro,
DeclarationImpl declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector,
TypeDeclarationResolver typeDeclarationResolver) =>
- _executors[macro]!.executeDefinitionsPhase(macro, declaration,
- typeResolver, classIntrospector, typeDeclarationResolver);
+ _executors[macro]!.executeDefinitionsPhase(
+ macro,
+ declaration,
+ identifierResolver,
+ typeResolver,
+ classIntrospector,
+ typeDeclarationResolver);
@override
- Future<MacroExecutionResult> executeTypesPhase(
- MacroInstanceIdentifier macro, DeclarationImpl declaration) =>
- _executors[macro]!.executeTypesPhase(macro, declaration);
+ Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+ DeclarationImpl declaration, IdentifierResolver identifierResolver) =>
+ _executors[macro]!
+ .executeTypesPhase(macro, declaration, identifierResolver);
@override
Future<MacroInstanceIdentifier> instantiateMacro(
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
index fa6d608..73d051c6 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
@@ -248,8 +248,10 @@
class ExecuteTypesPhaseRequest extends Request {
final MacroInstanceIdentifier macro;
final DeclarationImpl declaration;
+ final RemoteInstanceImpl identifierResolver;
- ExecuteTypesPhaseRequest(this.macro, this.declaration,
+ ExecuteTypesPhaseRequest(
+ this.macro, this.declaration, this.identifierResolver,
{required int serializationZoneId})
: super(serializationZoneId: serializationZoneId);
@@ -259,12 +261,14 @@
Deserializer deserializer, int serializationZoneId)
: macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
declaration = RemoteInstance.deserialize(deserializer),
+ identifierResolver = RemoteInstance.deserialize(deserializer),
super.deserialize(deserializer, serializationZoneId);
void serialize(Serializer serializer) {
serializer.addInt(MessageType.executeTypesPhaseRequest.index);
macro.serialize(serializer);
declaration.serialize(serializer);
+ identifierResolver.serialize(serializer);
super.serialize(serializer);
}
@@ -276,11 +280,12 @@
final MacroInstanceIdentifier macro;
final DeclarationImpl declaration;
+ final RemoteInstanceImpl identifierResolver;
final RemoteInstanceImpl typeResolver;
final RemoteInstanceImpl classIntrospector;
- ExecuteDeclarationsPhaseRequest(
- this.macro, this.declaration, this.typeResolver, this.classIntrospector,
+ ExecuteDeclarationsPhaseRequest(this.macro, this.declaration,
+ this.identifierResolver, this.typeResolver, this.classIntrospector,
{required int serializationZoneId})
: super(serializationZoneId: serializationZoneId);
@@ -290,6 +295,7 @@
Deserializer deserializer, int serializationZoneId)
: macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
declaration = RemoteInstance.deserialize(deserializer),
+ identifierResolver = RemoteInstance.deserialize(deserializer),
typeResolver = RemoteInstance.deserialize(deserializer),
classIntrospector = RemoteInstance.deserialize(deserializer),
super.deserialize(deserializer, serializationZoneId);
@@ -298,6 +304,7 @@
serializer.addInt(MessageType.executeDeclarationsPhaseRequest.index);
macro.serialize(serializer);
declaration.serialize(serializer);
+ identifierResolver.serialize(serializer);
typeResolver.serialize(serializer);
classIntrospector.serialize(serializer);
@@ -311,12 +318,18 @@
final MacroInstanceIdentifier macro;
final DeclarationImpl declaration;
+ final RemoteInstanceImpl identifierResolver;
final RemoteInstanceImpl typeResolver;
final RemoteInstanceImpl classIntrospector;
final RemoteInstanceImpl typeDeclarationResolver;
- ExecuteDefinitionsPhaseRequest(this.macro, this.declaration,
- this.typeResolver, this.classIntrospector, this.typeDeclarationResolver,
+ ExecuteDefinitionsPhaseRequest(
+ this.macro,
+ this.declaration,
+ this.identifierResolver,
+ this.typeResolver,
+ this.classIntrospector,
+ this.typeDeclarationResolver,
{required int serializationZoneId})
: super(serializationZoneId: serializationZoneId);
@@ -326,6 +339,7 @@
Deserializer deserializer, int serializationZoneId)
: macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
declaration = RemoteInstance.deserialize(deserializer),
+ identifierResolver = RemoteInstance.deserialize(deserializer),
typeResolver = RemoteInstance.deserialize(deserializer),
classIntrospector = RemoteInstance.deserialize(deserializer),
typeDeclarationResolver = RemoteInstance.deserialize(deserializer),
@@ -335,6 +349,7 @@
serializer.addInt(MessageType.executeDefinitionsPhaseRequest.index);
macro.serialize(serializer);
declaration.serialize(serializer);
+ identifierResolver.serialize(serializer);
typeResolver.serialize(serializer);
classIntrospector.serialize(serializer);
typeDeclarationResolver.serialize(serializer);
@@ -343,6 +358,37 @@
}
}
+/// A request to create a resolved identifier.
+class ResolveIdentifierRequest extends Request {
+ final Uri library;
+ final String name;
+
+ final RemoteInstanceImpl identifierResolver;
+
+ /// When deserializing we have already consumed the message type, so we don't
+ /// consume it again.
+ ResolveIdentifierRequest(this.library, this.name, this.identifierResolver,
+ {required int serializationZoneId})
+ : super(serializationZoneId: serializationZoneId);
+
+ ResolveIdentifierRequest.deserialize(
+ Deserializer deserializer, int serializationZoneId)
+ : library = Uri.parse((deserializer..moveNext()).expectString()),
+ name = (deserializer..moveNext()).expectString(),
+ identifierResolver = RemoteInstance.deserialize(deserializer),
+ super.deserialize(deserializer, serializationZoneId);
+
+ void serialize(Serializer serializer) {
+ serializer
+ ..addInt(MessageType.resolveIdentifierRequest.index)
+ ..addString(library.toString())
+ ..addString(name);
+ identifierResolver.serialize(serializer);
+
+ super.serialize(serializer);
+ }
+}
+
/// A request to resolve on a type annotation code object
class ResolveTypeRequest extends Request {
final TypeAnnotationCode typeAnnotationCode;
@@ -473,6 +519,32 @@
}
}
+/// Client side implementation of an [IdentifierResolver], which creates a
+/// [ResolveIdentifierRequest] and passes it to a given [sendRequest] function
+/// which can return the [Response].
+class ClientIdentifierResolver implements IdentifierResolver {
+ /// The actual remote instance of this type resolver.
+ final RemoteInstanceImpl remoteInstance;
+
+ /// The ID of the zone in which to find the original type resolver.
+ final int serializationZoneId;
+
+ /// A function that can send a request and return a response using an
+ /// arbitrary communication channel.
+ final Future<Response> Function(Request request) _sendRequest;
+
+ ClientIdentifierResolver(this._sendRequest,
+ {required this.remoteInstance, required this.serializationZoneId});
+
+ @override
+ Future<Identifier> resolveIdentifier(Uri library, String name) async {
+ ResolveIdentifierRequest request = new ResolveIdentifierRequest(
+ library, name, remoteInstance,
+ serializationZoneId: serializationZoneId);
+ return _handleResponse(await _sendRequest(request));
+ }
+}
+
/// Client side implementation of a [TypeResolver], which creates a
/// [ResolveTypeRequest] and passes it to a given [sendRequest] function which
/// can return the [Response].
@@ -699,6 +771,7 @@
executeDefinitionsPhaseRequest,
executeTypesPhaseRequest,
instantiateMacroRequest,
+ resolveIdentifierRequest,
resolveTypeRequest,
isExactlyTypeRequest,
isSubtypeOfRequest,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart
index 3940b7e..fc45704 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart
@@ -96,6 +96,7 @@
functionDeclaration,
functionTypeAnnotation,
identifier,
+ identifierResolver,
namedStaticType,
methodDeclaration,
namedTypeAnnotation,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart
index cf3ff21..d039f7d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart
@@ -17,6 +17,7 @@
RemoteInstanceKind kind = RemoteInstanceKind.values[expectInt()];
switch (kind) {
case RemoteInstanceKind.classIntrospector:
+ case RemoteInstanceKind.identifierResolver:
case RemoteInstanceKind.namedStaticType:
case RemoteInstanceKind.staticType:
case RemoteInstanceKind.typeDeclarationResolver:
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 779de84..a9ec81e 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1902,15 +1902,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeContinueLabelNotTarget = messageContinueLabelNotTarget;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageContinueLabelNotTarget = const MessageCode(
- "ContinueLabelNotTarget",
- analyzerCodes: <String>["LABEL_UNDEFINED"],
- problemMessage: r"""Target of continue must be a label.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeContinueOutsideOfLoop = messageContinueOutsideOfLoop;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
index b0fca36..5a96c10 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
@@ -6,6 +6,10 @@
main() {}
+var field;
+get getter => null;
+set setter(_) => null;
+
@ClassMacro()
class Class1 {}
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
index 388a6cc..c826563 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
@@ -44,6 +44,15 @@
}
}
+Future<void> throws(Future<void> Function() f, property) async {
+ try {
+ await f();
+ } catch (_) {
+ return;
+ }
+ throw 'Expected throws on $property';
+}
+
void checkTypeAnnotation(
TypeData expected, TypeAnnotation typeAnnotation, String context) {
expect(expected.isNullable, typeAnnotation.isNullable, '$context.isNullable');
@@ -121,6 +130,37 @@
}
}
+Future<void> checkIdentifierResolver(
+ IdentifierResolver identifierResolver) async {
+ Uri dartCore = Uri.parse('dart:core');
+ Uri macroApiData = Uri.parse('package:macro_api_test/api_test_data.dart');
+
+ Future<void> check(Uri uri, String name, {bool expectThrows: false}) async {
+ if (expectThrows) {
+ await throws(() async {
+ await identifierResolver.resolveIdentifier(uri, name);
+ }, '$name from $uri');
+ } else {
+ Identifier result = await identifierResolver.resolveIdentifier(uri, name);
+ expect(name, result.name, '$name from $uri');
+ }
+ }
+
+ await check(dartCore, 'Object');
+ await check(dartCore, 'String');
+ await check(dartCore, 'override');
+
+ await check(macroApiData, 'Class1');
+ await check(macroApiData, 'getter');
+ await check(macroApiData, 'setter=');
+ await check(macroApiData, 'field');
+
+ await check(macroApiData, 'non-existing', expectThrows: true);
+ await check(macroApiData, 'getter=', expectThrows: true);
+ await check(macroApiData, 'setter', expectThrows: true);
+ await check(macroApiData, 'field=', expectThrows: true);
+}
+
class ClassData {
final bool isAbstract;
final bool isExternal;
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
index de593f8..d54db3b 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
@@ -36,17 +36,20 @@
const FunctionMacro();
FutureOr<void> buildTypesForFunction(
- FunctionDeclaration function, TypeBuilder builder) {
+ FunctionDeclaration function, TypeBuilder builder) async {
checkFunctionDeclaration(function);
+ await checkIdentifierResolver(builder);
}
FutureOr<void> buildDeclarationsForFunction(
- FunctionDeclaration function, DeclarationBuilder builder) {
+ FunctionDeclaration function, DeclarationBuilder builder) async {
checkFunctionDeclaration(function);
+ await checkIdentifierResolver(builder);
}
FutureOr<void> buildDefinitionForFunction(
- FunctionDeclaration function, FunctionDefinitionBuilder builder) {
+ FunctionDeclaration function, FunctionDefinitionBuilder builder) async {
checkFunctionDeclaration(function);
+ await checkIdentifierResolver(builder);
}
}
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart
index f4e5601..13b54ac 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart
@@ -109,7 +109,7 @@
group('in the types phase', () {
test('on functions', () async {
var result = await executor.executeTypesPhase(
- instanceId, Fixtures.myFunction);
+ instanceId, Fixtures.myFunction, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -118,7 +118,7 @@
test('on methods', () async {
var result = await executor.executeTypesPhase(
- instanceId, Fixtures.myMethod);
+ instanceId, Fixtures.myMethod, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -126,10 +126,8 @@
});
test('on getters', () async {
- var result = await executor.executeTypesPhase(
- instanceId,
- Fixtures.myVariableGetter,
- );
+ var result = await executor.executeTypesPhase(instanceId,
+ Fixtures.myVariableGetter, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -138,10 +136,8 @@
});
test('on setters', () async {
- var result = await executor.executeTypesPhase(
- instanceId,
- Fixtures.myVariableSetter,
- );
+ var result = await executor.executeTypesPhase(instanceId,
+ Fixtures.myVariableSetter, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -151,9 +147,7 @@
test('on variables', () async {
var result = await executor.executeTypesPhase(
- instanceId,
- Fixtures.myVariable,
- );
+ instanceId, Fixtures.myVariable, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -162,8 +156,8 @@
});
test('on constructors', () async {
- var result = await executor.executeTypesPhase(
- instanceId, Fixtures.myConstructor);
+ var result = await executor.executeTypesPhase(instanceId,
+ Fixtures.myConstructor, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -173,7 +167,7 @@
test('on fields', () async {
var result = await executor.executeTypesPhase(
- instanceId, Fixtures.myField);
+ instanceId, Fixtures.myField, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -182,7 +176,7 @@
test('on classes', () async {
var result = await executor.executeTypesPhase(
- instanceId, Fixtures.myClass);
+ instanceId, Fixtures.myClass, FakeIdentifierResolver());
expect(result.classAugmentations, isEmpty);
expect(
result.libraryAugmentations.single.debugString().toString(),
@@ -196,6 +190,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myFunction,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, isEmpty);
@@ -209,6 +204,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myMethod,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, isEmpty);
@@ -222,6 +218,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myConstructor,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, hasLength(1));
@@ -239,6 +236,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myVariableGetter,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, isEmpty);
@@ -252,6 +250,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myVariableSetter,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, isEmpty);
@@ -265,6 +264,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myVariable,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, isEmpty);
@@ -278,6 +278,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myField,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, hasLength(1));
@@ -295,6 +296,7 @@
var result = await executor.executeDeclarationsPhase(
instanceId,
Fixtures.myClass,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector);
expect(result.classAugmentations, hasLength(1));
@@ -314,6 +316,7 @@
var result = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myFunction,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -335,6 +338,7 @@
var definitionResult = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myMethod,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -352,6 +356,7 @@
var definitionResult = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myConstructor,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -368,6 +373,7 @@
var result = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myVariableGetter,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -389,6 +395,7 @@
var result = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myVariableSetter,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -411,6 +418,7 @@
var result = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myVariable,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -441,6 +449,7 @@
var definitionResult = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myField,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
@@ -456,6 +465,7 @@
var definitionResult = await executor.executeDefinitionsPhase(
instanceId,
Fixtures.myClass,
+ FakeIdentifierResolver(),
Fixtures.testTypeResolver,
Fixtures.testClassIntrospector,
Fixtures.testTypeDeclarationResolver);
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index 0907c70..edb0788 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -62,6 +62,8 @@
superclass[clazz];
}
+class FakeIdentifierResolver extends Fake implements IdentifierResolver {}
+
class FakeTypeDeclarationResolver extends Fake
implements TypeDeclarationResolver {}
diff --git a/pkg/dart2wasm/lib/target.dart b/pkg/dart2wasm/lib/target.dart
index a7827e1..fa68680 100644
--- a/pkg/dart2wasm/lib/target.dart
+++ b/pkg/dart2wasm/lib/target.dart
@@ -9,7 +9,7 @@
import 'package:kernel/reference_from_index.dart';
import 'package:kernel/target/changed_structure_notifier.dart';
import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/mixin_full_resolution.dart'
+import 'package:vm/transformations/mixin_full_resolution.dart'
as transformMixins show transformLibraries;
import 'package:dart2wasm/constants_backend.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 6ac5cec..5d7f537 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6596,8 +6596,7 @@
SwitchCase current = cases[i] = pop() as SwitchCase;
if (labels != null) {
for (Label label in labels) {
- JumpTarget? target =
- switchScope!.lookupLabel(label.name) as JumpTarget?;
+ JumpTarget? target = switchScope!.lookupLabel(label.name);
if (target != null) {
target.resolveGotos(forest, current);
}
@@ -6656,7 +6655,7 @@
if (hasTarget) {
identifier = pop() as Identifier;
name = identifier.name;
- target = scope.lookupLabel(name) as JumpTarget?;
+ target = scope.lookupLabel(name);
}
if (target == null && name == null) {
push(problemInLoopOrSwitch = buildProblemStatement(
@@ -6709,15 +6708,7 @@
if (hasTarget) {
identifier = pop() as Identifier;
name = identifier.name;
- Builder? namedTarget = scope.lookupLabel(identifier.name);
- if (namedTarget != null && namedTarget is! JumpTarget) {
- Token labelToken = continueKeyword.next!;
- push(problemInLoopOrSwitch = buildProblemStatement(
- fasta.messageContinueLabelNotTarget, labelToken.charOffset,
- length: labelToken.length));
- return;
- }
- target = namedTarget as JumpTarget?;
+ target = scope.lookupLabel(identifier.name);
if (target == null) {
if (switchScope == null) {
push(buildProblemStatement(
@@ -7527,23 +7518,20 @@
String toString() => "operator($name)";
}
-class JumpTarget extends BuilderImpl {
+class JumpTarget {
final List<Statement> users = <Statement>[];
final JumpTargetKind kind;
final int functionNestingLevel;
- @override
final MemberBuilder parent;
- @override
final int charOffset;
JumpTarget(
this.kind, this.functionNestingLevel, this.parent, this.charOffset);
- @override
Uri get fileUri => parent.fileUri!;
bool get isBreakTarget => kind == JumpTargetKind.Break;
@@ -7603,11 +7591,10 @@
users.clear();
}
- @override
String get fullNameForErrors => "<jump-target>";
}
-class LabelTarget extends BuilderImpl implements JumpTarget {
+class LabelTarget implements JumpTarget {
@override
final MemberBuilder parent;
diff --git a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
index 0cbb45a..f456a4d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
@@ -326,7 +326,7 @@
Procedure _createTearOffProcedure(SourceLibraryBuilder libraryBuilder,
Name name, Uri fileUri, int fileOffset, Reference? reference) {
return new Procedure(name, ProcedureKind.Method, new FunctionNode(null),
- fileUri: fileUri, isStatic: true, reference: reference)
+ fileUri: fileUri, isStatic: true, isSynthetic: true, reference: reference)
..startFileOffset = fileOffset
..fileOffset = fileOffset
..fileEndOffset = fileOffset
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 0c41ecf..342dd2c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -496,7 +496,7 @@
if (macroApplications != null) {
benchmarker?.enterPhase(BenchmarkPhases.outline_applyTypeMacros);
List<SourceLibraryBuilder> augmentationLibraries =
- await macroApplications.applyTypeMacros();
+ await macroApplications.applyTypeMacros(loader);
benchmarker
?.enterPhase(BenchmarkPhases.outline_buildMacroTypesForPhase1);
await _buildForPhase1(augmentationLibraries);
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
index 85449b2..0b2bb54 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -29,6 +29,7 @@
import '../source/source_factory_builder.dart';
import '../source/source_field_builder.dart';
import '../source/source_library_builder.dart';
+import '../source/source_loader.dart';
import '../source/source_procedure_builder.dart';
import 'hierarchy/hierarchy_builder.dart';
import 'hierarchy/hierarchy_node.dart';
@@ -348,7 +349,9 @@
.shouldExecute(_declarationKind(declaration), macro.Phase.types)) {
macro.MacroExecutionResult result =
await _macroExecutor.executeTypesPhase(
- macroApplication.instanceIdentifier, declaration);
+ macroApplication.instanceIdentifier,
+ declaration,
+ identifierResolver);
if (result.isNotEmpty) {
results.add(result);
}
@@ -366,7 +369,12 @@
return results;
}
- Future<List<SourceLibraryBuilder>> applyTypeMacros() async {
+ late macro.IdentifierResolver identifierResolver;
+ late SourceLoader sourceLoader;
+
+ Future<List<SourceLibraryBuilder>> applyTypeMacros(
+ SourceLoader sourceLoader) async {
+ identifierResolver = new _IdentifierResolver(sourceLoader);
List<SourceLibraryBuilder> augmentationLibraries = [];
Map<SourceLibraryBuilder, List<macro.MacroExecutionResult>> results = {};
for (_ApplicationData macroApplication in _applicationData) {
@@ -411,6 +419,7 @@
await _macroExecutor.executeDeclarationsPhase(
macroApplication.instanceIdentifier,
declaration,
+ identifierResolver,
typeResolver,
classIntrospector);
if (result.isNotEmpty) {
@@ -463,6 +472,7 @@
await _macroExecutor.executeDefinitionsPhase(
macroApplication.instanceIdentifier,
declaration,
+ identifierResolver,
typeResolver,
classIntrospector,
typeDeclarationResolver);
@@ -914,6 +924,51 @@
}
}
+class _IdentifierResolver implements macro.IdentifierResolver {
+ final SourceLoader sourceLoader;
+
+ _IdentifierResolver(this.sourceLoader);
+
+ @override
+ Future<macro.Identifier> resolveIdentifier(Uri library, String name) {
+ LibraryBuilder? libraryBuilder = sourceLoader.lookupLibraryBuilder(library);
+ if (libraryBuilder == null) {
+ return new Future.error(
+ new ArgumentError('Library at uri $library could not be resolved.'),
+ StackTrace.current);
+ }
+ bool isSetter = false;
+ String memberName = name;
+ if (name.endsWith('=')) {
+ memberName = name.substring(0, name.length - 1);
+ isSetter = true;
+ }
+ Builder? builder =
+ libraryBuilder.scope.lookupLocalMember(memberName, setter: isSetter);
+ if (builder == null) {
+ return new Future.error(
+ new ArgumentError(
+ 'Unable to find top level identifier "$name" in $library'),
+ StackTrace.current);
+ } else if (builder is TypeDeclarationBuilder) {
+ return new Future.value(new _IdentifierImpl.forTypeDeclarationBuilder(
+ typeDeclarationBuilder: builder,
+ libraryBuilder: libraryBuilder,
+ id: macro.RemoteInstance.uniqueId,
+ name: name));
+ } else if (builder is MemberBuilder) {
+ return new Future.value(new _IdentifierImpl.forMemberBuilder(
+ memberBuilder: builder,
+ id: macro.RemoteInstance.uniqueId,
+ name: name));
+ } else {
+ return new Future.error(
+ new UnsupportedError('Unsupported identifier kind $builder'),
+ StackTrace.current);
+ }
+ }
+}
+
class _TypeResolver implements macro.TypeResolver {
final MacroApplications macroApplications;
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index c431fd6..300080b 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -469,7 +469,7 @@
return forwardDeclaredLabels;
}
- Builder? lookupLabel(String name) {
+ JumpTarget? lookupLabel(String name) {
return labels?[name] ?? _parent?.lookupLabel(name);
}
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 1c92e8b..8f83875 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1153,10 +1153,6 @@
}
}
-ContinueLabelNotTarget:
- problemMessage: "Target of continue must be a label."
- analyzerCode: LABEL_UNDEFINED
-
ContinueWithoutLabelInCase:
index: 64
problemMessage: "A continue statement in a switch statement must have a label as a target."
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index 7ee8ddf..01f9653 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -308,6 +308,7 @@
Future<MacroExecutionResult> executeDeclarationsPhase(
MacroInstanceIdentifier macro,
Declaration declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector) async {
return new _MacroExecutionResult();
@@ -317,6 +318,7 @@
Future<MacroExecutionResult> executeDefinitionsPhase(
MacroInstanceIdentifier macro,
Declaration declaration,
+ IdentifierResolver identifierResolver,
TypeResolver typeResolver,
ClassIntrospector classIntrospector,
TypeDeclarationResolver typeDeclarationResolver) async {
@@ -324,8 +326,8 @@
}
@override
- Future<MacroExecutionResult> executeTypesPhase(
- MacroInstanceIdentifier macro, Declaration declaration) async {
+ Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+ Declaration declaration, IdentifierResolver identifierResolver) async {
return new _MacroExecutionResult();
}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index cc0957e..f1532f1 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1100,6 +1100,7 @@
rs
runnable
s
+safer
sandboxed
sanitizing
saw
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 79d5d64..16571c0 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -9,15 +9,15 @@
import 'package:kernel/reference_from_index.dart';
import 'package:kernel/target/changed_structure_notifier.dart';
import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/mixin_full_resolution.dart'
- as transformMixins show transformLibraries;
-import 'package:kernel/transformations/continuation.dart' as transformAsync
- show transformLibraries, transformProcedure;
import 'package:kernel/type_environment.dart';
import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
+import '../transformations/continuation.dart' as transformAsync
+ show transformLibraries, transformProcedure;
import '../transformations/lowering.dart' as lowering
show transformLibraries, transformProcedure;
+import '../transformations/mixin_full_resolution.dart' as transformMixins
+ show transformLibraries;
import '../transformations/ffi/common.dart' as ffiHelper
show calculateTransitiveImportsOfDartFfiIfUsed;
import '../transformations/ffi/definitions.dart' as transformFfiDefinitions
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/vm/lib/transformations/async.dart
similarity index 99%
rename from pkg/kernel/lib/transformations/async.dart
rename to pkg/vm/lib/transformations/async.dart
index a9d5f6a..e117bc6 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/vm/lib/transformations/async.dart
@@ -2,10 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library kernel.transformations.async;
-
-import '../kernel.dart';
-import '../type_environment.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/type_environment.dart';
import 'continuation.dart';
/// A transformer that introduces temporary variables for all subexpressions
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/vm/lib/transformations/continuation.dart
similarity index 99%
rename from pkg/kernel/lib/transformations/continuation.dart
rename to pkg/vm/lib/transformations/continuation.dart
index 3fb6474..b5c3949 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/vm/lib/transformations/continuation.dart
@@ -2,14 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library kernel.transformations.continuation;
-
import 'dart:math' as math;
-import '../ast.dart';
-import '../core_types.dart';
-import '../type_algebra.dart' show Substitution;
-import '../type_environment.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart';
import 'async.dart';
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index f9e8fe3..4242ff4 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -5,13 +5,15 @@
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/transformations/type_casts_optimizer.dart'
- as typeCastsOptimizer show transformAsExpression;
import 'package:kernel/type_environment.dart'
show StaticTypeContext, TypeEnvironment;
+
import 'package:vm/transformations/specializer/factory_specializer.dart';
+
import 'late_var_init_transformer.dart' show LateVarInitTransformer;
import 'list_literals_lowering.dart' show ListLiteralsLowering;
+import 'type_casts_optimizer.dart' as typeCastsOptimizer
+ show transformAsExpression;
/// VM-specific lowering transformations and optimizations combined into a
/// single transformation pass.
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/vm/lib/transformations/mixin_full_resolution.dart
similarity index 96%
rename from pkg/kernel/lib/transformations/mixin_full_resolution.dart
rename to pkg/vm/lib/transformations/mixin_full_resolution.dart
index 5af5475..27b156a 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/vm/lib/transformations/mixin_full_resolution.dart
@@ -2,15 +2,13 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library kernel.transformations.mixin_full_resolution;
-
-import '../ast.dart';
-import '../class_hierarchy.dart';
-import '../clone.dart';
-import '../core_types.dart';
-import '../reference_from_index.dart';
-import '../target/targets.dart' show Target;
-import '../type_algebra.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/clone.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/reference_from_index.dart';
+import 'package:kernel/target/targets.dart' show Target;
+import 'package:kernel/type_algebra.dart';
/// Transforms the libraries in [libraries].
/// Note that [referenceFromIndex] can be null, and is generally only needed
diff --git a/pkg/kernel/lib/transformations/type_casts_optimizer.dart b/pkg/vm/lib/transformations/type_casts_optimizer.dart
similarity index 100%
rename from pkg/kernel/lib/transformations/type_casts_optimizer.dart
rename to pkg/vm/lib/transformations/type_casts_optimizer.dart
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 0c22675..b78112e 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -13,6 +13,7 @@
#if !DART_HOST_OS_IOS
#include <crt_externs.h> // NOLINT
#endif // !DART_HOST_OS_IOS
+#include <dlfcn.h> // NOLINT
#include <errno.h> // NOLINT
#include <mach-o/dyld.h>
#include <signal.h> // NOLINT
@@ -251,7 +252,98 @@
return path_size;
}
-void Platform::SetProcessName(const char* name) {}
+void Platform::SetProcessName(const char* name) {
+ pthread_setname_np(name);
+
+#if !defined(DART_HOST_OS_IOS) && !defined(DART_PRECOMPILED_RUNTIME)
+ // Attempt to set the name displayed in ActivityMonitor.
+ // https://codereview.chromium.org/659007/
+
+ class ScopedDLHandle : public ValueObject {
+ public:
+ explicit ScopedDLHandle(void* handle) : handle_(handle) {}
+ ~ScopedDLHandle() {
+ if (handle_ != NULL) dlclose(handle_);
+ }
+ void* get() const { return handle_; }
+
+ private:
+ void* handle_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedDLHandle);
+ };
+
+ class ScopedCFStringRef : public ValueObject {
+ public:
+ explicit ScopedCFStringRef(const char* s)
+ : ref_(CFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8)) {}
+ ~ScopedCFStringRef() {
+ if (ref_ != NULL) CFRelease(ref_);
+ }
+ CFStringRef get() const { return ref_; }
+
+ private:
+ CFStringRef ref_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedCFStringRef);
+ };
+
+ ScopedDLHandle application_services_handle(
+ dlopen("/System/Library/Frameworks/ApplicationServices.framework/"
+ "Versions/A/ApplicationServices",
+ RTLD_LAZY | RTLD_LOCAL));
+ if (application_services_handle.get() == NULL) return;
+
+ ScopedCFStringRef launch_services_bundle_name("com.apple.LaunchServices");
+ CFBundleRef launch_services_bundle =
+ CFBundleGetBundleWithIdentifier(launch_services_bundle_name.get());
+ if (launch_services_bundle == NULL) return;
+
+#define GET_FUNC(name, cstr) \
+ ScopedCFStringRef name##_id(cstr); \
+ *reinterpret_cast<void**>(&name) = CFBundleGetFunctionPointerForName( \
+ launch_services_bundle, name##_id.get()); \
+ if (name == NULL) return;
+
+#define GET_DATA(name, cstr) \
+ ScopedCFStringRef name##_id(cstr); \
+ *reinterpret_cast<void**>(&name) = \
+ CFBundleGetDataPointerForName(launch_services_bundle, name##_id.get()); \
+ if (name == NULL) return;
+
+ CFTypeRef (*_LSGetCurrentApplicationASN)(void);
+ GET_FUNC(_LSGetCurrentApplicationASN, "_LSGetCurrentApplicationASN");
+
+ OSStatus (*_LSSetApplicationInformationItem)(int, CFTypeRef, CFStringRef,
+ CFStringRef, CFDictionaryRef*);
+ GET_FUNC(_LSSetApplicationInformationItem,
+ "_LSSetApplicationInformationItem");
+
+ CFDictionaryRef (*_LSApplicationCheckIn)(int, CFDictionaryRef);
+ GET_FUNC(_LSApplicationCheckIn, "_LSApplicationCheckIn");
+
+ void (*_LSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t,
+ void*);
+ GET_FUNC(_LSSetApplicationLaunchServicesServerConnectionStatus,
+ "_LSSetApplicationLaunchServicesServerConnectionStatus");
+
+ CFStringRef* _kLSDisplayNameKey;
+ GET_DATA(_kLSDisplayNameKey, "_kLSDisplayNameKey");
+ if (*_kLSDisplayNameKey == NULL) return;
+
+ _LSSetApplicationLaunchServicesServerConnectionStatus(0, NULL);
+
+ _LSApplicationCheckIn(-2, CFBundleGetInfoDictionary(CFBundleGetMainBundle()));
+
+ CFTypeRef asn;
+ asn = _LSGetCurrentApplicationASN();
+ if (asn == NULL) return;
+
+ ScopedCFStringRef cf_name(name);
+ _LSSetApplicationInformationItem(-2, asn, *_kLSDisplayNameKey, cf_name.get(),
+ NULL);
+#undef GET_DATA
+#undef GET_FUNC
+#endif // !defined(DART_HOST_OS_IOS)
+}
void Platform::Exit(int exit_code) {
Console::RestoreConfig();
diff --git a/tools/VERSION b/tools/VERSION
index c4a61b5..f2a49b1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 169
+PRERELEASE 170
PRERELEASE_PATCH 0
\ No newline at end of file