SelectedCompilationUnitPlan.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.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;

/**
 * Minimal immutable plan describing the compilation units participating in one
 * project cleanup run.
 *
 * @param projectHandle Java project handle
 * @param compilationUnitHandles deterministic set of compilation-unit handles
 */
public record SelectedCompilationUnitPlan(String projectHandle, Set<String> compilationUnitHandles) {

	/** Defensively copies plan data while retaining its deterministic order. */
	public SelectedCompilationUnitPlan {
		compilationUnitHandles= Collections.unmodifiableSet(new LinkedHashSet<>(compilationUnitHandles));
	}

	/**
	 * Creates a plan from the selected units.
	 *
	 * @param project Java project
	 * @param units selected compilation units
	 * @return immutable selected-scope plan
	 */
	public static SelectedCompilationUnitPlan of(IJavaProject project, ICompilationUnit[] units) {
		Set<String> handles= new LinkedHashSet<>();
		Arrays.stream(units).map(ICompilationUnit::getPrimary).map(IJavaElement::getHandleIdentifier).sorted()
				.forEach(handles::add);
		return new SelectedCompilationUnitPlan(project.getHandleIdentifier(), handles);
	}

	/** Returns whether the unit belongs to this plan. */
	public boolean contains(ICompilationUnit unit) {
		return compilationUnitHandles.contains(unit.getPrimary().getHandleIdentifier());
	}
}