diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties
index d9dc3e9fb58..74c0d571179 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties
@@ -127,6 +127,9 @@ unused.function=Function ''{0}'' is never used
unused.property=Property ''{0}'' is never used
unused.type.parameter=Type parameter ''{0}'' is never used
+unused.receiver.parameter=Receiver parameter is never used
+unused.receiver.parameter.remove=Remove redundant receiver parameter
+
livetemplate.description.main=main() function
livetemplate.description.soutp=Prints function parameter names and values to System.out
livetemplate.description.iter=Iterate over elements of iterable (for-in loop)
diff --git a/idea/resources/inspectionDescriptions/UnusedReceiverParameter.html b/idea/resources/inspectionDescriptions/UnusedReceiverParameter.html
new file mode 100644
index 00000000000..f6a08820c4c
--- /dev/null
+++ b/idea/resources/inspectionDescriptions/UnusedReceiverParameter.html
@@ -0,0 +1,5 @@
+
+
+This inspection reports unused receiver parameter of extension functions and properties.
+
+
diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 553e3e85bb2..8ce262c555d 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -864,6 +864,13 @@
level="WARNING"
/>
+
+
+
+ unusedInProperty.kt
+ 1
+ light_idea_test_case
+
+ Unused receiver parameter
+ Receiver parameter is never used
+
+
+ unusedInFunction.kt
+ 1
+ light_idea_test_case
+
+ Unused receiver parameter
+ Receiver parameter is never used
+
+
+ irrelevantThisInFunction.kt
+ 1
+ light_idea_test_case
+
+ Unused receiver parameter
+ Receiver parameter is never used
+
+
+ irrelevantCallInFunction.kt
+ 1
+ light_idea_test_case
+
+ Unused receiver parameter
+ Receiver parameter is never used
+
+
diff --git a/idea/testData/inspections/unusedReceiverParameter/inspectionData/inspections.test b/idea/testData/inspections/unusedReceiverParameter/inspectionData/inspections.test
new file mode 100644
index 00000000000..b52677b6e0f
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/inspectionData/inspections.test
@@ -0,0 +1 @@
+// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.UnusedReceiverParameterInspection
diff --git a/idea/testData/inspections/unusedReceiverParameter/irrelevantCallInFunction.kt b/idea/testData/inspections/unusedReceiverParameter/irrelevantCallInFunction.kt
new file mode 100644
index 00000000000..6bb7a4ff209
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/irrelevantCallInFunction.kt
@@ -0,0 +1,5 @@
+fun String.foo() {
+ fun String.local() {
+ println(length())
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/inspections/unusedReceiverParameter/irrelevantThisInFunction.kt b/idea/testData/inspections/unusedReceiverParameter/irrelevantThisInFunction.kt
new file mode 100644
index 00000000000..4f0708c7c4d
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/irrelevantThisInFunction.kt
@@ -0,0 +1,5 @@
+fun Any.foo() {
+ fun Any.local() {
+ println(this)
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/inspections/unusedReceiverParameter/unusedButOverride.kt b/idea/testData/inspections/unusedReceiverParameter/unusedButOverride.kt
new file mode 100644
index 00000000000..d49759c28f7
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/unusedButOverride.kt
@@ -0,0 +1,11 @@
+open class Foo {
+ open fun Any.foo() {
+
+ }
+}
+
+class Bar: Foo() {
+ override fun Any.foo() {
+
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/inspections/unusedReceiverParameter/unusedInFunction.kt b/idea/testData/inspections/unusedReceiverParameter/unusedInFunction.kt
new file mode 100644
index 00000000000..9d34c4eac6a
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/unusedInFunction.kt
@@ -0,0 +1,3 @@
+fun String.foo() {
+ println()
+}
\ No newline at end of file
diff --git a/idea/testData/inspections/unusedReceiverParameter/unusedInProperty.kt b/idea/testData/inspections/unusedReceiverParameter/unusedInProperty.kt
new file mode 100644
index 00000000000..2f36c8f5a00
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/unusedInProperty.kt
@@ -0,0 +1,6 @@
+val String.something: Int
+ get() = 42
+
+fun main(args: Array) {
+ "".something
+}
\ No newline at end of file
diff --git a/idea/testData/inspections/unusedReceiverParameter/usedExplicitlyInFunction.kt b/idea/testData/inspections/unusedReceiverParameter/usedExplicitlyInFunction.kt
new file mode 100644
index 00000000000..3c0e210fcf6
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/usedExplicitlyInFunction.kt
@@ -0,0 +1,3 @@
+fun String.foo() {
+ println(this)
+}
\ No newline at end of file
diff --git a/idea/testData/inspections/unusedReceiverParameter/usedInProperty.kt b/idea/testData/inspections/unusedReceiverParameter/usedInProperty.kt
new file mode 100644
index 00000000000..29e39b87750
--- /dev/null
+++ b/idea/testData/inspections/unusedReceiverParameter/usedInProperty.kt
@@ -0,0 +1,6 @@
+val String.doubleLength: Int
+ get() = length() * 2
+
+fun main(args: Array) {
+ "".doubleLength
+}
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java
index 7dc4536cc67..c001d36975c 100644
--- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java
@@ -87,6 +87,12 @@ public class JetInspectionTestGenerated extends AbstractJetInspectionTest {
doTest(fileName);
}
+ @TestMetadata("unusedReceiverParameter/inspectionData/inspections.test")
+ public void testUnusedReceiverParameter_inspectionData_Inspections_test() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedReceiverParameter/inspectionData/inspections.test");
+ doTest(fileName);
+ }
+
@TestMetadata("unusedSymbol/class/inspectionData/inspections.test")
public void testUnusedSymbol_class_inspectionData_Inspections_test() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/class/inspectionData/inspections.test");