/******************************************************************************* * Copyright (c) 2015 Google Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * John Glassmyer <jogl@google.com> - import group sorting is broken - https://bugs.eclipse.org/430303 *******************************************************************************/ package org.eclipse.jdt.internal.core.dom.rewrite.imports; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import java.util.HashSet; import java.util.Set; /** * Finds conflicts among importable static members declared within the specified on-demand-imported * containers. */ final class StaticConflictingSimpleNameFinder implements ConflictingSimpleNameFinder { private static boolean isStaticImportableMember(int memberFlags) { return (Flags.isStatic(memberFlags) || Flags.isEnum(memberFlags)) && !Flags.isPrivate(memberFlags); } private final IJavaProject project; StaticConflictingSimpleNameFinder(IJavaProject project) { this.project = project; } @Override public Set<String> findConflictingSimpleNames( Set<String> simpleNames, Set<String> onDemandAndImplicitContainerNames, IProgressMonitor monitor) throws JavaModelException { Set<String> memberNamesFoundInMultipleTypes = new HashSet<String>(); Set<String> foundMemberNames = new HashSet<String>(); for (String containerName : onDemandAndImplicitContainerNames) { IType containingType = this.project.findType(containerName, monitor); if (containingType != null) { if (!containingType.exists()) { // workaround for https://bugs.eclipse.org/483887 continue; } for (String memberName : extractStaticMemberNames(containingType)) { if (simpleNames.contains(memberName)) { if (foundMemberNames.contains(memberName)) { memberNamesFoundInMultipleTypes.add(memberName); } else { foundMemberNames.add(memberName); } } } } } return memberNamesFoundInMultipleTypes; } private Set<String> extractStaticMemberNames(IType type) throws JavaModelException { Set<String> memberNames = new HashSet<String>(); for (IField field : type.getFields()) { if (isStaticImportableMember(field.getFlags())) { memberNames.add(field.getElementName()); } } for (IMethod method : type.getMethods()) { if (isStaticImportableMember(method.getFlags())) { memberNames.add(method.getElementName()); } } return memberNames; } }