Merge branch 'master' into upsource-master

This commit is contained in:
Evgeny Pasynkov
2012-07-06 09:57:26 +02:00
314 changed files with 37327 additions and 33035 deletions
@@ -139,34 +139,39 @@ public class AllClassesGetter {
}
};
public static void processJavaClasses(CompletionParameters parameters,
public static void processJavaClasses(final CompletionParameters parameters,
final PrefixMatcher prefixMatcher, final boolean filterByScope,
final Consumer<PsiClass> consumer) {
final PsiElement context = parameters.getPosition();
final String packagePrefix = getPackagePrefix(context, parameters.getOffset());
final Set<String> qnames = new THashSet<String>();
final Project project = context.getProject();
final GlobalSearchScope scope = filterByScope ? context.getContainingFile().getResolveScope() : GlobalSearchScope.allScope(project);
final boolean pkgContext = JavaCompletionUtil.inSomePackage(context);
AllClassesSearch.search(scope, project, new Condition<String>() {
public boolean value(String s) {
return prefixMatcher.prefixMatches(s);
}
}).forEach(new Processor<PsiClass>() {
Processor<PsiClass> processor = new Processor<PsiClass>() {
final Set<String> qNames = new THashSet<String>();
final boolean pkgContext = JavaCompletionUtil.inSomePackage(context);
final String packagePrefix = getPackagePrefix(context, parameters.getOffset());
public boolean process(PsiClass psiClass) {
assert psiClass != null;
if (isAcceptableInContext(context, psiClass, filterByScope, pkgContext)) {
String qName = psiClass.getQualifiedName();
if (qName != null && qName.startsWith(packagePrefix) && qnames.add(qName)) {
if (qName != null && qName.startsWith(packagePrefix) && qNames.add(qName)) {
consumer.consume(psiClass);
}
}
return true;
}
});
};
AllClassesSearch.search(scope, project, new Condition<String>() {
public boolean value(String s) {
return prefixMatcher.isStartMatch(s);
}
}).forEach(processor);
AllClassesSearch.search(scope, project, new Condition<String>() {
public boolean value(String s) {
return prefixMatcher.prefixMatches(s);
}
}).forEach(processor);
}
@@ -15,11 +15,11 @@
*/
package com.intellij.codeInsight.completion;
import com.google.common.collect.Sets;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLiteralExpression;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@@ -33,7 +33,7 @@ public abstract class ExpectedTypeBasedCompletionProvider extends CompletionProv
final PsiElement position = params.getPosition();
if (position.getParent() instanceof PsiLiteralExpression) return;
addCompletions(params, result, Sets.newHashSet(JavaSmartCompletionContributor.getExpectedTypes(params)));
addCompletions(params, result, ContainerUtil.newHashSet(JavaSmartCompletionContributor.getExpectedTypes(params)));
}
protected abstract void addCompletions(CompletionParameters params, CompletionResultSet result, Collection<ExpectedTypeInfo> infos);
@@ -34,7 +34,6 @@ import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
@@ -88,8 +87,8 @@ public class JavaCompletionSorting {
public Classifier<LookupElement> createClassifier(Classifier<LookupElement> next) {
return new LiftShorterItemsClassifier(next, new LiftShorterItemsClassifier.LiftingCondition() {
@Override
public boolean shouldLift(LookupElement shorterElement, LookupElement longerElement, ProcessingContext context) {
if (super.shouldLift(shorterElement, longerElement, context)) {
public boolean shouldLift(LookupElement shorterElement, LookupElement longerElement) {
if (super.shouldLift(shorterElement, longerElement)) {
return true;
}
Object object = shorterElement.getObject();
File diff suppressed because it is too large Load Diff
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.completion;
import com.google.common.collect.Maps;
import com.intellij.codeInsight.ExpectedTypesProvider;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
@@ -31,6 +30,7 @@ import com.intellij.ui.LayeredIcon;
import com.intellij.util.Function;
import com.intellij.util.PlatformIcons;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -123,7 +123,7 @@ class SameSignatureCallParametersProvider extends CompletionProvider<CompletionP
return place;
}
Map<String, PsiType> requiredNames = Maps.newHashMap();
Map<String, PsiType> requiredNames = ContainerUtil.newHashMap();
final PsiParameter[] parameters = place.getParameterList().getParameters();
final PsiParameter[] callParams = invoked.getParameterList().getParameters();
if (callParams.length > parameters.length) {
@@ -17,9 +17,7 @@ import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.*;
import static com.intellij.util.containers.CollectionFactory.hashSet;
import static com.intellij.util.containers.ContainerUtil.addIfNotNull;
@@ -46,12 +44,23 @@ public abstract class StaticMemberProcessor {
addIfNotNull(myStaticImportedClasses, psiClass);
}
public void processStaticMethodsGlobally(PrefixMatcher matcher, Consumer<LookupElement> consumer) {
public void processStaticMethodsGlobally(final PrefixMatcher matcher, Consumer<LookupElement> consumer) {
FeatureUsageTracker.getInstance().triggerFeatureUsed(JavaCompletionFeatures.GLOBAL_MEMBER_NAME);
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
boolean start1 = matcher.isStartMatch(o1);
boolean start2 = matcher.isStartMatch(o1);
return start1 == start2 ? 0 : start2 ? -1 : 1;
}
};
final GlobalSearchScope scope = myPosition.getResolveScope();
final PsiShortNamesCache namesCache = PsiShortNamesCache.getInstance(myProject);
for (final String methodName : namesCache.getAllMethodNames()) {
String[] methodNames = namesCache.getAllMethodNames();
Arrays.sort(methodNames, comparator);
for (final String methodName : methodNames) {
if (matcher.prefixMatches(methodName)) {
Set<PsiClass> classes = new THashSet<PsiClass>();
for (final PsiMethod method : namesCache.getMethodsByName(methodName, scope)) {
@@ -86,7 +95,9 @@ public abstract class StaticMemberProcessor {
}
}
}
for (final String fieldName : namesCache.getAllFieldNames()) {
String[] fieldNames = namesCache.getAllFieldNames();
Arrays.sort(fieldNames, comparator);
for (final String fieldName : fieldNames) {
if (matcher.prefixMatches(fieldName)) {
for (final PsiField field : namesCache.getFieldsByName(fieldName, scope)) {
if (isStaticallyImportable(field)) {
@@ -15,8 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.analysis;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
@@ -1108,7 +1106,7 @@ public class HighlightUtil {
@NotNull
static Set<PsiClassType> collectUnhandledExceptions(@NotNull final PsiTryStatement statement) {
final Set<PsiClassType> thrownTypes = Sets.newHashSet();
final Set<PsiClassType> thrownTypes = ContainerUtil.newHashSet();
final PsiCodeBlock tryBlock = statement.getTryBlock();
if (tryBlock != null) {
@@ -1159,7 +1157,7 @@ public class HighlightUtil {
private static Collection<HighlightInfo> checkMultiCatchParameter(@NotNull final PsiParameter parameter,
@NotNull final Collection<PsiClassType> thrownTypes) {
final List<PsiTypeElement> typeElements = PsiUtil.getParameterTypeElements(parameter);
final Collection<HighlightInfo> highlights = Lists.newArrayListWithCapacity(typeElements.size());
final Collection<HighlightInfo> highlights = ContainerUtil.newArrayListWithCapacity(typeElements.size());
for (final PsiTypeElement typeElement : typeElements) {
final PsiType catchType = typeElement.getType();
@@ -1195,10 +1193,10 @@ public class HighlightUtil {
final int idx = ArrayUtil.find(allCatchSections, catchSection);
if (idx <= 0) return null;
final Collection<PsiClassType> thrownTypes = Sets.newHashSet(thrownInTryStatement);
final Collection<PsiClassType> thrownTypes = ContainerUtil.newHashSet(thrownInTryStatement);
thrownTypes.add(PsiType.getJavaLangError(parameter.getManager(), parameter.getResolveScope()));
thrownTypes.add(PsiType.getJavaLangRuntimeException(parameter.getManager(), parameter.getResolveScope()));
final Collection<HighlightInfo> result = Lists.newArrayList();
final Collection<HighlightInfo> result = ContainerUtil.newArrayList();
final List<PsiTypeElement> parameterTypeElements = PsiUtil.getParameterTypeElements(parameter);
final boolean isMultiCatch = parameterTypeElements.size() > 1;
@@ -1214,7 +1212,7 @@ public class HighlightUtil {
}
});
if (caught.isEmpty()) continue;
final Collection<PsiClassType> caughtCopy = Sets.newHashSet(caught);
final Collection<PsiClassType> caughtCopy = ContainerUtil.newHashSet(caught);
// exclude all which are caught by previous catch sections
for (int i = 0; i < idx; i++) {
@@ -1505,7 +1503,7 @@ public class HighlightUtil {
boolean arrayTypeFixChecked = false;
VariableArrayTypeFix fix = null;
final Collection<HighlightInfo> result = Lists.newArrayList();
final Collection<HighlightInfo> result = ContainerUtil.newArrayList();
final PsiExpression[] initializers = arrayInitializer.getInitializers();
for (PsiExpression expression : initializers) {
final HighlightInfo info = checkArrayInitializerCompatibleTypes(expression, componentType);
@@ -2057,7 +2055,7 @@ public class HighlightUtil {
static Collection<HighlightInfo> checkCatchTypeIsDisjoint(@NotNull final PsiParameter parameter) {
if (!(parameter.getType() instanceof PsiDisjunctionType)) return null;
final Collection<HighlightInfo> result = Lists.newArrayList();
final Collection<HighlightInfo> result = ContainerUtil.newArrayList();
final List<PsiTypeElement> typeElements = PsiUtil.getParameterTypeElements(parameter);
for (int i = 0, size = typeElements.size(); i < size; i++) {
final PsiClass class1 = PsiUtil.resolveClassInClassTypeOnly(typeElements.get(i).getType());
@@ -2093,7 +2091,7 @@ public class HighlightUtil {
final List<PsiTypeElement> typeElements = PsiUtil.getParameterTypeElements(parameter);
final boolean isInMultiCatch = typeElements.size() > 1;
final Collection<HighlightInfo> result = Lists.newArrayList();
final Collection<HighlightInfo> result = ContainerUtil.newArrayList();
for (PsiTypeElement typeElement : typeElements) {
final PsiClass catchClass = PsiUtil.resolveClassInClassTypeOnly(typeElement.getType());
@@ -249,22 +249,6 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix {
PsiDocumentManager.getInstance(project).commitDocument(newEditor.getDocument());
final int offset = newEditor.getCaretModel().getOffset();
PsiMethod method = PsiTreeUtil.findElementOfClassAtOffset(targetFile, offset - 1, PsiMethod.class, false);
if (context instanceof PsiMethod) {
final PsiTypeParameter[] typeParameters = ((PsiMethod)context).getTypeParameters();
if (typeParameters.length > 0) {
for (PsiTypeParameter typeParameter : typeParameters) {
if (checkTypeParam( method, typeParameter)) {
final JVMElementFactory factory = JVMElementFactories.getFactory(method.getLanguage(), method.getProject());
PsiTypeParameterList list = method.getTypeParameterList();
if (list == null) {
PsiTypeParameterList newList = factory.createTypeParameterList();
list = (PsiTypeParameterList)method.addAfter(newList, method.getModifierList());
}
list.add(factory.createTypeParameter(typeParameter.getName(),typeParameter.getExtendsList().getReferencedTypes()));
}
}
}
}
if (method != null) {
try {
CreateFromUsageUtils.setupMethodBody(method);
@@ -480,11 +480,12 @@ public class OverrideImplementUtil {
properties.setProperty(FileTemplate.ATTRIBUTE_CALL_SUPER, callSuper(originalMethod, result));
JavaTemplateUtil.setClassAndMethodNameProperties(properties, targetClass, result);
PsiElementFactory factory = JavaPsiFacade.getInstance(originalMethod.getProject()).getElementFactory();
JVMElementFactory factory = JVMElementFactories.getFactory(targetClass.getLanguage(), originalMethod.getProject());
if (factory == null) factory = JavaPsiFacade.getInstance(originalMethod.getProject()).getElementFactory();
@NonNls String methodText;
try {
String bodyText = template.getText(properties);
if (!"".equals(bodyText)) bodyText += "\n";
if (bodyText != null && !bodyText.isEmpty()) bodyText += "\n";
methodText = "void foo () {\n" + bodyText + "}";
methodText = FileTemplateUtil.indent(methodText, result.getProject(), fileType);
} catch (Exception e) {
@@ -769,14 +770,6 @@ public class OverrideImplementUtil {
return aClass == null || !allowInterface && aClass.isInterface() ? null : aClass;
}
private static PsiSubstitutor getContextSubstitutor(PsiClass aClass) {
if (aClass instanceof PsiAnonymousClass) {
return ((PsiAnonymousClass)aClass).getBaseClassType().resolveGenerics().getSubstitutor();
}
return PsiSubstitutor.EMPTY;
}
public static void overrideOrImplementMethodsInRightPlace(Editor editor1, PsiClass aClass, Collection<PsiMethodMember> members, boolean copyJavadoc) {
boolean insert = CodeStyleSettingsManager.getSettings(aClass.getProject()).INSERT_OVERRIDE_ANNOTATION;
overrideOrImplementMethodsInRightPlace(editor1, aClass, members, copyJavadoc, insert);
@@ -21,6 +21,7 @@ import com.intellij.codeInsight.template.Expression;
import com.intellij.codeInsight.template.ExpressionContext;
import com.intellij.codeInsight.template.PsiTypeResult;
import com.intellij.codeInsight.template.Result;
import com.intellij.codeInsight.template.impl.JavaTemplateUtil;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
@@ -50,7 +51,11 @@ public class TypeExpression extends Expression {
return type == null? null : new PsiTypeResult(type, project) {
@Override
public void handleRecalc(PsiFile psiFile, Document document, int segmentStart, int segmentEnd) {
if (myItems.size() <= 1) super.handleRecalc(psiFile, document, segmentStart, segmentEnd);
if (myItems.size() <= 1) {
super.handleRecalc(psiFile, document, segmentStart, segmentEnd);
} else {
JavaTemplateUtil.updateTypeBindings(getType(), psiFile, document, segmentStart, segmentEnd, true);
}
}
@Override
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.lookup;
import com.intellij.codeInsight.completion.*;
import com.intellij.ide.highlighter.XmlLikeFileType;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ScrollType;
import com.intellij.openapi.util.ClassConditionKey;
@@ -80,11 +79,7 @@ public class PsiTypeLookupItem extends LookupItem {
PsiElement position = context.getFile().findElementAt(context.getStartOffset());
assert position != null;
int genericsStart = context.getTailOffset();
String generics = calcGenerics(position, context);
if (context.getFile().getFileType() instanceof XmlLikeFileType) {
generics = StringUtil.escapeXml(generics);
}
context.getDocument().insertString(genericsStart, generics);
context.getDocument().insertString(genericsStart, JavaCompletionUtil.escapeXmlIfNeeded(context, calcGenerics(position, context)));
JavaCompletionUtil.shortenReference(context.getFile(), genericsStart - 1);
int tail = context.getTailOffset();
@@ -29,6 +29,8 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class JavaTemplateUtil {
@@ -38,42 +40,72 @@ public class JavaTemplateUtil {
}
public static void updateTypeBindings(Object item, PsiFile file, final Document document, final int segmentStart, final int segmentEnd) {
updateTypeBindings(item, file, document, segmentStart, segmentEnd, false);
}
public static void updateTypeBindings(Object item,
PsiFile file,
final Document document,
final int segmentStart,
final int segmentEnd,
boolean noImport) {
final Project project = file.getProject();
PsiClass aClass = null;
List<PsiClass> classes = new ArrayList<PsiClass>();
if (item instanceof PsiClass) {
aClass = (PsiClass)item;
classes.add((PsiClass)item);
}
else if (item instanceof PsiType) {
aClass = PsiUtil.resolveClassInType((PsiType)item);
else if (item instanceof PsiClassType) {
PsiClass aClass = PsiUtil.resolveClassInType((PsiType)item);
if (aClass != null) {
classes.add(aClass);
}
collectClassParams((PsiType)item, classes);
}
if (aClass != null) {
if (aClass instanceof PsiTypeParameter) {
if (((PsiTypeParameter)aClass).getOwner() instanceof PsiMethod) {
if (!classes.isEmpty()) {
for (PsiClass aClass : classes) {
if (aClass instanceof PsiTypeParameter) {
PsiElement element = file.findElementAt(segmentStart);
PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class);
if (method != null) {
PsiTypeParameterList paramList = method.getTypeParameterList();
PsiTypeParameter[] params = paramList != null ? paramList.getTypeParameters() : PsiTypeParameter.EMPTY_ARRAY;
for (PsiTypeParameter param : params) {
if (param.getName().equals(aClass.getName())) return;
}
try {
if (paramList == null) {
final PsiTypeParameterList newList = JVMElementFactories.getFactory(method.getLanguage(), project).createTypeParameterList();
paramList = (PsiTypeParameterList)method.addAfter(newList, method.getModifierList());
if (((PsiTypeParameter)aClass).getOwner() instanceof PsiMethod || method.hasModifierProperty(PsiModifier.STATIC)) {
PsiTypeParameterList paramList = method.getTypeParameterList();
PsiTypeParameter[] params = paramList != null ? paramList.getTypeParameters() : PsiTypeParameter.EMPTY_ARRAY;
for (PsiTypeParameter param : params) {
if (param.getName().equals(aClass.getName())) return;
}
try {
if (paramList == null) {
final PsiTypeParameterList newList =
JVMElementFactories.getFactory(method.getLanguage(), project).createTypeParameterList();
paramList = (PsiTypeParameterList)method.addAfter(newList, method.getModifierList());
}
paramList.add(aClass.copy());
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
paramList.add(aClass.copy());
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}
} else if (!noImport) {
addImportForClass(document, aClass, segmentStart, segmentEnd);
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document);
}
} else {
addImportForClass(document, aClass, segmentStart, segmentEnd);
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document);
}
}
}
private static void collectClassParams(PsiType item, List<PsiClass> classes) {
PsiClass aClass = PsiUtil.resolveClassInType(item);
if (aClass instanceof PsiTypeParameter) {
classes.add(aClass);
}
if (item instanceof PsiClassType) {
PsiType[] parameters = ((PsiClassType)item).getParameters();
for (PsiType parameter : parameters) {
collectClassParams(parameter, classes);
}
}
}
@@ -540,7 +540,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState {
DfaTypeValue dfaType = (DfaTypeValue)dfaCond.getRightOperand();
final DfaVariableState varState = getVariableState(dfaVar);
varState.setNullable(dfaType.isNullable());
varState.setNullable(varState.isNullable() || dfaType.isNullable());
return !isNotNull(dfaVar) || varState.setInstanceofValue(dfaType);
}
@@ -119,7 +119,7 @@ public class NullableStuffInspection extends BaseLocalInspectionTool {
final String nullableSimpleName = StringUtil.getShortName(manager.getDefaultNullable());
final String notNullSimpleName = StringUtil.getShortName(manager.getDefaultNotNull());
final PsiIdentifier nameIdentifier = getter == null ? null : getter.getNameIdentifier();
if (nameIdentifier != null) {
if (nameIdentifier != null && nameIdentifier.isPhysical()) {
if (PropertyUtils.isSimpleGetter(getter)) {
if (REPORT_NOT_ANNOTATED_GETTER) {
if (!AnnotationUtil.isAnnotated(getter, manager.getAllAnnotations()) &&
@@ -218,7 +218,7 @@ public class NullableStuffInspection extends BaseLocalInspectionTool {
}
private void assertValidElement(PsiMethod setter, PsiParameter parameter, PsiIdentifier nameIdentifier1) {
LOG.assertTrue(nameIdentifier1 != null, setter.getText());
LOG.assertTrue(nameIdentifier1 != null && nameIdentifier1.isPhysical(), setter.getText());
LOG.assertTrue(parameter.isPhysical(), setter.getText());
}
@@ -15,7 +15,6 @@
*/
package com.intellij.ide.util;
import com.google.common.collect.Lists;
import com.intellij.ide.projectView.impl.nodes.ClassTreeNode;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
@@ -26,6 +25,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.util.Query;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -101,7 +101,7 @@ public class TreeJavaClassChooserDialog extends AbstractTreeClassChooserDialog<P
final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(getProject());
PsiClass[] classes =
cache.getClassesByName(name, checkBoxState ? searchScope : GlobalSearchScope.projectScope(getProject()).intersectWith(searchScope));
return Lists.newArrayList(classes);
return ContainerUtil.newArrayList(classes);
}
@NotNull
@@ -46,7 +46,7 @@ public class ControlFlowWrapper {
public ControlFlowWrapper(Project project, PsiElement codeFragment, PsiElement[] elements) throws PrepareFailedException {
try {
myControlFlow =
ControlFlowFactory.getInstance(project).getControlFlow(codeFragment, new LocalsControlFlowPolicy(codeFragment), false, true);
ControlFlowFactory.getInstance(project).getControlFlow(codeFragment, new LocalsControlFlowPolicy(codeFragment), false, false);
}
catch (AnalysisCanceledException e) {
throw new PrepareFailedException(RefactoringBundle.message("extract.method.control.flow.analysis.failed"), e.getErrorElement());
@@ -232,7 +232,7 @@ public class ControlFlowWrapper {
return true;
}
public List<PsiVariable> getInputVariables(final PsiElement codeFragment) {
public List<PsiVariable> getInputVariables(final PsiElement codeFragment, PsiElement[] elements) {
final List<PsiVariable> inputVariables = ControlFlowUtil.getInputVariables(myControlFlow, myFlowStart, myFlowEnd);
List<PsiVariable> myInputVariables;
if (myGenerateConditionalExit) {
@@ -241,7 +241,17 @@ public class ControlFlowWrapper {
myInputVariables = inputVariableList;
}
else {
myInputVariables = inputVariables;
List<PsiVariable> inputVariableList = new ArrayList<PsiVariable>(inputVariables);
for (Iterator<PsiVariable> iterator = inputVariableList.iterator(); iterator.hasNext(); ) {
PsiVariable variable = iterator.next();
for (PsiElement element : elements) {
if (PsiTreeUtil.isAncestor(element, variable, false)) {
iterator.remove();
break;
}
}
}
myInputVariables = inputVariableList;
}
//varargs variables go last, otherwise order is induced by original ordering
Collections.sort(myInputVariables, new Comparator<PsiVariable>() {
@@ -1073,7 +1073,7 @@ public class ExtractMethodProcessor implements MatchProvider {
}
private boolean chooseTargetClass(PsiElement codeFragment, final Pass<ExtractMethodProcessor> extractPass) throws PrepareFailedException {
final List<PsiVariable> inputVariables = myControlFlowWrapper.getInputVariables(codeFragment);
final List<PsiVariable> inputVariables = myControlFlowWrapper.getInputVariables(codeFragment, myElements);
myNeedChangeContext = false;
myTargetClass = myCodeFragmentMember instanceof PsiMember
@@ -15,7 +15,6 @@
*/
package com.intellij.refactoring.introduceVariable;
import com.google.common.collect.Maps;
import com.intellij.codeInsight.CodeInsightUtil;
import com.intellij.codeInsight.completion.JavaCompletionUtil;
import com.intellij.codeInsight.highlighting.HighlightManager;
@@ -65,6 +64,7 @@ import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.refactoring.util.occurrences.ExpressionOccurrenceManager;
import com.intellij.refactoring.util.occurrences.NotInSuperCallOccurrenceFilter;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -529,7 +529,7 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase {
final PsiExpression[] occurrences = occurenceManager.getOccurrences();
final PsiElement anchorStatementIfAll = occurenceManager.getAnchorStatementForAll();
final LinkedHashMap<OccurrencesChooser.ReplaceChoice, List<PsiExpression>> occurrencesMap = Maps.newLinkedHashMap();
final LinkedHashMap<OccurrencesChooser.ReplaceChoice, List<PsiExpression>> occurrencesMap = ContainerUtil.newLinkedHashMap();
final boolean hasWriteAccess = fillChoices(expr, occurrences, occurrencesMap);
@@ -66,7 +66,7 @@ public class DuplicatesImpl {
final String confirmDuplicatePrompt = getConfirmationPrompt(provider, duplicates);
for (final Match match : duplicates) {
if (!match.getMatchStart().isValid() || !match.getMatchEnd().isValid()) continue;
if (replaceMatch(project, provider, match, editor, ++idx, duplicates.size(), showAll, confirmDuplicatePrompt)) return;
if (replaceMatch(project, provider, match, editor, ++idx, duplicates.size(), showAll, confirmDuplicatePrompt, true)) return;
}
}
@@ -83,7 +83,7 @@ public class DuplicatesImpl {
final Editor editor = FileEditorManager.getInstance(project).openTextEditor(new OpenFileDescriptor(project, virtualFile), false);
LOG.assertTrue(editor != null);
if (!match.getMatchStart().isValid() || !match.getMatchEnd().isValid()) continue;
if (replaceMatch(project, provider, match, editor, ++idx, duplicates.size(), showAll, confirmDuplicatePrompt)) return;
if (replaceMatch(project, provider, match, editor, ++idx, duplicates.size(), showAll, confirmDuplicatePrompt, false)) return;
}
}
@@ -99,11 +99,18 @@ public class DuplicatesImpl {
return confirmDuplicatePrompt;
}
private static boolean replaceMatch(final Project project, final MatchProvider provider, final Match match, @NotNull final Editor editor,
final int idx, final int size, Ref<Boolean> showAll, final String confirmDuplicatePrompt) {
private static boolean replaceMatch(final Project project,
final MatchProvider provider,
final Match match,
@NotNull final Editor editor,
final int idx,
final int size,
Ref<Boolean> showAll,
final String confirmDuplicatePrompt,
boolean skipPromptWhenOne) {
final ArrayList<RangeHighlighter> highlighters = previewMatch(project, match, editor);
if (!ApplicationManager.getApplication().isUnitTestMode()) {
if (size > 1 && (showAll.get() == null || !showAll.get())) {
if ((!skipPromptWhenOne || size > 1) && (showAll.get() == null || !showAll.get())) {
final String prompt = provider.getConfirmDuplicatePrompt(match);
final ReplacePromptDialog promptDialog = new ReplacePromptDialog(false, provider.getReplaceDuplicatesTitle(idx, size), project){
@Override
@@ -34,17 +34,13 @@ import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
import com.intellij.psi.impl.source.resolve.JavaResolveUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.RefactoringActionHandler;
import com.intellij.refactoring.RefactoringBundle;
@@ -25,7 +25,6 @@ import com.intellij.codeInsight.hint.HintManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.psi.*;
@@ -34,14 +33,12 @@ import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.ui.components.JBList;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BaseGenerateTestSupportMethodAction extends BaseGenerateAction {
@@ -74,6 +71,17 @@ public class BaseGenerateTestSupportMethodAction extends BaseGenerateAction {
return false;
}
@Override
protected boolean isValidForFile(Project project, Editor editor, PsiFile file) {
if (file instanceof PsiCompiledElement) return false;
PsiDocumentManager.getInstance(project).commitAllDocuments();
PsiClass targetClass = getTargetClass(editor, file);
return targetClass != null && isValidForClass(targetClass);
}
protected boolean isValidFor(PsiClass targetClass, TestFramework framework) {
return true;
}
@@ -145,13 +153,7 @@ public class BaseGenerateTestSupportMethodAction extends BaseGenerateAction {
PsiMethod method = generateDummyMethod(editor, file);
if (method == null) return;
TestIntegrationUtils.runTestMethodTemplate(myMethodKind,
framework,
editor,
targetClass,
method,
"name",
false);
TestIntegrationUtils.runTestMethodTemplate(myMethodKind, framework, editor, targetClass, method, "name", false);
}
catch (IncorrectOperationException e) {
HintManager.getInstance().showErrorHint(editor, "Cannot generate method: " + e.getMessage());
@@ -165,7 +167,7 @@ public class BaseGenerateTestSupportMethodAction extends BaseGenerateAction {
private PsiMethod generateDummyMethod(Editor editor, PsiFile file) throws IncorrectOperationException {
List<GenerationInfo> members = new ArrayList<GenerationInfo>();
final PsiMethod method = TestIntegrationUtils.createDummyMethod(file.getProject());
final PsiMethod method = TestIntegrationUtils.createDummyMethod(file);
final PsiMethod[] result = new PsiMethod[1];
members.add(new GenerationInfoBase() {
@@ -233,9 +233,10 @@ public class TestIntegrationUtils {
return template;
}
public static PsiMethod createDummyMethod(Project project) {
PsiElementFactory f = JavaPsiFacade.getInstance(project).getElementFactory();
return f.createMethod("dummy", PsiType.VOID);
public static PsiMethod createDummyMethod(@NotNull PsiElement context) {
JVMElementFactory factory = JVMElementFactories.getFactory(context.getLanguage(), context.getProject());
if (factory == null) factory = JavaPsiFacade.getElementFactory(context.getProject());
return factory.createMethod("dummy", PsiType.VOID);
}
public static List<TestFramework> findSuitableFrameworks(PsiClass targetClass) {
@@ -122,7 +122,7 @@ public class JavaTestGenerator implements TestGenerator {
PsiClass targetClass,
Editor editor,
@Nullable String name) {
PsiMethod method = (PsiMethod)targetClass.add(TestIntegrationUtils.createDummyMethod(targetClass.getProject()));
PsiMethod method = (PsiMethod)targetClass.add(TestIntegrationUtils.createDummyMethod(targetClass));
PsiDocumentManager.getInstance(targetClass.getProject()).doPostponedOperationsAndUnblockDocument(editor.getDocument());
TestIntegrationUtils.runTestMethodTemplate(methodKind, descriptor, editor, targetClass, method, name, true);
}