diff --git a/idea/resources/liveTemplates/Kotlin.xml b/idea/resources/liveTemplates/Kotlin.xml
index 7cb5d003dba..942f2910b7d 100644
--- a/idea/resources/liveTemplates/Kotlin.xml
+++ b/idea/resources/liveTemplates/Kotlin.xml
@@ -28,4 +28,11 @@
+
+
+
+
+
+
diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 90dec7adb80..5403612d695 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -70,6 +70,7 @@
+
diff --git a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties
index b4604f59863..49d2317cc95 100644
--- a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties
+++ b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties
@@ -28,4 +28,6 @@ change.to.backing.field=Change reference to backing field
implement.members=Implement members
livetemplate.description.main=main() function
-macro.variable.of.type=kotlinVariableOfType(Type)
\ No newline at end of file
+livetemplate.description.soutp=Prints function parameter names and values to System.out
+macro.variable.of.type=kotlinVariableOfType(Type)
+macro.fun.parameters=functionParameters()
\ No newline at end of file
diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetFunctionParametersMacro.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetFunctionParametersMacro.java
new file mode 100644
index 00000000000..7f09e035419
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetFunctionParametersMacro.java
@@ -0,0 +1,59 @@
+package org.jetbrains.jet.plugin.liveTemplates.macro;
+
+import com.intellij.codeInsight.template.*;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.JetFunction;
+import org.jetbrains.jet.lang.psi.JetParameter;
+import org.jetbrains.jet.plugin.JetBundle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Evgeny Gerashchenko
+ * @since 1/30/12
+ */
+public class JetFunctionParametersMacro extends Macro {
+ public String getName() {
+ return "functionParameters";
+ }
+
+ public String getPresentableName() {
+ return JetBundle.message("macro.fun.parameters");
+ }
+
+ public Result calculateResult(@NotNull Expression[] params, final ExpressionContext context) {
+ Project project = context.getProject();
+ int templateStartOffset = context.getTemplateStartOffset();
+ final int offset = templateStartOffset > 0 ? context.getTemplateStartOffset() - 1 : context.getTemplateStartOffset();
+
+ PsiDocumentManager.getInstance(project).commitAllDocuments();
+
+ PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument());
+ if (file == null) return null;
+ PsiElement place = file.findElementAt(offset);
+ while (place != null){
+ if (place instanceof JetFunction) {
+ List result = new ArrayList();
+ for (JetParameter param : ((JetFunction) place).getValueParameters()) {
+ String name = param.getName();
+ assert name != null;
+ result.add(new TextResult(name));
+ }
+ return new ListResult(result);
+ }
+ place = place.getParent();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isAcceptableInContext(TemplateContextType context) {
+ return context instanceof JavaCodeContextType;
+ }
+
+}