blob: af3224fd1c24ed9f2ce6f1bdbcb1e01a9eef3092 [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// 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.
import 'package:_fe_analyzer_shared/src/macros/executor.dart';
import 'package:_fe_analyzer_shared/src/macros/executor/builder_impls.dart';
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, IdentifierResolver identifierResolver) async {
TypeBuilderImpl builder = new TypeBuilderImpl(identifierResolver);
if (declaration is FunctionDeclaration) {
if (macro is ConstructorTypesMacro &&
declaration is ConstructorDeclaration) {
await macro.buildTypesForConstructor(declaration, builder);
return builder.result;
} else if (macro is MethodTypesMacro && declaration is MethodDeclaration) {
await macro.buildTypesForMethod(declaration, builder);
return builder.result;
} else if (macro is FunctionTypesMacro) {
await macro.buildTypesForFunction(declaration, builder);
return builder.result;
}
} else if (declaration is VariableDeclaration) {
if (macro is FieldTypesMacro && declaration is FieldDeclaration) {
await macro.buildTypesForField(declaration, builder);
return builder.result;
} else if (macro is VariableTypesMacro) {
await macro.buildTypesForVariable(declaration, builder);
return builder.result;
}
} else if (macro is ClassTypesMacro && declaration is ClassDeclaration) {
await macro.buildTypesForClass(declaration, builder);
return builder.result;
}
throw new UnsupportedError('Unsupported macro type or invalid declaration:\n'
'macro: $macro\ndeclaration: $declaration');
}
/// Runs [macro] in the declaration phase and returns a [MacroExecutionResult].
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,
identifierResolver, classIntrospector, typeResolver);
await macro.buildDeclarationsForClass(declaration, builder);
return builder.result;
} else if (declaration is ClassMemberDeclaration) {
ClassMemberDeclarationBuilderImpl builder =
new ClassMemberDeclarationBuilderImpl(declaration.definingClass,
identifierResolver, classIntrospector, typeResolver);
if (declaration is FunctionDeclaration) {
if (macro is ConstructorDeclarationsMacro &&
declaration is ConstructorDeclaration) {
await macro.buildDeclarationsForConstructor(declaration, builder);
return builder.result;
} else if (macro is MethodDeclarationsMacro &&
declaration is MethodDeclaration) {
await macro.buildDeclarationsForMethod(declaration, builder);
return builder.result;
} else if (macro is FunctionDeclarationsMacro) {
await macro.buildDeclarationsForFunction(
declaration as FunctionDeclaration, builder);
return builder.result;
}
} else if (declaration is VariableDeclaration) {
if (macro is FieldDeclarationsMacro && declaration is FieldDeclaration) {
await macro.buildDeclarationsForField(declaration, builder);
return builder.result;
} else if (macro is VariableDeclarationsMacro) {
DeclarationBuilderImpl builder = new DeclarationBuilderImpl(
identifierResolver, classIntrospector, typeResolver);
await macro.buildDeclarationsForVariable(
declaration as VariableDeclaration, builder);
return builder.result;
}
}
} else {
DeclarationBuilderImpl builder = new DeclarationBuilderImpl(
identifierResolver, classIntrospector, typeResolver);
if (declaration is FunctionDeclaration &&
macro is FunctionDeclarationsMacro) {
await macro.buildDeclarationsForFunction(declaration, builder);
return builder.result;
} else if (macro is VariableDeclarationsMacro &&
declaration is VariableDeclaration) {
await macro.buildDeclarationsForVariable(declaration, builder);
return builder.result;
}
}
throw new UnsupportedError('Unsupported macro type or invalid declaration:\n'
'macro: $macro\ndeclaration: $declaration');
}
/// Runs [macro] in the definition phase and returns a [MacroExecutionResult].
Future<MacroExecutionResult> executeDefinitionMacro(
Macro macro,
Declaration declaration,
IdentifierResolver identifierResolver,
ClassIntrospector classIntrospector,
TypeResolver typeResolver,
TypeDeclarationResolver typeDeclarationResolver) async {
if (declaration is FunctionDeclaration) {
if (macro is ConstructorDefinitionMacro &&
declaration is ConstructorDeclaration) {
ConstructorDefinitionBuilderImpl builder =
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);
if (macro is MethodDefinitionMacro && declaration is MethodDeclaration) {
await macro.buildDefinitionForMethod(declaration, builder);
return builder.result;
} else if (macro is FunctionDefinitionMacro) {
await macro.buildDefinitionForFunction(declaration, builder);
return builder.result;
}
}
} else if (declaration is VariableDeclaration) {
VariableDefinitionBuilderImpl builder = new VariableDefinitionBuilderImpl(
declaration,
identifierResolver,
classIntrospector,
typeResolver,
typeDeclarationResolver);
if (macro is FieldDefinitionMacro && declaration is FieldDeclaration) {
await macro.buildDefinitionForField(declaration, builder);
return builder.result;
} else if (macro is VariableDefinitionMacro) {
await macro.buildDefinitionForVariable(declaration, builder);
return builder.result;
}
} else if (macro is ClassDefinitionMacro && declaration is ClassDeclaration) {
ClassDefinitionBuilderImpl builder = new ClassDefinitionBuilderImpl(
declaration,
identifierResolver,
classIntrospector,
typeResolver,
typeDeclarationResolver);
await macro.buildDefinitionForClass(declaration, builder);
return builder.result;
}
throw new UnsupportedError('Unsupported macro type or invalid declaration:\n'
'macro: $macro\ndeclaration: $declaration');
}