blob: 5e12e6240fa0e4275611e55421d1d253e857b416 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Google Inc and others.
*
* 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
*
* Contributors:
* John Glassmyer <jogl@google.com> - import group sorting is broken - https://bugs.eclipse.org/430303
*******************************************************************************/
package org.aspectj.org.eclipse.jdt.internal.core.dom.rewrite.imports;
import org.eclipse.core.runtime.IProgressMonitor;
import org.aspectj.org.eclipse.jdt.core.IJavaElement;
import org.aspectj.org.eclipse.jdt.core.IJavaProject;
import org.aspectj.org.eclipse.jdt.core.JavaModelException;
import org.aspectj.org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.aspectj.org.eclipse.jdt.core.search.IJavaSearchScope;
import org.aspectj.org.eclipse.jdt.core.search.SearchEngine;
import org.aspectj.org.eclipse.jdt.core.search.TypeNameRequestor;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
final class TypeConflictingSimpleNameFinder implements ConflictingSimpleNameFinder {
private static class ConflictAccumulatingTypeRequestor extends TypeNameRequestor {
private static String buildContainerName(char[] packageName, char[][] enclosingTypeNames) {
StringBuffer buf= new StringBuffer();
buf.append(packageName);
for (char[] enclosingTypeName : enclosingTypeNames) {
if (buf.length() > 0)
buf.append('.');
buf.append(enclosingTypeName);
}
return buf.toString();
}
private final Set<String> namesFoundInMultipleContainers;
private final Map<String, String> lastContainerFoundForType;
ConflictAccumulatingTypeRequestor() {
this.namesFoundInMultipleContainers = new HashSet<String>();
this.lastContainerFoundForType = new HashMap<String, String>();
}
@Override
public void acceptType(
int modifiers,
char[] packageName,
char[] simpleTypeName,
char[][] enclosingTypeNames,
String path) {
String simpleName = new String(simpleTypeName);
String newContainerName = buildContainerName(packageName, enclosingTypeNames);
String oldContainerName = this.lastContainerFoundForType.put(simpleName, newContainerName);
if (oldContainerName != null && !oldContainerName.equals(newContainerName)) {
this.namesFoundInMultipleContainers.add(simpleName);
}
}
Set<String> getNamesFoundInMultipleContainers() {
return Collections.unmodifiableSet(this.namesFoundInMultipleContainers);
}
}
private static char[][] stringsToCharArrays(Collection<String> strings) {
char[][] arrayOfArrays = new char[strings.size()][];
int i = 0;
for (String string : strings) {
arrayOfArrays[i] = string.toCharArray();
i++;
}
return arrayOfArrays;
}
private final IJavaProject javaProject;
private final SearchEngine searchEngine;
TypeConflictingSimpleNameFinder(IJavaProject javaProject, SearchEngine searchEngine) {
this.javaProject = javaProject;
this.searchEngine = searchEngine;
}
@Override
public Set<String> findConflictingSimpleNames(
Set<String> simpleNames,
Set<String> onDemandAndImplicitContainerNames,
IProgressMonitor monitor) throws JavaModelException {
IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { this.javaProject });
ConflictAccumulatingTypeRequestor requestor = new ConflictAccumulatingTypeRequestor();
this.searchEngine.searchAllTypeNames(
stringsToCharArrays(onDemandAndImplicitContainerNames),
stringsToCharArrays(simpleNames),
scope,
requestor,
IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
monitor);
return requestor.getNamesFoundInMultipleContainers();
}
}