mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-05 01:50:56 +07:00
IDEA-59783 Properties files: code completion list does not open after dot character
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user