field generation

This commit is contained in:
Maxim Medvedev
2011-05-24 12:17:09 +04:00
parent 49ce17fbe2
commit 4d6d881059
3 changed files with 47 additions and 4 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotationMemberValue;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrDefaultAnnotationValue;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
@@ -304,9 +305,44 @@ public class ClassItemGeneratorImpl implements ClassItemGenerator {
}
@Override
public void writeVariableDeclarations(StringBuilder builder, GrVariableDeclaration variableDeclaration) {
GenerationUtil.writeSimpleVarDeclaration(variableDeclaration, builder, context.extend());
builder.append('\n');
public void writeVariableDeclarations(StringBuilder mainBuilder, GrVariableDeclaration variableDeclaration) {
ExpressionContext extended = context.extend();
GrVariable[] variables = variableDeclaration.getVariables();
StringBuilder builder = new StringBuilder();
StringBuilder initBuilder = new StringBuilder("{\n");
for (GrVariable variable : variables) {
PsiType type = extended.typeProvider.getVarType(variable);
ModifierListGenerator.writeModifiers(builder, variable.getModifierList());
writeType(builder, type, variable);
builder.append(" ");
builder.append(variable.getName());
final GrExpression initializer = variable.getInitializerGroovy();
if (initializer != null) {
int count = extended.myStatements.size();
StringBuilder initializerBuilder = new StringBuilder();
initializer.accept(new ExpressionGenerator(initializerBuilder, extended));
if (extended.myStatements.size() == count) { //didn't use extra statements
builder.append(" = ").append(initializerBuilder);
}
else {
StringBuilder assignment = new StringBuilder(variable.getName()).append(" = ").append(initializerBuilder).append(';');
GenerationUtil.writeStatement(initBuilder, assignment, null, extended);
}
}
builder.append(";\n");
}
if (extended.myStatements.size()>0) {
initBuilder.append("}\n");
mainBuilder.append(initBuilder);
}
mainBuilder.append(builder);
}
@Override
@@ -376,7 +376,7 @@ public class GenerationUtil {
//Set<String> types = getVarTypes(variableDeclaration);
//if (types.size() > 1) {
if (variableDeclaration.getParent() instanceof GrControlStatement) {
if (variables.length > 1 && variableDeclaration.getParent() instanceof GrControlStatement) {
expressionContext.setInsertCurlyBrackets();
}
for (GrVariable variable : variables) {
@@ -28,6 +28,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall;
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.params.GrParameterList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement;
@@ -46,6 +47,7 @@ public class TypeProvider {
public TypeProvider() {
}
@SuppressWarnings({"MethodMayBeStatic"})
@NotNull
public PsiType getReturnType(PsiMethod method) {
if (method instanceof GrMethod) {
@@ -59,6 +61,7 @@ public class TypeProvider {
return TypesUtil.getJavaLangObject(method);
}
@SuppressWarnings({"MethodMayBeStatic"})
@NotNull
public PsiType getVarType(GrVariable variable) {
PsiType type = variable.getDeclaredType();
@@ -74,6 +77,10 @@ public class TypeProvider {
@NotNull
public PsiType getParameterType(PsiParameter parameter) {
if (!(parameter instanceof GrParameter)) {
PsiElement scope = parameter.getDeclarationScope();
if (scope instanceof GrAccessorMethod) {
return getVarType(((GrAccessorMethod)scope).getProperty());
}
return parameter.getType();
}
/*GrTypeElement typeElementGroovy = ((GrParameter)parameter).getTypeElementGroovy();