Merge remote-tracking branch 'origin/HEAD' into idea14

Conflicts:
	idea/tests/org/jetbrains/jet/plugin/compilerMessages/JetCompilerMessagingTest.java
	idea/tests/org/jetbrains/jet/plugin/compilerMessages/K2JSCompilerMessagingTest.java
This commit is contained in:
Nikolay Krasko
2014-06-26 16:46:09 +04:00
129 changed files with 1548 additions and 1110 deletions
@@ -366,6 +366,8 @@ usageType.super.type.qualifier = Super type qualifier
usageType.receiver = Receiver
usageType.selector = Selector
usageType.delegate = Delegate
usageType.packageDirective = Package directive
usageType.packageMemberAccess = Package member access
x.in.y={0} in {1}
x.implements.y={0} in {1} implements {2} in {3}.
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.psi.JetFunctionLiteral
import com.intellij.psi.tree.TokenSet
import org.jetbrains.jet.JetNodeTypes
import org.jetbrains.jet.lang.psi.JetLoopExpression
import org.jetbrains.jet.lexer.JetTokens
public class KotlinSmartEnterHandler: SmartEnterProcessorWithFixers() {
{
@@ -120,8 +121,11 @@ public class KotlinSmartEnterHandler: SmartEnterProcessorWithFixers() {
}
}
private fun PsiElement.isJetStatement() =
getParent() is JetBlockExpression || (getParent()?.getNode()?.getElementType() in BRANCH_CONTAINERS)
private fun PsiElement.isJetStatement() = when {
getParent() is JetBlockExpression && getNode()?.getElementType() !in BRACES -> true
getParent()?.getNode()?.getElementType() in BRANCH_CONTAINERS && this !is JetBlockExpression -> true
else -> false
}
class KotlinPlainEnterProcessor : SmartEnterProcessorWithFixers.FixEnterProcessor() {
private fun getControlStatementBlock(caret: Int, element: PsiElement): JetExpression? {
@@ -158,4 +162,5 @@ public class KotlinSmartEnterHandler: SmartEnterProcessorWithFixers() {
}
private val BRANCH_CONTAINERS = TokenSet.create(JetNodeTypes.THEN, JetNodeTypes.ELSE, JetNodeTypes.BODY)
private val BRACES = TokenSet.create(JetTokens.RBRACE, JetTokens.LBRACE)
private fun JetParameter.isInLambdaExpression() = this.getParent()?.getParent() is JetFunctionLiteral
@@ -43,8 +43,8 @@ public class KotlinDoWhileFixer : SmartEnterProcessorWithFixers.Fixer<KotlinSmar
return
}
else if (whileKeyword != null && body !is JetBlockExpression && body.startLine(doc) > stmt.startLine(doc)) {
doc.insertString(whileKeyword.range.start, "}")
doc.insertString(start + "do".length(), "{")
doc.insertString(whileKeyword.range.start - 1, "}")
return
}
@@ -17,12 +17,9 @@
package org.jetbrains.jet.plugin.findUsages
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.usages.UsageTarget
import com.intellij.usages.impl.rules.UsageType
import com.intellij.usages.impl.rules.UsageTypeProviderEx
import org.jetbrains.annotations.Nullable
import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.psi.psiUtil.*
@@ -30,9 +27,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
import org.jetbrains.jet.plugin.JetBundle
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragment
import org.jetbrains.jet.lang.resolve.DescriptorUtils
import com.intellij.psi.PsiPackage
public object JetUsageTypeProvider : UsageTypeProviderEx {
public override fun getUsageType(element: PsiElement?): UsageType? {
@@ -166,6 +162,14 @@ public object JetUsageTypeProvider : UsageTypeProviderEx {
}
}
fun getPackageUsageType(): UsageType? {
return when {
simpleName.getParentByType(javaClass<JetPackageDirective>()) != null -> JetUsageTypes.PACKAGE_DIRECTIVE
simpleName.getParentByType(javaClass<JetQualifiedExpression>()) != null -> JetUsageTypes.PACKAGE_MEMBER_ACCESS
else -> getClassUsageType()
}
}
val usageType = getCommonUsageType()
if (usageType != null) return usageType
@@ -181,7 +185,9 @@ public object JetUsageTypeProvider : UsageTypeProviderEx {
} else {
getClassUsageType()
}
is PackageViewDescriptor -> getClassUsageType()
is PackageViewDescriptor -> {
if (reference.getReference()?.resolve() is PsiPackage) getPackageUsageType() else getClassUsageType()
}
is VariableDescriptor -> getVariableUsageType()
is FunctionDescriptor -> getFunctionUsageType(descriptor)
else -> null
@@ -209,6 +215,10 @@ object JetUsageTypes {
val RECEIVER = UsageType(JetBundle.message("usageType.receiver"))
val DELEGATE = UsageType(JetBundle.message("usageType.delegate"))
// packages
val PACKAGE_DIRECTIVE = UsageType(JetBundle.message("usageType.packageDirective"))
val PACKAGE_MEMBER_ACCESS = UsageType(JetBundle.message("usageType.packageMemberAccess"))
// common usage types
val CALLABLE_REFERENCE = UsageType(JetBundle.message("usageType.callable.reference"))
}
@@ -43,11 +43,11 @@ trait Parameter {
val parameterTypeCandidates: List<JetType>
val receiverCandidate: Boolean
val nameForRef: String get() = mirrorVarName ?: name
fun copy(name: String, parameterType: JetType): Parameter
}
val Parameter.nameForRef: String get() = mirrorVarName ?: name
data class TypeParameter(
val originalDeclaration: JetTypeParameter,
val originalConstraints: List<JetTypeConstraint>
@@ -87,16 +87,10 @@ private fun List<Instruction>.getResultType(
options: ExtractionOptions): JetType {
fun instructionToType(instruction: Instruction): JetType? {
val expression = when (instruction) {
is ReturnValueInstruction -> {
is ReturnValueInstruction ->
(instruction.element as JetReturnExpression).getReturnedExpression()
}
is CallInstruction -> {
val callElement = instruction.resolvedCall.getCall().getCallElement() as? JetExpression
if (callElement is JetSimpleNameExpression) callElement.getParentByType(javaClass<JetExpression>(), true) else callElement
}
is ReadValueInstruction, is OperationInstruction -> {
(instruction as JetElementInstruction).element as? JetExpression
}
is InstructionWithValue ->
instruction.outputValue?.element as? JetExpression
else -> null
}
@@ -116,12 +116,12 @@ public class KotlinParameterTablePanel extends JPanel {
DefaultCellEditor defaultEditor = (DefaultCellEditor) myTable.getDefaultEditor(Object.class);
defaultEditor.setClickCountToStart(1);
myTable.setTableHeader(null);
myTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myTable.setCellSelectionEnabled(true);
TableColumn checkBoxColumn = myTable.getColumnModel().getColumn(MyTableModel.CHECKMARK_COLUMN);
TableUtil.setupCheckboxColumn(checkBoxColumn);
checkBoxColumn.setHeaderValue("");
checkBoxColumn.setCellRenderer(
new BooleanTableCellRenderer() {
@NotNull
@@ -136,7 +136,11 @@ public class KotlinParameterTablePanel extends JPanel {
}
);
myTable.getColumnModel().getColumn(MyTableModel.PARAMETER_TYPE_COLUMN).setCellRenderer(new DefaultTableCellRenderer() {
myTable.getColumnModel().getColumn(MyTableModel.PARAMETER_NAME_COLUMN).setHeaderValue("Name");
TableColumn parameterTypeColumn = myTable.getColumnModel().getColumn(MyTableModel.PARAMETER_TYPE_COLUMN);
parameterTypeColumn.setHeaderValue("Type");
parameterTypeColumn.setCellRenderer(new DefaultTableCellRenderer() {
private final JBComboBoxLabel myLabel = new JBComboBoxLabel();
@Override
@@ -149,14 +153,14 @@ public class KotlinParameterTablePanel extends JPanel {
myLabel.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
if (isSelected) {
myLabel.setSelectionIcon();
} else {
}
else {
myLabel.setRegularIcon();
}
return myLabel;
}
});
myTable.getColumnModel().getColumn(MyTableModel.PARAMETER_TYPE_COLUMN).setCellEditor(new AbstractTableCellEditor() {
parameterTypeColumn.setCellEditor(new AbstractTableCellEditor() {
final JBComboBoxTableCellEditorComponent myEditorComponent = new JBComboBoxTableCellEditorComponent();
@Override
@@ -461,6 +461,23 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase {
@Override
public void visitExpression(@NotNull JetExpression expression) {
if (PsiEquivalenceUtil.areElementsEquivalent(expression, actualExpression, null, new Comparator<PsiElement>() {
private boolean compareCalleesAndReceivers(@NotNull ResolvedCall<?> rc1, @NotNull ResolvedCall<?> rc2) {
if (rc1.getResultingDescriptor() != rc2.getResultingDescriptor() ||
rc1.getExplicitReceiverKind() != rc2.getExplicitReceiverKind()) return false;
switch (rc1.getExplicitReceiverKind()) {
case NO_EXPLICIT_RECEIVER:
return rc1.getReceiverArgument() == rc2.getReceiverArgument()
&& rc1.getThisObject() == rc2.getThisObject();
case RECEIVER_ARGUMENT:
return rc1.getThisObject() == rc2.getThisObject();
case THIS_OBJECT:
return rc1.getReceiverArgument() == rc2.getReceiverArgument();
default:
return true;
}
}
@Override
public int compare(@NotNull PsiElement element1, @NotNull PsiElement element2) {
if (element1.getNode().getElementType() == JetTokens.IDENTIFIER &&
@@ -472,12 +489,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase {
ResolvedCall<?> rc1 = bindingContext.get(BindingContext.RESOLVED_CALL, expr1);
ResolvedCall<?> rc2 = bindingContext.get(BindingContext.RESOLVED_CALL, expr2);
if (rc1 == null || rc2 == null) return rc1 == rc2 ? 0 : 1;
return rc1.getResultingDescriptor() == rc2.getResultingDescriptor()
&& rc1.getExplicitReceiverKind() == rc2.getExplicitReceiverKind()
&& rc1.getReceiverArgument() == rc2.getReceiverArgument()
&& rc1.getThisObject() == rc2.getThisObject() ? 0 : 1;
return (rc1 != null && rc2 != null) && compareCalleesAndReceivers(rc1, rc2) ? 0 : 1;
}
}
if (!element1.textMatches(element2)) {
@@ -0,0 +1,10 @@
// PSI_ELEMENT: com.intellij.psi.PsiPackage
// OPTIONS: usages
// FIND_BY_REF
package <caret>foo.bar
import foo.bar.X
class X
val x: foo.bar.X? = foo.bar.X()
@@ -0,0 +1,4 @@
Class/object property type (10: 8) val x: foo.bar.X? = foo.bar.X()
Package directive (4: 9) package foo.bar
Package member access (10: 21) val x: foo.bar.X? = foo.bar.X()
Usage in import (6: 8) import foo.bar.X
@@ -0,0 +1,12 @@
fun main(args: Array<String>) {
with(A()) {
println(<selection>prop</selection>)
println(prop)
}
}
class A {
val prop = 1
}
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
@@ -0,0 +1,13 @@
fun main(args: Array<String>) {
with(A()) {
val i = prop
println(i)
println(i)
}
}
class A {
val prop = 1
}
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
@@ -0,0 +1,4 @@
fun main(args: Array<String>) {
println(<selection>a1</selection>)
println(a2)
}
@@ -0,0 +1,5 @@
fun main(args: Array<String>) {
val a = a1
println(a)
println(a2)
}
@@ -0,0 +1,9 @@
fun main(args: Array<String>) {
val myA = A()
println(<selection>myA.prop</selection>)
println(myA.prop)
}
class A {
val prop = 1
}
@@ -0,0 +1,10 @@
fun main(args: Array<String>) {
val myA = A()
val i = myA.prop
println(i)
println(i)
}
class A {
val prop = 1
}
@@ -0,0 +1,12 @@
class Bar {
}
class Foo() {
fun Bar.invoke(): Int = 1
}
fun main(args: Array<String>) {
val f = Foo()
println(<selection>Bar().f()</selection>)
println(Bar().f())
}
@@ -0,0 +1,13 @@
class Bar {
}
class Foo() {
fun Bar.invoke(): Int = 1
}
fun main(args: Array<String>) {
val f = Foo()
val i = Bar().f()
println(i)
println(i)
}
@@ -21,6 +21,7 @@ import com.google.common.base.Joiner;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.Ordering;
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.find.FindManager;
import com.intellij.find.findUsages.*;
import com.intellij.find.impl.FindManagerImpl;
@@ -201,6 +202,13 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu
return new JavaVariableFindUsagesOptions(project);
}
},
JAVA_PACKAGE {
@NotNull
@Override
public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) {
return new JavaPackageFindUsagesOptions(project);
}
},
DEFAULT {
@NotNull
@Override
@@ -246,6 +254,9 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu
if (klass == PsiField.class) {
return JAVA_FIELD;
}
if (klass == PsiPackage.class) {
return JAVA_PACKAGE;
}
if (klass == JetTypeParameter.class) {
return DEFAULT;
}
@@ -301,7 +312,11 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu
}
myFixture.configureByFile(path);
T caretElement = PsiTreeUtil.getParentOfType(myFixture.getElementAtCaret(), caretElementClass, false);
PsiElement originalElement =
InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// FIND_BY_REF")
? TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED)
: myFixture.getElementAtCaret();
T caretElement = PsiTreeUtil.getParentOfType(originalElement, caretElementClass, false);
assertNotNull(String.format("Element with type '%s' wasn't found at caret position", caretElementClass), caretElement);
FindUsagesOptions options = parser != null ? parser.parse(mainFileText, getProject()) : null;
@@ -16,24 +16,21 @@
package org.jetbrains.jet.findUsages;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.io.File;
import java.util.regex.Pattern;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata;
import org.jetbrains.jet.findUsages.AbstractJetFindUsagesTest;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@InnerTestClasses({JetFindUsagesTestGenerated.Kotlin.class, JetFindUsagesTestGenerated.Java.class})
public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest {
@TestMetadata("idea/testData/findUsages/kotlin")
@InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindParameterUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindTypeParameterUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.FindWithStructuralGrouping.class, Kotlin.UnresolvedAnnotation.class})
@InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindPackageUsages.class, Kotlin.FindParameterUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindTypeParameterUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.FindWithStructuralGrouping.class, Kotlin.UnresolvedAnnotation.class})
public static class Kotlin extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInKotlin() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/findUsages/kotlin"), Pattern.compile("^(.+)\\.0\\.kt$"), true);
@@ -388,6 +385,19 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest {
}
@TestMetadata("idea/testData/findUsages/kotlin/findPackageUsages")
public static class FindPackageUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindPackageUsages() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/findUsages/kotlin/findPackageUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true);
}
@TestMetadata("kotlinPackageUsages.0.kt")
public void testKotlinPackageUsages() throws Exception {
doTest("idea/testData/findUsages/kotlin/findPackageUsages/kotlinPackageUsages.0.kt");
}
}
@TestMetadata("idea/testData/findUsages/kotlin/findParameterUsages")
public static class FindParameterUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindParameterUsages() throws Exception {
@@ -587,6 +597,7 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest {
suite.addTestSuite(FindClassUsages.class);
suite.addTestSuite(FindFunctionUsages.class);
suite.addTestSuite(FindObjectUsages.class);
suite.addTestSuite(FindPackageUsages.class);
suite.addTestSuite(FindParameterUsages.class);
suite.addTestSuite(FindPropertyUsages.class);
suite.addTestSuite(FindTypeParameterUsages.class);
@@ -677,8 +677,8 @@ class SmartEnterTest : JetLightCodeInsightFixtureTestCase() {
,
"""
do {
<caret>
} while (true)
<caret>
"""
)
@@ -747,6 +747,32 @@ class SmartEnterTest : JetLightCodeInsightFixtureTestCase() {
"""
)
fun testDoWhile13() = doFunTest(
"""
do<caret>
println("some")
"""
,
"""
do {
println("some")
} while (<caret>)
"""
)
fun testDoWhile14() = doFunTest(
"""
do <caret>
println("some")
"""
,
"""
do {
println("some")
} while (<caret>)
"""
)
fun testDoWhileOneLine1() = doFunTest(
"""
do println("some") while (true<caret>)
@@ -133,11 +133,26 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/noConflictWithInnerVariable.kt");
}
@TestMetadata("NoExplicitReceivers.kt")
public void testNoExplicitReceivers() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/NoExplicitReceivers.kt");
}
@TestMetadata("NoExplicitReceiversUnresolved.kt")
public void testNoExplicitReceiversUnresolved() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/NoExplicitReceiversUnresolved.kt");
}
@TestMetadata("nonEquivalentReceivers.kt")
public void testNonEquivalentReceivers() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/nonEquivalentReceivers.kt");
}
@TestMetadata("OneExplicitReceiver.kt")
public void testOneExplicitReceiver() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/OneExplicitReceiver.kt");
}
@TestMetadata("ReplaceOccurence.kt")
public void testReplaceOccurence() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/ReplaceOccurence.kt");
@@ -158,6 +173,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/StringInjection.kt");
}
@TestMetadata("TwoExplicitReceivers.kt")
public void testTwoExplicitReceivers() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/TwoExplicitReceivers.kt");
}
@TestMetadata("WhenAddBlock.kt")
public void testWhenAddBlock() throws Exception {
doIntroduceVariableTest("idea/testData/refactoring/introduceVariable/WhenAddBlock.kt");