ContainerCleanUpFix.java

/*******************************************************************************
 * Copyright (c) 2026 Carsten Hammer.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
package org.sandbox.jdt.cleanup.multifile;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.CompilationUnit;

import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFixCore;
import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperationWithSourceRange;

import org.eclipse.jdt.ui.cleanup.ICleanUpFix;

import org.sandbox.jdt.container.api.ContainerLocalRewritePlan;
import org.sandbox.jdt.container.api.UniqueSequenceLocalRewritePlan;

/** Combines independently planned local container migrations into one atomic cleanup fix. */
public final class ContainerCleanUpFix {

	private static final String DESCRIPTION= "Modernize local container contracts"; //$NON-NLS-1$

	private ContainerCleanUpFix() {
	}

	/**
	 * Revalidates every supplied plan against the current AST and returns one fix.
	 * Returning {@code null} for an empty plan set follows the Eclipse cleanup contract.
	 */
	public static ICleanUpFix create(
			ICompilationUnit unit,
			CompilationUnit root,
			Collection<ContainerLocalRewritePlan> arrayPlans,
			Collection<UniqueSequenceLocalRewritePlan> uniqueSequencePlans)
			throws CoreException {
		Objects.requireNonNull(unit, "unit"); //$NON-NLS-1$
		Objects.requireNonNull(root, "root"); //$NON-NLS-1$
		Objects.requireNonNull(arrayPlans, "arrayPlans"); //$NON-NLS-1$
		Objects.requireNonNull(uniqueSequencePlans, "uniqueSequencePlans"); //$NON-NLS-1$

		List<CompilationUnitRewriteOperationWithSourceRange> operations= new ArrayList<>(
				arrayPlans.size() + uniqueSequencePlans.size());
		for (ContainerLocalRewritePlan plan : arrayPlans) {
			operations.add(ContainerLocalRewriteFix.operation(unit, root, plan));
		}
		for (UniqueSequenceLocalRewritePlan plan : uniqueSequencePlans) {
			operations.add(UniqueSequenceLocalRewriteFix.operation(unit, root, plan));
		}
		if (operations.isEmpty()) {
			return null;
		}
		return new CompilationUnitRewriteOperationsFixCore(
				DESCRIPTION,
				root,
				operations.toArray(CompilationUnitRewriteOperationWithSourceRange[]::new));
	}
}