Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
feat(core): allow running output migration on a subset of paths
This change introduces a new configuration parameter to the
output as function migration - it is now possible to restrict
a set of migrated paths.
  • Loading branch information
pkozlowski-opensource committed Oct 22, 2024
commit 1673a9b781e3e904149f99f2ca4ad8a099b76eba
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,27 @@ import {
import {ReferenceResult} from '../signal-migration/src/passes/reference_resolution/reference_result';
import {ReferenceKind} from '../signal-migration/src/passes/reference_resolution/reference_kinds';

interface OutputMigrationData {
export interface MigrationConfig {
/**
* Whether the given output definition should be migrated.
*
* Treating an output as non-migrated means that no references to it are
* migrated, nor the actual declaration (if it's part of the sources).
*
* If no function is specified here, the migration will migrate all
* output and references it discovers in compilation units. This is the
* running assumption for batch mode and LSC mode where the migration
* assumes all seen output are migrated.
*/
shouldMigrate?: (definition: ClassFieldDescriptor, containingFile: ProjectFile) => boolean;
}

export interface OutputMigrationData {
file: ProjectFile;
replacements: Replacement[];
}

interface CompilationUnitData {
export interface CompilationUnitData {
outputFields: Record<ClassFieldUniqueKey, OutputMigrationData>;
problematicUsages: Record<ClassFieldUniqueKey, true>;
importReplacements: Record<ProjectFileID, {add: Replacement[]; addAndRemove: Replacement[]}>;
Expand All @@ -68,6 +83,10 @@ export class OutputMigration extends TsurgeFunnelMigration<
CompilationUnitData,
CompilationUnitData
> {
constructor(private readonly config: MigrationConfig = {}) {
super();
}

override async analyze(info: ProgramInfo): Promise<Serializable<CompilationUnitData>> {
const {sourceFiles, program} = info;
const outputFieldReplacements: Record<ClassFieldUniqueKey, OutputMigrationData> = {};
Expand Down Expand Up @@ -111,14 +130,24 @@ export class OutputMigration extends TsurgeFunnelMigration<
const outputDef = extractSourceOutputDefinition(node, reflector, info);
if (outputDef !== null) {
const outputFile = projectFile(node.getSourceFile(), info);

filesWithOutputDeclarations.add(node.getSourceFile());
addOutputReplacement(
outputFieldReplacements,
outputDef.id,
outputFile,
calculateDeclarationReplacement(info, node, outputDef.aliasParam),
);
if (
this.config.shouldMigrate === undefined ||
this.config.shouldMigrate(
{
key: outputDef.id,
node: node,
},
outputFile,
)
) {
filesWithOutputDeclarations.add(node.getSourceFile());
addOutputReplacement(
outputFieldReplacements,
outputDef.id,
outputFile,
calculateDeclarationReplacement(info, node, outputDef.aliasParam),
);
}
}
}

Expand Down