IDEA-51798

This commit is contained in:
Alexey Kudravtsev
2010-02-09 13:49:55 +03:00
parent 7704c81b75
commit 4f5bde8a96
14 changed files with 70 additions and 55 deletions
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.*;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiType;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
@@ -39,7 +40,7 @@ public class CastingLookupElementDecorator extends LookupElementDecorator<Lookup
private CastingLookupElementDecorator(LookupElement delegate, PsiType castType) {
super(delegate);
myCastType = castType;
myCastItem = PsiTypeLookupItem.createLookupItem(castType);
myCastItem = PsiTypeLookupItem.createLookupItem(castType, (PsiElement)delegate.getObject());
}
public PsiType getType() {
@@ -30,14 +30,13 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import static com.intellij.patterns.PlatformPatterns.psiElement;
import com.intellij.patterns.PsiElementPattern;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.*;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.filters.AndFilter;
import com.intellij.psi.filters.ClassFilter;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.filters.element.ExcludeDeclaredFilter;
import com.intellij.psi.filters.element.ExcludeSillyAssignment;
import com.intellij.psi.html.HtmlTag;
@@ -46,9 +45,9 @@ import com.intellij.psi.infos.CandidateInfo;
import com.intellij.psi.infos.ClassCandidateInfo;
import com.intellij.psi.javadoc.PsiDocToken;
import com.intellij.psi.scope.BaseScopeProcessor;
import com.intellij.psi.scope.ElementClassFilter;
import com.intellij.psi.scope.ElementClassHint;
import com.intellij.psi.scope.NameHint;
import com.intellij.psi.scope.ElementClassFilter;
import com.intellij.psi.statistics.JavaStatisticsManager;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.*;
@@ -65,6 +64,8 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
import static com.intellij.patterns.PlatformPatterns.psiElement;
public class JavaCompletionUtil {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.JavaCompletionUtil");
public static final Key<PairFunction<PsiExpression, CompletionParameters, PsiType>> DYNAMIC_TYPE_EVALUATOR = Key.create("DYNAMIC_TYPE_EVALUATOR");
@@ -909,7 +910,7 @@ public class JavaCompletionUtil {
final PsiExpression newRef = JavaPsiFacade.getElementFactory(project).createExpressionFromText(newText, refExpr);
((PsiReferenceExpression)newRef).processVariants(processor);
final LookupElement castItem = PsiTypeLookupItem.createLookupItem(castTo);
final LookupElement castItem = PsiTypeLookupItem.createLookupItem(castTo, refExpr);
for (CompletionElement completionElement : processor.getResults()) {
final LookupElement item = createLookupElement(completionElement, castTo);
@@ -23,10 +23,7 @@ import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.patterns.ElementPattern;
import static com.intellij.patterns.PlatformPatterns.psiElement;
import com.intellij.patterns.PsiJavaPatterns;
import static com.intellij.patterns.PsiJavaPatterns.psiMethod;
import static com.intellij.patterns.StandardPatterns.*;
import com.intellij.psi.*;
import com.intellij.psi.filters.ElementExtractorFilter;
import com.intellij.psi.filters.ElementFilter;
@@ -59,6 +56,10 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
import static com.intellij.patterns.PlatformPatterns.psiElement;
import static com.intellij.patterns.PsiJavaPatterns.psiMethod;
import static com.intellij.patterns.StandardPatterns.*;
/**
* @author peter
*/
@@ -277,7 +278,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
if (tryBlock == null) return;
for (final PsiClassType type : ExceptionUtil.getThrownExceptions(tryBlock.getStatements())) {
result.addElement(TailTypeDecorator.withTail(PsiTypeLookupItem.createLookupItem(type).setInsertHandler(new DefaultInsertHandler()), TailType.SPACE));
result.addElement(TailTypeDecorator.withTail(PsiTypeLookupItem.createLookupItem(type, tryBlock).setInsertHandler(new DefaultInsertHandler()), TailType.SPACE));
}
}
});
@@ -322,7 +323,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
.getSubstitutionForTypeParameter(targetParameter, paramSubstitution, argSubstitution, false,
PsiUtil.getLanguageLevel(context));
if (substitution != null && substitution != PsiType.NULL) {
final LookupItem item = PsiTypeLookupItem.createLookupItem(substitution);
final LookupItem item = PsiTypeLookupItem.createLookupItem(substitution, context);
resultSet.addElement(TailTypeDecorator.withTail(item.setInsertHandler(new DefaultInsertHandler()), tail));
}
}
@@ -378,7 +379,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
for (final PsiArrayType type : expectedArrayTypes) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
final LookupItem item = PsiTypeLookupItem.createLookupItem(JavaCompletionUtil.eliminateWildcards(type));
final LookupItem item = PsiTypeLookupItem.createLookupItem(JavaCompletionUtil.eliminateWildcards(type), identifierCopy);
item.setAttribute(LookupItem.DONT_CHECK_FOR_INNERS, "");
if (item.getObject() instanceof PsiClass) {
JavaCompletionUtil.setShowFQN(item);
@@ -425,7 +426,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
substitutor = substitutor.put(typeParameter, wildcard);
}
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(psiClass.getProject());
return PsiTypeLookupItem.createLookupItem(factory.createType(psiClass, substitutor));
return PsiTypeLookupItem.createLookupItem(factory.createType(psiClass, substitutor), psiClass);
}
}
}
@@ -565,7 +566,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
return;
}
final LookupItem item = PsiTypeLookupItem.createLookupItem(JavaCompletionUtil.eliminateWildcards(type));
final LookupItem item = PsiTypeLookupItem.createLookupItem(JavaCompletionUtil.eliminateWildcards(type), parameters.getPosition());
item.setAttribute(LookupItem.DONT_CHECK_FOR_INNERS, "");
JavaCompletionUtil.setShowFQN(item);
item.setAttribute(LookupItem.NEW_OBJECT_ATTR, "");
@@ -38,7 +38,7 @@ class SmartCastProvider extends CompletionProvider<CompletionParameters> {
final boolean overwrite = INSIDE_TYPECAST_TYPE.accepts(parameters.getOriginalPosition());
final LookupElement item = AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE.applyPolicy(new LookupElementDecorator<LookupItem>(
PsiTypeLookupItem.createLookupItem(type.getDefaultType())) {
PsiTypeLookupItem.createLookupItem(type.getDefaultType(), parameters.getPosition())) {
@Override
public void handleInsert(InsertionContext context) {
@@ -57,7 +57,7 @@ class JavaWithCastSurrounder extends JavaExpressionSurrounder {
Set<LookupElement> itemSet = new LinkedHashSet<LookupElement>();
for (PsiType type : suggestedTypes) {
itemSet.add(PsiTypeLookupItem.createLookupItem(type));
itemSet.add(PsiTypeLookupItem.createLookupItem(type, null));
}
final LookupElement[] lookupItems = itemSet.toArray(new LookupElement[itemSet.size()]);
@@ -87,4 +87,4 @@ class JavaWithCastSurrounder extends JavaExpressionSurrounder {
public String getTemplateDescription() {
return CodeInsightBundle.message("surround.with.cast.template");
}
}
}
@@ -64,7 +64,7 @@ public class TypeExpression extends Expression {
for (final SmartTypePointer item : myItems) {
final PsiType type = item.getType();
if (type != null) {
result.add(PsiTypeLookupItem.createLookupItem(type));
result.add(PsiTypeLookupItem.createLookupItem(type, null));
}
}
return result.toArray(new LookupElement[result.size()]);
@@ -106,7 +106,7 @@ public class LookupItemUtil{
return new ExpressionLookupItem((PsiExpression) object);
}
if (object instanceof PsiType) {
return PsiTypeLookupItem.createLookupItem((PsiType)object);
return PsiTypeLookupItem.createLookupItem((PsiType)object, null);
}
String s = null;
@@ -15,9 +15,10 @@
*/
package com.intellij.codeInsight.lookup;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.NonNls;
import com.intellij.psi.*;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author peter
@@ -40,11 +41,11 @@ public class PsiTypeLookupItem extends LookupItem {
}
public int getBracketsCount() {
final Integer integer = (Integer)getUserData(LookupItem.BRACKETS_COUNT_ATTR);
final Integer integer = (Integer)getUserData(BRACKETS_COUNT_ATTR);
return integer == null ? 0 : integer;
}
public static LookupItem createLookupItem(PsiType type) {
public static LookupItem createLookupItem(@NotNull PsiType type, @Nullable PsiElement context) {
final PsiType original = type;
int dim = 0;
while (type instanceof PsiArrayType) {
@@ -59,12 +60,30 @@ public class PsiTypeLookupItem extends LookupItem {
final PsiSubstitutor substitutor = classResolveResult.getSubstitutor();
final String text = type.getCanonicalText();
String typeString = text;
String typeParams = "";
if (text.indexOf('<') > 0 && text.endsWith(">")) {
typeString = text.substring(0, text.indexOf('<'));
typeParams = text.substring(text.indexOf('<'));
}
String s = text.substring(typeString.lastIndexOf('.') + 1);
item = psiClass != null ? new PsiTypeLookupItem(psiClass, s) : new PsiTypeLookupItem(text, s);
item.setAttribute(LookupItem.SUBSTITUTOR, substitutor);
String lookupString = text.substring(typeString.lastIndexOf('.') + 1);
if (psiClass != null) {
PsiClass resolved =
JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper().resolveReferencedClass(psiClass.getName(), context);
if (!psiClass.getManager().areElementsEquivalent(resolved, psiClass)) {
// inner class name should be shown qualified if its not accessible by single name
PsiClass aClass = psiClass;
lookupString = "";
while (aClass != null) {
lookupString = aClass.getName() + (lookupString == "" ? "" : ".") + lookupString;
aClass = aClass.getContainingClass();
}
lookupString += typeParams;
}
}
item = new PsiTypeLookupItem(psiClass == null ? text : psiClass, lookupString);
item.setAttribute(SUBSTITUTOR, substitutor);
}
else {
item = new LookupItem(type, type.getPresentableText());
@@ -75,11 +94,11 @@ public class PsiTypeLookupItem extends LookupItem {
for (int i = 0; i < dim; i++) {
tail.append("[]");
}
item.setAttribute(LookupItem.TAIL_TEXT_ATTR, " " + tail.toString());
item.setAttribute(LookupItem.TAIL_TEXT_SMALL_ATTR, "");
item.putUserData(LookupItem.BRACKETS_COUNT_ATTR, dim);
item.setAttribute(TAIL_TEXT_ATTR, " " + tail.toString());
item.setAttribute(TAIL_TEXT_SMALL_ATTR, "");
item.putUserData(BRACKETS_COUNT_ATTR, dim);
}
item.setAttribute(LookupItem.TYPE, original);
item.setAttribute(TYPE, original);
return item;
}
}
@@ -16,20 +16,19 @@
package com.intellij.codeInsight.template.macro;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.codeInsight.template.*;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiVariable;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.LinkedList;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
public class SuggestVariableNameMacro implements Macro {
public String getName() {
@@ -60,24 +59,24 @@ public class SuggestVariableNameMacro implements Macro {
LookupItem[] items = new LookupItem[names.length];
for(int i = 0; i < names.length; i++) {
String name = names[i];
items[i] = new LookupItem(name, name);
items[i] = LookupItem.fromString(name);
}
return items;
}
private String[] getNames (final ExpressionContext context) {
private static String[] getNames (final ExpressionContext context) {
String[] names = ExpressionUtil.getNames(context);
if (names == null || names.length == 0) return names;
PsiFile file = PsiDocumentManager.getInstance(context.getProject()).getPsiFile(context.getEditor().getDocument());
PsiElement e = file.findElementAt(context.getStartOffset());
PsiVariable[] vars = MacroUtil.getVariablesVisibleAt(e, "");
LinkedList namesList = new LinkedList(Arrays.asList(names));
LinkedList<String> namesList = new LinkedList<String>(Arrays.asList(names));
for (PsiVariable var : vars) {
if (e.equals(var.getNameIdentifier())) continue;
namesList.remove(var.getName());
}
if (namesList.size() == 0) {
if (namesList.isEmpty()) {
String name = names[0];
index:
for (int j = 1; ; j++) {
@@ -89,7 +88,7 @@ public class SuggestVariableNameMacro implements Macro {
}
}
return (String[])ArrayUtil.toStringArray(namesList);
return ArrayUtil.toStringArray(namesList);
}
}
@@ -11,6 +11,7 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import java.util.ArrayList;
@@ -45,12 +46,12 @@ public abstract class CompletionSortingTestCase extends LightCompletionTestCase
protected abstract String getBasePath();
protected void checkPreferredItems(final int selected, final String... expected) throws Exception {
protected void checkPreferredItems(final int selected, @NonNls final String... expected) throws Exception {
invokeCompletion(getBasePath() + "/" + getTestName(false) + ".java");
assertPreferredItems(selected, expected);
}
protected static void assertPreferredItems(final int selected, final String... expected) {
protected static void assertPreferredItems(final int selected, @NonNls final String... expected) {
final LookupImpl lookup = getLookup();
final JList list = lookup.getList();
final List<LookupElement> model = lookup.getItems();
@@ -5,13 +5,10 @@
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.impl.LookupImpl;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.psi.statistics.StatisticsManager;
@SuppressWarnings({"ALL"})
public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
private static final String BASE_PATH = "/codeInsight/completion/smartTypeSorting";
private static final String BASE_PATH = "/codeInsight/completion/smartTypeSorting";
public SmartTypeCompletionOrderingTest() {
super(CompletionType.SMART);
@@ -236,8 +233,4 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
protected String getBasePath() {
return BASE_PATH;
}
protected Sdk getTestProjectJdk() {
return JavaSdkImpl.getMockJdk15("java 1.5");
}
}
@@ -65,7 +65,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.lookup.impl.LookupImpl");
private static final int MAX_PREFERRED_COUNT = 5;
private static final LookupItem EMPTY_LOOKUP_ITEM = new LookupItem("preselect", "preselect");
private static final LookupItem EMPTY_LOOKUP_ITEM = LookupItem.fromString("preselect");
private final Project myProject;
private final Editor myEditor;
@@ -928,7 +928,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable {
Dimension preferredSize = getComponent().getPreferredSize();
setBounds(point.x,point.y,preferredSize.width,preferredSize.height);
HintManagerImpl.getInstanceImpl().adjustEditorHintPosition(this, myEditor, point);
HintManagerImpl.adjustEditorHintPosition(this, myEditor, point);
}
}
@@ -305,7 +305,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
if (IdeaLogger.ourErrorsOccurred != null) {
throw IdeaLogger.ourErrorsOccurred;
}
assertTrue("Logger errors occurred in " + getFullName(), IdeaLogger.ourErrorsOccurred == null);
assertNull("Logger errors occurred in " + getFullName(), IdeaLogger.ourErrorsOccurred);
}
}
finally {
@@ -623,8 +623,8 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
private static void setTmpDir(String path) {
System.setProperty("java.io.tmpdir", path);
Class<File> ioFile = File.class;
try {
Class<File> ioFile = File.class;
Field field = ioFile.getDeclaredField("tmpdir");
field.setAccessible(true);
@@ -53,9 +53,9 @@ public class ChooseTypeExpression extends Expression {
for (TypeConstraint constraint : constraints) {
if (constraint instanceof TypeEquals) {
result.add(PsiTypeLookupItem.createLookupItem(constraint.getType()));
result.add(PsiTypeLookupItem.createLookupItem(constraint.getType(), null));
} else if (constraint instanceof SubtypeConstraint) {
result.add(PsiTypeLookupItem.createLookupItem(constraint.getDefaultType()));
result.add(PsiTypeLookupItem.createLookupItem(constraint.getDefaultType(), null));
} else if (constraint instanceof SupertypeConstraint) {
processSupertypes(constraint.getType(), result);
}
@@ -72,7 +72,7 @@ public class ChooseTypeExpression extends Expression {
if (unboxed != null && !unboxed.equals(text)) {
result.add(LookupElementBuilder.create(unboxed).setBold());
} else {
result.add(PsiTypeLookupItem.createLookupItem(type));
result.add(PsiTypeLookupItem.createLookupItem(type, null));
}
PsiType[] superTypes = type.getSuperTypes();
for (PsiType superType : superTypes) {