2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.refactoring
.introduceparameterobject
;
18 import com
.intellij
.openapi
.project
.Project
;
19 import com
.intellij
.openapi
.util
.text
.StringUtil
;
20 import com
.intellij
.psi
.*;
21 import com
.intellij
.psi
.codeStyle
.CodeStyleSettingsManager
;
22 import com
.intellij
.psi
.codeStyle
.JavaCodeStyleManager
;
23 import com
.intellij
.psi
.codeStyle
.VariableKind
;
24 import com
.intellij
.psi
.javadoc
.PsiDocComment
;
25 import org
.jetbrains
.annotations
.NonNls
;
27 import java
.util
.ArrayList
;
28 import java
.util
.Iterator
;
29 import java
.util
.List
;
31 class ParameterObjectBuilder
{
32 private String className
= null;
33 private String packageName
= null;
34 private final List
<ParameterSpec
> fields
= new ArrayList
<ParameterSpec
>(5);
35 private final List
<PsiTypeParameter
> typeParams
= new ArrayList
<PsiTypeParameter
>();
36 private Project myProject
;
37 private JavaCodeStyleManager myJavaCodeStyleManager
;
39 public void setClassName(String className
) {
40 this.className
= className
;
43 public void setPackageName(String packageName
) {
44 this.packageName
= packageName
;
47 public void addField(PsiParameter variable
, String name
, PsiType type
, boolean setterRequired
) {
48 final ParameterSpec field
= new ParameterSpec(variable
, name
, type
, setterRequired
);
52 public void setTypeArguments(List
<PsiTypeParameter
> typeParams
) {
53 this.typeParams
.clear();
54 this.typeParams
.addAll(typeParams
);
57 public void setProject(final Project project
) {
59 myJavaCodeStyleManager
= JavaCodeStyleManager
.getInstance(myProject
);
62 public String
buildBeanClass() {
63 @NonNls final StringBuffer out
= new StringBuffer(1024);
64 if (packageName
.length() > 0) out
.append("package " + packageName
+ ';');
66 out
.append("public class " + className
);
67 if (!typeParams
.isEmpty()) {
70 for (PsiTypeParameter typeParam
: typeParams
) {
74 out
.append(typeParam
.getText());
83 outputConstructor(out
);
87 return out
.toString();
90 private void outputSetters(StringBuffer out
) {
91 for (final ParameterSpec field
: fields
) {
92 outputSetter(field
, out
);
96 private void outputGetters(StringBuffer out
) {
97 for (final ParameterSpec field
: fields
) {
98 outputGetter(field
, out
);
102 private void outputFields(StringBuffer out
) {
103 for (final ParameterSpec field
: fields
) {
104 outputField(field
, out
);
108 private void outputSetter(ParameterSpec field
, @NonNls StringBuffer out
) {
109 if (!field
.isSetterRequired()) {
112 final PsiParameter parameter
= field
.getParameter();
113 final PsiType type
= field
.getType();
114 final String typeText
;
115 if (parameter
.isVarArgs()) {
116 typeText
= ((PsiArrayType
) type
).getComponentType().getCanonicalText() + "...";
118 typeText
= type
.getCanonicalText();
120 final String name
= calculateStrippedName(field
.getName());
121 final String capitalizedName
= StringUtil
.capitalize(name
);
122 final String parameterName
=
123 myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.PARAMETER
);
125 out
.append("\tpublic void set" + capitalizedName
+ '(');
126 outputAnnotationString(parameter
, out
);
127 out
.append(CodeStyleSettingsManager
.getSettings(myProject
).GENERATE_FINAL_PARAMETERS?
"final " : "");
128 out
.append(' ' +typeText
+ ' ' + parameterName
+ ")\n");
130 final String fieldName
= myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.FIELD
);
131 generateFieldAssignment(out
, parameterName
, fieldName
);
135 private static void generateFieldAssignment(final StringBuffer out
, final String parameterName
, final String fieldName
) {
136 if (fieldName
.equals(parameterName
)) {
137 out
.append("\t\tthis." + fieldName
+ " = " + parameterName
+ ";\n");
139 out
.append("\t\t" + fieldName
+ " = " + parameterName
+ ";\n");
144 private String
calculateStrippedName(String name
) {
145 return myJavaCodeStyleManager
.variableNameToPropertyName(name
, VariableKind
.PARAMETER
);
148 private void outputGetter(ParameterSpec field
, @NonNls StringBuffer out
) {
149 final PsiParameter parameter
= field
.getParameter();
150 final PsiType type
= field
.getType();
151 final String typeText
;
152 if (parameter
.isVarArgs()) {
153 typeText
= ((PsiArrayType
) type
).getComponentType().getCanonicalText() + "[]";
155 typeText
= type
.getCanonicalText();
157 final String name
= calculateStrippedName(field
.getName());
158 final String capitalizedName
= StringUtil
.capitalize(name
);
159 if (PsiType
.BOOLEAN
.equals(type
)) {
161 outputAnnotationString(parameter
, out
);
162 out
.append(" public "+ typeText
+ " is" + capitalizedName
+ "()\n");
165 outputAnnotationString(parameter
, out
);
166 out
.append(" public " +typeText
+ " get" + capitalizedName
+ "()\n");
169 final String fieldName
= myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.FIELD
);
170 out
.append("\t\treturn " + fieldName
+ ";\n");
174 private void outputConstructor(@NonNls StringBuffer out
) {
175 out
.append("\tpublic " + className
+ '(');
176 for (Iterator
<ParameterSpec
> iterator
= fields
.iterator(); iterator
.hasNext();) {
177 final ParameterSpec field
= iterator
.next();
178 final PsiParameter parameter
= field
.getParameter();
179 outputAnnotationString(parameter
, out
);
180 out
.append(CodeStyleSettingsManager
.getSettings(myProject
).GENERATE_FINAL_PARAMETERS ?
" final " : "");
182 final PsiType type
= field
.getType();
183 final String typeText
;
184 if (parameter
.isVarArgs()) {
185 typeText
= ((PsiArrayType
) type
).getComponentType().getCanonicalText() + "...";
187 typeText
= type
.getCanonicalText();
189 final String name
= calculateStrippedName(field
.getName());
190 final String parameterName
=
191 myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.PARAMETER
);
192 out
.append(' ' +typeText
+ ' ' + parameterName
);
193 if (iterator
.hasNext()) {
199 for (final ParameterSpec field
: fields
) {
200 final String name
= calculateStrippedName(field
.getName());
201 final String fieldName
= myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.FIELD
);
202 final String parameterName
=
203 myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.PARAMETER
);
204 generateFieldAssignment(out
, parameterName
, fieldName
);
209 private void outputField(ParameterSpec field
, StringBuffer out
) {
210 final PsiParameter parameter
= field
.getParameter();
211 final PsiDocComment docComment
= getJavadocForVariable(parameter
);
212 if (docComment
!= null) {
213 out
.append(docComment
.getText());
216 final PsiType type
= field
.getType();
217 final String typeText
;
218 if (parameter
.isVarArgs()) {
219 final PsiType componentType
= ((PsiArrayType
) type
).getComponentType();
220 typeText
= componentType
.getCanonicalText() + "[]";
222 typeText
= type
.getCanonicalText();
224 final String name
= calculateStrippedName(field
.getName());
225 @NonNls String modifierString
= "private ";
226 if (!field
.isSetterRequired()) {
227 modifierString
+= "final ";
229 outputAnnotationString(parameter
, out
);
230 out
.append('\t' + modifierString
+ typeText
+ ' ' + myJavaCodeStyleManager
.propertyNameToVariableName(name
, VariableKind
.FIELD
) + ";\n");
233 private void outputAnnotationString(PsiParameter parameter
, StringBuffer out
) {
234 final PsiModifierList modifierList
= parameter
.getModifierList();
235 final PsiAnnotation
[] annotations
= modifierList
.getAnnotations();
236 for (PsiAnnotation annotation
: annotations
) {
237 final PsiJavaCodeReferenceElement reference
= annotation
.getNameReferenceElement();
238 if (reference
== null) {
241 final PsiClass annotationClass
= (PsiClass
) reference
.resolve();
242 if (annotationClass
!= null) {
243 final PsiAnnotationParameterList parameterList
= annotation
.getParameterList();
244 final String annotationText
= '@' + annotationClass
.getQualifiedName() + parameterList
.getText();
245 out
.append(annotationText
);
250 private static PsiDocComment
getJavadocForVariable(PsiVariable variable
) {
251 final PsiElement
[] children
= variable
.getChildren();
252 for (PsiElement child
: children
) {
253 if (child
instanceof PsiDocComment
) {
254 return (PsiDocComment
) child
;