package org.eclipse.jdt.internal.core.dom.rewrite.imports;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.JavaModelException;
public class ConflictIdentifier {
static final class Conflicts {
final Set<String> typeConflicts;
final Set<String> staticConflicts;
Conflicts(Set<String> typeConflicts, Set<String> staticConflicts) {
this.typeConflicts = Collections.unmodifiableSet(new HashSet<>(typeConflicts));
this.staticConflicts = Collections.unmodifiableSet(new HashSet<>(staticConflicts));
}
@Override
public String toString() {
return String.format(
"Conflicts(type: %s; static: %s)", this.typeConflicts, this.staticConflicts);
}
}
private final OnDemandComputer onDemandComputer;
private final TypeConflictingSimpleNameFinder typeConflictFinder;
private final StaticConflictingSimpleNameFinder staticConflictFinder;
private final Set<String> implicitImportContainers;
ConflictIdentifier(
OnDemandComputer onDemandComputer,
TypeConflictingSimpleNameFinder typeConflictFinder,
StaticConflictingSimpleNameFinder staticConflictFinder,
Set<String> implicitImportContainers) {
this.onDemandComputer = onDemandComputer;
this.typeConflictFinder = typeConflictFinder;
this.staticConflictFinder = staticConflictFinder;
this.implicitImportContainers = implicitImportContainers;
}
Conflicts identifyConflicts(
Set<ImportName> imports,
Set<ImportName> addedImports,
Set<String> typeExplicitSimpleNames,
Set<String> staticExplicitSimpleNames,
IProgressMonitor progressMonitor) throws JavaModelException {
Collection<OnDemandReduction> onDemandCandidates = this.onDemandComputer.identifyPossibleReductions(
imports, addedImports, typeExplicitSimpleNames, staticExplicitSimpleNames);
Set<String> typeOnDemandContainers = new HashSet<>(extractContainerNames(onDemandCandidates, false));
Set<String> staticOnDemandContainers = new HashSet<>(extractContainerNames(onDemandCandidates, true));
if (!typeOnDemandContainers.isEmpty()) {
typeOnDemandContainers.addAll(extractOnDemandContainerNames(imports, false));
typeOnDemandContainers.addAll(this.implicitImportContainers);
typeOnDemandContainers.addAll(staticOnDemandContainers);
}
if (!staticOnDemandContainers.isEmpty()) {
staticOnDemandContainers.addAll(extractOnDemandContainerNames(imports, true));
}
Set<String> typeConflicts = findConflictingSimpleNames(
this.typeConflictFinder, imports, false, typeOnDemandContainers, progressMonitor);
Set<String> staticConflicts = findConflictingSimpleNames(
this.staticConflictFinder, imports, true, staticOnDemandContainers, progressMonitor);
return new Conflicts(typeConflicts, staticConflicts);
}
private Collection<String> (
Collection<OnDemandReduction> onDemandCandidates, boolean isStatic) {
Collection<String> containerNames = new ArrayList<>(onDemandCandidates.size());
for (OnDemandReduction onDemandCandidate : onDemandCandidates) {
ImportName containerOnDemand = onDemandCandidate.containerOnDemand;
if (containerOnDemand.isStatic == isStatic) {
containerNames.add(containerOnDemand.containerName);
}
}
return containerNames;
}
private Collection<String> extractOnDemandContainerNames(
Collection<ImportName> imports, boolean isStatic) {
Collection<String> onDemandContainerNames = new ArrayList<>(imports.size());
for (ImportName importName : imports) {
if (importName.isOnDemand() && importName.isStatic == isStatic) {
onDemandContainerNames.add(importName.containerName);
}
}
return onDemandContainerNames;
}
private Set<String> findConflictingSimpleNames(
ConflictingSimpleNameFinder conflictFinder,
Set<ImportName> imports,
boolean isStatic,
Set<String> onDemandImportedContainers,
IProgressMonitor monitor) throws JavaModelException {
if (onDemandImportedContainers.isEmpty() || imports.isEmpty()) {
return Collections.emptySet();
}
Set<String> simpleNames = new HashSet<>();
for (ImportName currentImport : imports) {
if (currentImport.isStatic == isStatic) {
simpleNames.add(currentImport.simpleName);
}
}
return conflictFinder.findConflictingSimpleNames(simpleNames, onDemandImportedContainers, monitor);
}
}