mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
Merge branch 'master' into upsource-master
This commit is contained in:
@@ -27,7 +27,6 @@
|
||||
<orderEntry type="module" module-name="icons" />
|
||||
<orderEntry type="library" name="jcip" level="project" />
|
||||
<orderEntry type="library" name="Groovy" level="project" />
|
||||
<orderEntry type="library" name="Guava" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="JUnit4" level="project" />
|
||||
<orderEntry type="module" module-name="java-psi-impl" exported="" />
|
||||
<orderEntry type="module" module-name="RegExpSupport" />
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -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
+2
-2
@@ -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)) {
|
||||
|
||||
+8
-10
@@ -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());
|
||||
|
||||
-16
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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>() {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
-4
@@ -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;
|
||||
|
||||
+13
-11
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user