IDEA-59783 Properties files: code completion list does not open after dot character

This commit is contained in:
peter
2011-12-30 18:06:50 +01:00
parent 200c0ba6dc
commit 3bc866a991
3 changed files with 42 additions and 32 deletions

View File

@@ -15,10 +15,12 @@
*/
package com.intellij.codeInsight.completion;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReference;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author peter
@@ -26,25 +28,25 @@ import org.jetbrains.annotations.NotNull;
public class JavaClassReferenceCompletionContributor extends CompletionContributor {
@Override
public void duringCompletion(@NotNull CompletionInitializationContext context) {
PsiReference reference = context.getFile().findReferenceAt(context.getStartOffset());
if (reference instanceof PsiMultiReference) {
for (final PsiReference psiReference : ((PsiMultiReference)reference).getReferences()) {
if (psiReference instanceof JavaClassReference) {
reference = psiReference;
break;
}
}
}
if (reference instanceof JavaClassReference) {
final JavaClassReference classReference = (JavaClassReference)reference;
if (classReference.getExtendClassNames() != null) {
final PsiReference[] references = classReference.getJavaClassReferenceSet().getReferences();
final PsiReference last = references[references.length - 1];
context.setReplacementOffset(last.getRangeInElement().getEndOffset() + last.getElement().getTextRange().getStartOffset());
}
JavaClassReference reference = findJavaClassReference(context.getFile(), context.getStartOffset());
if (reference != null && reference.getExtendClassNames() != null) {
final PsiReference[] references = reference.getJavaClassReferenceSet().getReferences();
final PsiReference last = references[references.length - 1];
context.setReplacementOffset(last.getRangeInElement().getEndOffset() + last.getElement().getTextRange().getStartOffset());
}
}
@Nullable
public static JavaClassReference findJavaClassReference(final PsiFile file, final int offset) {
PsiReference reference = file.findReferenceAt(offset);
if (reference instanceof PsiMultiReference) {
for (final PsiReference psiReference : ((PsiMultiReference)reference).getReferences()) {
if (psiReference instanceof JavaClassReference) {
return (JavaClassReference)psiReference;
}
}
}
return reference instanceof JavaClassReference ? (JavaClassReference)reference : null;
}
}

View File

@@ -17,6 +17,7 @@ package com.intellij.codeInsight.editorActions;
import com.intellij.codeInsight.AutoPopupController;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.completion.JavaClassReferenceCompletionContributor;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.editor.ScrollType;
@@ -37,6 +38,7 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
@@ -46,19 +48,6 @@ public class JavaTypedHandler extends TypedHandlerDelegate {
static final TokenSet INVALID_INSIDE_REFERENCE = TokenSet.create(JavaTokenType.SEMICOLON, JavaTokenType.LBRACE, JavaTokenType.RBRACE);
private boolean myJavaLTTyped;
public Result checkAutoPopup(final char charTyped, final Project project, final Editor editor, final PsiFile file) {
if (charTyped == '@' && file instanceof PsiJavaFile) {
autoPopupJavadocLookup(project, editor);
return Result.STOP;
}
if (charTyped == '#' || charTyped == '.') {
autoPopupMemberLookup(project, editor);
return Result.STOP;
}
return Result.CONTINUE;
}
private static void autoPopupMemberLookup(Project project, final Editor editor) {
AutoPopupController.getInstance(project).autoPopupMemberLookup(editor, new Condition<PsiFile>() {
public boolean value(final PsiFile file) {
@@ -79,7 +68,7 @@ public class JavaTypedHandler extends TypedHandlerDelegate {
if (parent instanceof PsiParameterList || parent instanceof PsiParameter) return false;
if (!".".equals(lastElement.getText()) && !"#".equals(lastElement.getText())) {
return false;
return JavaClassReferenceCompletionContributor.findJavaClassReference(file, offset - 1) != null;
}
else{
final PsiElement element = file.findElementAt(offset);
@@ -92,6 +81,14 @@ public class JavaTypedHandler extends TypedHandlerDelegate {
}
public Result beforeCharTyped(final char c, final Project project, final Editor editor, final PsiFile file, final FileType fileType) {
if (c == '@' && file instanceof PsiJavaFile) {
autoPopupJavadocLookup(project, editor);
}
else if (c == '#' || c == '.') {
autoPopupMemberLookup(project, editor);
}
final FileType originalFileType = getOriginalFileType(file);
int offsetBefore = editor.getCaretModel().getOffset();
@@ -143,7 +140,7 @@ public class JavaTypedHandler extends TypedHandlerDelegate {
return Result.CONTINUE;
}
public Result charTyped(final char c, final Project project, final Editor editor, final PsiFile file) {
public Result charTyped(final char c, final Project project, final Editor editor, @NotNull final PsiFile file) {
if (myJavaLTTyped) {
myJavaLTTyped = false;
handleAfterJavaLT(editor, JavaTokenType.LT, JavaTokenType.GT, INVALID_INSIDE_REFERENCE);

View File

@@ -1150,5 +1150,16 @@ class Foo {{
myFixture.checkResult 'class Foo extends Abcdefg <caret>'
}
public void testClassNameInProperties() {
myFixture.addClass("package java.langa; public class Abcdefg {}")
myFixture.configureByText 'a.properties', 'key.11=java<caret>'
type '.'
assert lookup
type 'lang'
assert myFixture.lookupElementStrings.size() >= 2
type '.'
assert lookup
}
}