diff --git a/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/after.groovy.template b/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/after.groovy.template
new file mode 100644
index 000000000000..07896cc93878
--- /dev/null
+++ b/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/after.groovy.template
@@ -0,0 +1,7 @@
+ class Foo {
+ def field
+
+ def Foo(def field) {
+ this.field = field
+ }
+ }
diff --git a/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/before.groovy.template b/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/before.groovy.template
new file mode 100644
index 000000000000..4e6acb3280a8
--- /dev/null
+++ b/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/before.groovy.template
@@ -0,0 +1,6 @@
+class Foo {
+ def field
+
+ def Foo() {
+ }
+}
diff --git a/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/description.html b/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/description.html
new file mode 100644
index 000000000000..4d855e8801ab
--- /dev/null
+++ b/plugins/groovy/resources/intentionDescriptions/CreateParameterForFieldIntention/description.html
@@ -0,0 +1,5 @@
+
+
+This intention adds parameter to constructor for uninitialized field
+
+
\ No newline at end of file
diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml
index c072abb2eb76..27d39350f39b 100644
--- a/plugins/groovy/src/META-INF/plugin.xml
+++ b/plugins/groovy/src/META-INF/plugin.xml
@@ -285,6 +285,11 @@
intention.category.groovy/intention.category.control.flow
org.jetbrains.plugins.groovy.intentions.control.DemorgansLawIntention
+
+ org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle
+ intention.category.groovy/intention.category.control.flow
+ org.jetbrains.plugins.groovy.intentions.control.CreateParameterForFieldIntention
+
org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle
intention.category.groovy/intention.category.control.flow
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties
index dcdce8ab3c5b..0108a6fd38e9 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties
@@ -85,4 +85,10 @@ map.param.name=Map parameter &name:
convert.param.to.map.entry=Convert parameter to map entry
convert.java.style.array.intention.name=Convert java-style array creation
-convert.java.style.array.intention.family.name=Convert Java-Style Array Creation to Groovy Syntax
\ No newline at end of file
+convert.java.style.array.intention.family.name=Convert Java-Style Array Creation to Groovy Syntax
+
+create.parameter.for.field.intention.name = Add constructor parameter for field
+create.parameter.for.field.intention.family.name = Add constructor parameter for field
+cannot.suggest.parameter.name=Cannot suggest parameter name
+create.parameter.for.field=Add parameter for field ''{0}''
+create.parameter.for.fields=Add parameter for field...
\ No newline at end of file
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/CreateParameterForFieldIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/CreateParameterForFieldIntention.java
new file mode 100644
index 000000000000..f746dc76991c
--- /dev/null
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/CreateParameterForFieldIntention.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.groovy.intentions.control;
+
+import com.intellij.ide.util.DefaultPsiElementCellRenderer;
+import com.intellij.ide.util.MethodCellRenderer;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.CommandProcessor;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.popup.PopupChooserBuilder;
+import com.intellij.openapi.util.Condition;
+import com.intellij.openapi.util.Ref;
+import com.intellij.psi.*;
+import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.intellij.psi.codeStyle.VariableKind;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.refactoring.changeSignature.JavaThrownExceptionInfo;
+import com.intellij.refactoring.changeSignature.ThrownExceptionInfo;
+import com.intellij.ui.components.JBList;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle;
+import org.jetbrains.plugins.groovy.intentions.base.Intention;
+import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate;
+import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory;
+import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
+import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
+import org.jetbrains.plugins.groovy.refactoring.DefaultGroovyVariableNameValidator;
+import org.jetbrains.plugins.groovy.refactoring.changeSignature.GrChangeInfoImpl;
+import org.jetbrains.plugins.groovy.refactoring.changeSignature.GrChangeSignatureProcessor;
+import org.jetbrains.plugins.groovy.refactoring.changeSignature.GrParameterInfo;
+
+import javax.swing.*;
+import java.util.*;
+
+/**
+ * @author Maxim.Medvedev
+ */
+public class CreateParameterForFieldIntention extends Intention {
+ private static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.intentions.control.CreateParameterForFieldIntention");
+
+ @NotNull
+ @Override
+ public String getText() {
+ return super.getText();
+ }
+
+ @Override
+ protected void processIntention(@NotNull PsiElement element, final Project project, final Editor editor)
+ throws IncorrectOperationException {
+ final List candidates = findFieldCandidates(element);
+ if (candidates != null) {
+ performForConstructor(element, project, editor, candidates);
+ }
+ else {
+ final List constructors = findConstructorCandidates(element);
+ performForField(element, project, editor, constructors);
+ }
+ }
+
+ private static void performForField(PsiElement element, final Project project, Editor editor, List constructors) {
+ final GrField field = PsiTreeUtil.getParentOfType(element, GrField.class);
+ if (constructors.size() == 0) return;
+
+ if (ApplicationManager.getApplication().isUnitTestMode()) {
+ for (GrMethod constructor : constructors) {
+ addParameter(field, constructor, project);
+ }
+ return;
+ }
+
+ final JList list = new JBList(constructors.toArray(new GrMethod[constructors.size()]));
+ list.setCellRenderer(new MethodCellRenderer(true));
+
+ new PopupChooserBuilder(list).setTitle(GroovyIntentionsBundle.message("create.parameter.for.field.intention.name")).
+ setMovable(true).
+ setItemChoosenCallback(new Runnable() {
+ public void run() {
+ final Object[] selectedValues = list.getSelectedValues();
+ Arrays.sort(selectedValues, new Comparator