diff --git a/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java b/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java index cf4816a98b5..70d6fe48f13 100644 --- a/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java @@ -11,12 +11,11 @@ import com.intellij.psi.tree.IElementType; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.compiler.TipsManager; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.JetVisibilityChecker; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; @@ -34,6 +33,8 @@ import java.util.List; */ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWithTabActionSupport { + public final static Color GREEN_BACKGROUND = new Color(231, 254, 234); + @NotNull @Override public JetValueArgument[] getActualParameters(@NotNull JetValueArgumentList arguments) { @@ -56,7 +57,7 @@ public class JetFunctionParameterInfoHandler implements @NotNull @Override public Set getArgumentListAllowedParentClasses() { - return Collections.singleton((Class) JetCallExpression.class); + return Collections.singleton((Class) JetCallElement.class); } @NotNull @@ -78,7 +79,7 @@ public class JetFunctionParameterInfoHandler implements @Override public Object[] getParametersForLookup(LookupElement item, ParameterInfoContext context) { - return ArrayUtil.EMPTY_OBJECT_ARRAY; //todo: + return ArrayUtil.EMPTY_OBJECT_ARRAY; //todo: ? } @Override @@ -124,7 +125,7 @@ public class JetFunctionParameterInfoHandler implements return true; } - private static String renderParameter(ValueParameterDescriptor descriptor, boolean named) { + private static String renderParameter(ValueParameterDescriptor descriptor, boolean named, BindingContext bindingContext) { StringBuilder builder = new StringBuilder(); if (named) builder.append("["); if (descriptor.getVarargElementType() != null) { @@ -133,7 +134,24 @@ public class JetFunctionParameterInfoHandler implements builder.append(descriptor.getName()).append(": "). append(DescriptorRenderer.TEXT.renderType(getActualParameterType(descriptor))); if (descriptor.hasDefaultValue()) { - builder.append(" = {...}"); + PsiElement element = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor); + String defaultExpression = "?"; + if (element instanceof JetParameter) { + JetParameter parameter = (JetParameter) element; + JetExpression defaultValue = parameter.getDefaultValue(); + if (defaultValue != null) { + if (defaultValue instanceof JetConstantExpression) { + JetConstantExpression constantExpression = (JetConstantExpression) defaultValue; + defaultExpression = constantExpression.getText(); + if (defaultExpression.length() > 10) { + if (defaultExpression.startsWith("\"")) defaultExpression = "\"...\""; + else if (defaultExpression.startsWith("\'")) defaultExpression = "\'...\'"; + else defaultExpression = defaultExpression.substring(0, 7) + "..."; + } + } + } + } + builder.append(" = ").append(defaultExpression); } if (named) builder.append("]"); return builder.toString(); @@ -147,9 +165,7 @@ public class JetFunctionParameterInfoHandler implements @Override public void updateUI(Object descriptor, ParameterInfoUIContext context) { - //todo: when we will have ability to pass Array as vararg, implement such feature here too - //todo: check for constructors - //todo: TESTS!!! + //todo: when we will have ability to pass Array as vararg, implement such feature here too? if (context == null || context.getParameterOwner() == null || !context.getParameterOwner().isValid()) { return; } @@ -169,7 +185,33 @@ public class JetFunctionParameterInfoHandler implements int boldEndOffset = -1; boolean isGrey = false; boolean isDeprecated = false; //todo: add deprecation check - Color color = context.getDefaultParameterColor(); //todo: choose descriptors to highlight green + Color color = context.getDefaultParameterColor(); + PsiElement parent = argumentList.getParent(); + if (parent instanceof JetCallElement) { + JetCallElement callExpression = (JetCallElement) parent; + JetExpression calleeExpression = callExpression.getCalleeExpression(); + JetSimpleNameExpression refExpression = null; + if (calleeExpression instanceof JetSimpleNameExpression) { + refExpression = (JetSimpleNameExpression) calleeExpression; + } else if (calleeExpression instanceof JetConstructorCalleeExpression) { + JetConstructorCalleeExpression constructorCalleeExpression = (JetConstructorCalleeExpression) calleeExpression; + if (constructorCalleeExpression.getConstructorReferenceExpression() instanceof JetSimpleNameExpression) { + refExpression = (JetSimpleNameExpression) constructorCalleeExpression.getConstructorReferenceExpression(); + } + } + if (refExpression != null) { + ResolvedCall call = bindingContext.get(BindingContext.RESOLVED_CALL, refExpression); + if (call != null) { + CallableDescriptor candidateDescriptor = call.getCandidateDescriptor(); + PsiElement elem = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, candidateDescriptor); + PsiElement ourElem = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, functionDescriptor); + if (elem.equals(ourElem)) { + color = GREEN_BACKGROUND; + } + } + } + } + boolean[] usedIndexes = new boolean[valueParameters.size()]; boolean namedMode = false; Arrays.fill(usedIndexes, false); @@ -193,7 +235,7 @@ public class JetFunctionParameterInfoHandler implements namedMode = true; } else { ValueParameterDescriptor param = valueParameters.get(i); - builder.append(renderParameter(param, false)); + builder.append(renderParameter(param, false, bindingContext)); if (i < currentParameterIndex) { if (argument.getArgumentExpression() != null) { //check type @@ -207,7 +249,7 @@ public class JetFunctionParameterInfoHandler implements } } else { ValueParameterDescriptor param = valueParameters.get(i); - builder.append(renderParameter(param, false)); + builder.append(renderParameter(param, false, bindingContext)); } } if (namedMode) { @@ -222,7 +264,7 @@ public class JetFunctionParameterInfoHandler implements param.getName().equals(referenceExpression.getReferencedName())) { takeAnyArgument = false; usedIndexes[j] = true; - builder.append(renderParameter(param, true)); + builder.append(renderParameter(param, true, bindingContext)); if (i < currentParameterIndex) { if (argument.getArgumentExpression() != null) { //check type @@ -245,7 +287,7 @@ public class JetFunctionParameterInfoHandler implements ValueParameterDescriptor param = valueParameters.get(j); if (!usedIndexes[j]) { usedIndexes[j] = true; - builder.append(renderParameter(param, true)); + builder.append(renderParameter(param, true, bindingContext)); break; } } @@ -253,7 +295,7 @@ public class JetFunctionParameterInfoHandler implements } if (highlightParameter) boldEndOffset = builder.length(); } - if (builder.toString() == "") context.setUIComponentEnabled(false); + if (builder.toString().isEmpty()) context.setUIComponentEnabled(false); else context.setupUIComponentPresentation(builder.toString(), boldStartOffset, boldEndOffset, isGrey, isDeprecated, false, color); } else context.setUIComponentEnabled(false); @@ -261,6 +303,7 @@ public class JetFunctionParameterInfoHandler implements } private static JetValueArgumentList findCall(CreateParameterInfoContext context) { + //todo: calls to this constructors, when we will have auxiliary constructors PsiFile file = context.getFile(); if (!(file instanceof JetFile)) return null; PsiElement element = file.findElementAt(context.getOffset()); @@ -269,16 +312,24 @@ public class JetFunctionParameterInfoHandler implements } if (element == null) return null; JetValueArgumentList argumentList = (JetValueArgumentList) element; - JetCallExpression callExpression; - if (element.getParent() instanceof JetCallExpression) { - callExpression = (JetCallExpression) element.getParent(); + JetCallElement callExpression; + if (element.getParent() instanceof JetCallElement) { + callExpression = (JetCallElement) element.getParent(); } else return null; BindingContext bindingContext = AnalyzerFacade.analyzeFileWithCache((JetFile) file, AnalyzerFacade.SINGLE_DECLARATION_PROVIDER); JetExpression calleeExpression = callExpression.getCalleeExpression(); if (calleeExpression == null) return null; + JetSimpleNameExpression refExpression = null; if (calleeExpression instanceof JetSimpleNameExpression) { - JetSimpleNameExpression refExpression = (JetSimpleNameExpression) calleeExpression; + refExpression = (JetSimpleNameExpression) calleeExpression; + } else if (calleeExpression instanceof JetConstructorCalleeExpression) { + JetConstructorCalleeExpression constructorCalleeExpression = (JetConstructorCalleeExpression) calleeExpression; + if (constructorCalleeExpression.getConstructorReferenceExpression() instanceof JetSimpleNameExpression) { + refExpression = (JetSimpleNameExpression) constructorCalleeExpression.getConstructorReferenceExpression(); + } + } + if (refExpression != null) { JetScope scope = bindingContext.get(BindingContext.RESOLUTION_SCOPE, refExpression); DeclarationDescriptor placeDescriptor = null; if (scope != null) { @@ -297,13 +348,21 @@ public class JetFunctionParameterInfoHandler implements if (placeDescriptor != null && !JetVisibilityChecker.isVisible(placeDescriptor, functionDescriptor)) continue; itemsToShow.add(functionDescriptor); } + } else if (variant instanceof ClassDescriptor) { + ClassDescriptor classDescriptor = (ClassDescriptor) variant; + if (classDescriptor.getName().equals(refName)) { + //todo: renamed classes? + for (ConstructorDescriptor constructorDescriptor : classDescriptor.getConstructors()) { + if (placeDescriptor != null && !JetVisibilityChecker.isVisible(placeDescriptor, constructorDescriptor)) continue; + itemsToShow.add(constructorDescriptor); + } + } } } context.setItemsToShow(ArrayUtil.toObjectArray(itemsToShow)); return argumentList; - } else { - return null; //todo: this expression? } + return null; } private static JetValueArgumentList findCallAndUpdateContext(UpdateParameterInfoContext context) { diff --git a/idea/testData/parameterInfo/functionParameterInfo/InheritedFunctions.kt b/idea/testData/parameterInfo/functionParameterInfo/InheritedFunctions.kt new file mode 100644 index 00000000000..a13878fa33e --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/InheritedFunctions.kt @@ -0,0 +1,13 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean) = 2 +} + +class B(): A(5) { + fun d(x: Int, y: Boolean, z: String) { + m(1, false) + } +} +/* +smth +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/InheritedWithCurrentFunctions.kt b/idea/testData/parameterInfo/functionParameterInfo/InheritedWithCurrentFunctions.kt new file mode 100644 index 00000000000..8d553f1ce4c --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/InheritedWithCurrentFunctions.kt @@ -0,0 +1,14 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean) = 2 +} + +class B(): A(5) { + fun m(x: Int, y: Boolean, z: String) { + m(1, false) + } +} +/* +Text: (x: Int, y: Boolean, z: String), Disabled: false, Strikeout: false, Green: false +smth +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/NamedAndDefaultParameter.kt b/idea/testData/parameterInfo/functionParameterInfo/NamedAndDefaultParameter.kt new file mode 100644 index 00000000000..af69b172479 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/NamedAndDefaultParameter.kt @@ -0,0 +1,12 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean = true, z: Long = 12345678901234) = 2 + + fun d(x: Int) { + m(y = false, x = 1) + } +} +/* +Text: ([x: Int]), Disabled: false, Strikeout: false, Green: false +Text: ([y: Boolean = true], [x: Int], [z: Long = 1234567...]), Disabled: false, Strikeout: false, Green: true +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/NamedParameter.kt b/idea/testData/parameterInfo/functionParameterInfo/NamedParameter.kt new file mode 100644 index 00000000000..682fb09d4e7 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/NamedParameter.kt @@ -0,0 +1,12 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean) = 2 + + fun d(x: Int) { + m(x = 1, y = false) + } +} +/* +Text: ([x: Int]), Disabled: true, Strikeout: false, Green: false +Text: ([x: Int], [y: Boolean]), Disabled: false, Strikeout: false, Green: true +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/NamedParameter2.kt b/idea/testData/parameterInfo/functionParameterInfo/NamedParameter2.kt new file mode 100644 index 00000000000..28aeba1cd81 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/NamedParameter2.kt @@ -0,0 +1,12 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean) = 2 + + fun d(x: Int) { + m(y = false, x = 1) + } +} +/* +Text: ([x: Int]), Disabled: false, Strikeout: false, Green: false +Text: ([y: Boolean], [x: Int]), Disabled: false, Strikeout: false, Green: true +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt b/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt new file mode 100644 index 00000000000..850ce1bcc85 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt @@ -0,0 +1,10 @@ +open class A(x: Int) { + fun m(x: Int, y: Boolean) = 2 + fun m(x: Int) = 1 + + fun d(x: Int) { + m(1, false, false) + } +} +/* +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/Println.kt b/idea/testData/parameterInfo/functionParameterInfo/Println.kt new file mode 100644 index 00000000000..ae4f653f6e5 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/Println.kt @@ -0,0 +1,14 @@ +open class A(x: Int) { + fun println(x: String) {} + fun println() {} + fun println(x: Boolean) {} + + fun d(x: Int) { + println() + } +} +/* +Text: (), Disabled: false, Strikeout: false, Green: true +Text: (x: Boolean), Disabled: false, Strikeout: false, Green: false +Text: (x: String), Disabled: false, Strikeout: false, Green: false +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/Simple.kt b/idea/testData/parameterInfo/functionParameterInfo/Simple.kt new file mode 100644 index 00000000000..99837866097 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/Simple.kt @@ -0,0 +1,8 @@ +open class A(x: Int) { + fun m(x: Int, y: Boolean) = 2 + + fun d(x: Int) { + m(1, false) + } +} +//Text: (x: Int, y: Boolean), Disabled: false, Strikeout: false, Green: true \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/SimpleConstructor.kt b/idea/testData/parameterInfo/functionParameterInfo/SimpleConstructor.kt new file mode 100644 index 00000000000..6ecc459bf25 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/SimpleConstructor.kt @@ -0,0 +1,9 @@ +open class A(x: Int) { +} + +class B(): A(5) { + fun m() { + A(3) + } +} +//Text: (x: Int), Disabled: false, Strikeout: false, Green: true \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/SuperConstructorCall.kt b/idea/testData/parameterInfo/functionParameterInfo/SuperConstructorCall.kt new file mode 100644 index 00000000000..194074c402a --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/SuperConstructorCall.kt @@ -0,0 +1,9 @@ +open class A(x: Int) { +} + +class B(): A(5) { + fun m() { + A(3) + } +} +//Text: (x: Int), Disabled: false, Strikeout: false, Green: true \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/TwoFunctions.kt b/idea/testData/parameterInfo/functionParameterInfo/TwoFunctions.kt new file mode 100644 index 00000000000..7aa8d4ebad3 --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/TwoFunctions.kt @@ -0,0 +1,12 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean) = 2 + + fun d(x: Int) { + m(1, false) + } +} +/* +Text: (x: Int), Disabled: false, Strikeout: false, Green: false +Text: (x: Int, y: Boolean), Disabled: false, Strikeout: false, Green: true +*/ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/TwoFunctionsGrey.kt b/idea/testData/parameterInfo/functionParameterInfo/TwoFunctionsGrey.kt new file mode 100644 index 00000000000..e18c637d38d --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/TwoFunctionsGrey.kt @@ -0,0 +1,12 @@ +open class A(x: Int) { + fun m(x: Int) = 1 + fun m(x: Int, y: Boolean) = 2 + + fun d(x: Int) { + m(1, false) + } +} +/* +Text: (x: Int), Disabled: true, Strikeout: false, Green: false +Text: (x: Int, y: Boolean), Disabled: false, Strikeout: false, Green: true +*/ \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java new file mode 100644 index 00000000000..17ef9da6bfc --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java @@ -0,0 +1,99 @@ +package org.jetbrains.jet.plugin.parameterInfo; + +import com.intellij.psi.PsiElement; +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetValueArgumentList; +import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.plugin.PluginTestCaseBase; + +/** + * User: Alexander Podkhalyuzin + * Date: 24.01.12 + */ +public class JetFunctionParameterInfoTest extends LightCodeInsightFixtureTestCase { + public void testInheritedFunctions() { + doTest(); + } + + public void testInheritedWithCurrentFunctions() { + doTest(); + } + + public void testNamedAndDefaultParameter() { + doTest(); + } + + public void testNamedParameter() { + doTest(); + } + + public void testNamedParameter2() { + doTest(); + } + + public void testNotGreen() { + doTest(); + } + + public void testPrintln() { + doTest(); + } + + public void testSimple() { + doTest(); + } + + public void testSimpleConstructor() { + doTest(); + } + + public void testSuperConstructorCall() { + doTest(); + } + + public void testTwoFunctions() { + doTest(); + } + + public void testTwoFunctionsGrey() { + doTest(); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(PluginTestCaseBase.getTestDataPathBase() + "/parameterInfo/functionParameterInfo"); + } + + private void doTest() { + myFixture.configureByFile(getTestName(false) + ".kt"); + final JetFile file = (JetFile) myFixture.getFile(); + PsiElement lastChild = file.getLastChild(); + assert lastChild != null; + String expectedResultText = null; + if (lastChild.getNode().getElementType().equals(JetTokens.BLOCK_COMMENT)) { + String lastChildText = lastChild.getText(); + expectedResultText = lastChildText.substring(2, lastChildText.length() - 2).trim(); + } else if (lastChild.getNode().getElementType().equals(JetTokens.EOL_COMMENT)) { + expectedResultText = lastChild.getText().substring(2).trim(); + } + assert expectedResultText != null; + JetFunctionParameterInfoHandler parameterInfoHandler = new JetFunctionParameterInfoHandler(); + MockCreateParameterInfoContext mockCreateParameterInfoContext = new MockCreateParameterInfoContext(file, myFixture); + final JetValueArgumentList parameterOwner = parameterInfoHandler.findElementForParameterInfo(mockCreateParameterInfoContext); + + final MockUpdateParameterInfoContext updateContext = new MockUpdateParameterInfoContext(file, myFixture); + + //to update current parameter index + parameterInfoHandler.findElementForUpdatingParameterInfo(updateContext); + + MockParameterInfoUIContext parameterInfoUIContext = + new MockParameterInfoUIContext(parameterOwner, updateContext.getCurrentParameter()); + + for (Object item : mockCreateParameterInfoContext.getItemsToShow()) { + parameterInfoHandler.updateUI(item, parameterInfoUIContext); + } + assertEquals(expectedResultText, parameterInfoUIContext.getResultText()); + } +} diff --git a/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockCreateParameterInfoContext.java b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockCreateParameterInfoContext.java new file mode 100644 index 00000000000..2b811689c68 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockCreateParameterInfoContext.java @@ -0,0 +1,77 @@ +package org.jetbrains.jet.plugin.parameterInfo; + +import com.intellij.lang.parameterInfo.CreateParameterInfoContext; +import com.intellij.lang.parameterInfo.ParameterInfoHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture; +import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.NotNull; + +/** + * User: Alexander Podkhalyuzin + * Date: 24.01.12 + */ +public class MockCreateParameterInfoContext implements CreateParameterInfoContext { + private Object[] myItemsToShow = ArrayUtil.EMPTY_OBJECT_ARRAY; + private PsiElement myHighlightedElement = null; + private JavaCodeInsightTestFixture myFixture; + private PsiFile myFile; + + MockCreateParameterInfoContext(PsiFile file, JavaCodeInsightTestFixture fixture) { + myFile = file; + myFixture = fixture; + } + + @Override + public Object[] getItemsToShow() { + return myItemsToShow; + } + + @Override + public void setItemsToShow(Object[] items) { + myItemsToShow = items; + } + + @Override + public void showHint(PsiElement element, int offset, ParameterInfoHandler handler) { + } + + @Override + public int getParameterListStart() { + return 0; + } + + @Override + public PsiElement getHighlightedElement() { + return myHighlightedElement; + } + + @Override + public void setHighlightedElement(PsiElement elements) { + myHighlightedElement = elements; + } + + @Override + public Project getProject() { + return myFixture.getProject(); + } + + @Override + public PsiFile getFile() { + return myFile; + } + + @Override + public int getOffset() { + return myFixture.getCaretOffset(); + } + + @NotNull + @Override + public Editor getEditor() { + return myFixture.getEditor(); + } +} diff --git a/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockParameterInfoUIContext.java b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockParameterInfoUIContext.java new file mode 100644 index 00000000000..147db73677b --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockParameterInfoUIContext.java @@ -0,0 +1,70 @@ +package org.jetbrains.jet.plugin.parameterInfo; + +import com.intellij.codeInsight.hint.HintUtil; +import com.intellij.lang.parameterInfo.ParameterInfoUIContext; +import com.intellij.psi.PsiElement; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +/** + * User: Alexander Podkhalyuzin + * Date: 24.01.12 + */ +public class MockParameterInfoUIContext implements ParameterInfoUIContext { + private PsiElement myParaeterOwner; + private int myCurrentParameterIndex; + + private ArrayList result = new ArrayList(); + + MockParameterInfoUIContext(PsiElement parameterOwner, int currentParameterIndex) { + myParaeterOwner = parameterOwner; + myCurrentParameterIndex = currentParameterIndex; + } + + @Override + public void setupUIComponentPresentation(String text, int highlightStartOffset, int highlightEndOffset, + boolean isDisabled, boolean strikeout, + boolean isDisabledBeforeHighlight, Color background) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("Text: (").append(text).append("), Disabled: ").append(isDisabled). + append(", Strikeout: ").append(strikeout).append(", Green: "). + append(background.equals(JetFunctionParameterInfoHandler.GREEN_BACKGROUND)); + result.add(stringBuilder.toString()); + } + + @Override + public boolean isUIComponentEnabled() { + return false; + } + + @Override + public void setUIComponentEnabled(boolean enabled) { + } + + @Override + public int getCurrentParameterIndex() { + return myCurrentParameterIndex; + } + + @Override + public PsiElement getParameterOwner() { + return myParaeterOwner; + } + + @Override + public Color getDefaultParameterColor() { + return HintUtil.INFORMATION_COLOR; + } + + public String getResultText() { + StringBuilder stringBuilder = new StringBuilder(); + Collections.sort(result); + for (String s : result) { + stringBuilder.append(s).append("\n"); + } + return stringBuilder.toString().trim(); + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockUpdateParameterInfoContext.java b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockUpdateParameterInfoContext.java new file mode 100644 index 00000000000..def27308e6f --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/MockUpdateParameterInfoContext.java @@ -0,0 +1,92 @@ +package org.jetbrains.jet.plugin.parameterInfo; + +import com.intellij.lang.parameterInfo.UpdateParameterInfoContext; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture; +import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.NotNull; + +/** + * User: Alexander Podkhalyuzin + * Date: 24.01.12 + */ +public class MockUpdateParameterInfoContext implements UpdateParameterInfoContext { + private int myCurrentParameter = -1; + private PsiFile myFile; + private JavaCodeInsightTestFixture myFixture; + + MockUpdateParameterInfoContext(PsiFile file, JavaCodeInsightTestFixture fixture) { + myFile = file; + myFixture = fixture; + } + + + @Override + public void removeHint() { + } + + @Override + public void setParameterOwner(PsiElement o) { + } + + @Override + public PsiElement getParameterOwner() { + return null; + } + + @Override + public void setHighlightedParameter(Object parameter) { + } + + @Override + public void setCurrentParameter(int index) { + myCurrentParameter = index; + } + + public int getCurrentParameter() { + return myCurrentParameter; + } + + @Override + public boolean isUIComponentEnabled(int index) { + return false; + } + + @Override + public void setUIComponentEnabled(int index, boolean b) { + } + + @Override + public int getParameterListStart() { + return 0; + } + + @Override + public Object[] getObjectsToView() { + return ArrayUtil.EMPTY_OBJECT_ARRAY; + } + + @Override + public Project getProject() { + return null; + } + + @Override + public PsiFile getFile() { + return myFile; + } + + @Override + public int getOffset() { + return myFixture.getCaretOffset(); + } + + @NotNull + @Override + public Editor getEditor() { + return myFixture.getEditor(); + } +}