IDEA-82427 Code Completion produces bad code inside if brackets

This commit is contained in:
peter
2012-03-08 16:50:30 +04:00
parent e51edaedf7
commit 392d90ae1b
6 changed files with 28 additions and 8 deletions
@@ -21,8 +21,10 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.ClassConditionKey;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.text.CharArrayUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -100,10 +102,12 @@ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement
final Document document = context.getEditor().getDocument();
document.replaceString(context.getStartOffset(), context.getTailOffset(), ";");
final InsertionContext qualifierContext = CompletionUtil.emulateInsertion(context, context.getStartOffset(), myQualifier);
OffsetKey oldStart = context.trackOffset(context.getStartOffset(), false);
if (shouldParenthesizeQualifier(qualifierContext.getFile(), context.getStartOffset(), qualifierContext.getTailOffset())) {
int start = CharArrayUtil.shiftForward(context.getDocument().getCharsSequence(), context.getStartOffset(), " \t");
if (shouldParenthesizeQualifier(context.getFile(), start, qualifierContext.getTailOffset())) {
final String space = CodeStyleSettingsManager.getSettings(qualifierContext.getProject()).SPACE_WITHIN_PARENTHESES ? " " : "";
document.insertString(context.getStartOffset(), "(" + space);
document.insertString(start, "(" + space);
document.insertString(qualifierContext.getTailOffset(), space + ")");
}
@@ -112,6 +116,13 @@ public class JavaChainLookupElement extends LookupElementDecorator<LookupElement
document.replaceString(context.getTailOffset() - 1, context.getTailOffset(), ".");
CompletionUtil.emulateInsertion(getDelegate(), context.getTailOffset(), context);
context.commitDocument();
int formatStart = context.getOffset(oldStart);
int formatEnd = context.getTailOffset();
if (formatStart >= 0 && formatEnd >= 0) {
CodeStyleManager.getInstance(context.getProject()).reformatRange(context.getFile(), formatStart, formatEnd);
}
}
protected boolean shouldParenthesizeQualifier(final PsiFile file, final int startOffset, final int endOffset) {
@@ -1,5 +1,5 @@
class Foo {
{
Assert.<caret>
if (Assert.<caret>)
}
}
@@ -0,0 +1,7 @@
import bar.Assert;
class Foo {
{
if (Assert.bar()<caret>)
}
}
@@ -45,7 +45,6 @@ import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.progress.ProgressManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiJavaFile
import com.intellij.util.Consumer
/**
* @author peter
@@ -1230,7 +1229,8 @@ class Foo {{
type 'fo\n'
myFixture.checkResult '''import foo.Util;
class Foo {{ Util.foo();<caret> }}'''
class Foo {{
Util.foo();<caret> }}'''
}
public void testPackageQualifier() {
@@ -1292,10 +1292,12 @@ public class ListUtils {
}
public void testAllAssertClassesMethods() {
myFixture.addClass 'package foo; public class Assert { public static void foo() {} }'
myFixture.addClass 'package bar; public class Assert { public static void bar() {} }'
myFixture.addClass 'package foo; public class Assert { public static boolean foo() {} }'
myFixture.addClass 'package bar; public class Assert { public static boolean bar() {} }'
configure()
assert myFixture.lookupElementStrings == ['Assert.bar', 'Assert.foo']
myFixture.type '\n'
checkResult()
}
}
@@ -2,7 +2,7 @@ class A {
File myFile;
def foo() {
myFile.canonicalPath<caret>
myFile.canonicalPath<caret>
}
}