Skip to content

Commit

Permalink
FORGE-1097: Multiple fields are split into their own FieldDeclarations
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Aug 8, 2013
1 parent d0c783e commit 414d29f
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 120 deletions.
Expand Up @@ -15,9 +15,12 @@
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jface.text.Document;
import org.jboss.forge.parser.JavaParser;
import org.jboss.forge.parser.java.Field;
import org.jboss.forge.parser.java.FieldHolder;
import org.jboss.forge.parser.java.JavaClass;
import org.jboss.forge.parser.java.JavaSource;
import org.jboss.forge.parser.java.Member;
import org.jboss.forge.parser.java.Method;
Expand Down Expand Up @@ -56,9 +59,21 @@ public Field<O> addField()
@SuppressWarnings("unchecked")
public Field<O> addField(final String declaration)
{
Field<O> field = new FieldImpl<O>((O) this, declaration);
addField(field);
return field;
String stub = "public class Stub { " + declaration + " }";
JavaClass temp = (JavaClass) JavaParser.parse(stub);
List<Field<JavaClass>> fields = temp.getFields();
Field<O> result = null;
for (Field<JavaClass> stubField : fields)
{
Object variableDeclaration = stubField.getInternal();
Field<O> field = new FieldImpl<O>((O) this, variableDeclaration, true);
addField(field);
if (result == null)
{
result = field;
}
}
return result;
}

@SuppressWarnings("unchecked")
Expand All @@ -74,7 +89,7 @@ private void addField(Field<O> field)
}
idx++;
}
bodyDeclarations.add(idx, field.getInternal());
bodyDeclarations.add(idx, ((VariableDeclarationFragment) field.getInternal()).getParent());
}

@Override
Expand All @@ -99,7 +114,12 @@ public List<Field<O>> getFields()
{
if (bodyDeclaration instanceof FieldDeclaration)
{
result.add(new FieldImpl<O>((O) this, bodyDeclaration));
FieldDeclaration fieldDeclaration = (FieldDeclaration) bodyDeclaration;
List<VariableDeclarationFragment> fragments = fieldDeclaration.fragments();
for (VariableDeclarationFragment fragment : fragments)
{
result.add(new FieldImpl<O>((O) this, fragment));
}
}
}

Expand Down Expand Up @@ -142,7 +162,32 @@ public boolean hasField(final Field<O> field)
@SuppressWarnings("unchecked")
public O removeField(final Field<O> field)
{
getBodyDeclaration().bodyDeclarations().remove(field.getInternal());
VariableDeclarationFragment fragment = (VariableDeclarationFragment) field.getInternal();
Iterator<Object> declarationsIterator = getBodyDeclaration().bodyDeclarations().iterator();
while (declarationsIterator.hasNext())
{
Object next = declarationsIterator.next();
if (next instanceof FieldDeclaration)
{
FieldDeclaration declaration = (FieldDeclaration) next;
if (declaration.equals(fragment.getParent()))
{
List<VariableDeclarationFragment> fragments = declaration.fragments();
if (fragments.contains(fragment))
{
if (fragments.size() == 1)
{
declarationsIterator.remove();
}
else
{
fragments.remove(fragment);
}
break;
}
}
}
}
return (O) this;
}

Expand Down
Expand Up @@ -20,12 +20,15 @@
import org.eclipse.jdt.core.dom.EnumConstantDeclaration;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jface.text.Document;
import org.jboss.forge.parser.JavaParser;
import org.jboss.forge.parser.java.Annotation;
import org.jboss.forge.parser.java.EnumConstant;
import org.jboss.forge.parser.java.EnumConstant.Body;
import org.jboss.forge.parser.java.Field;
import org.jboss.forge.parser.java.Import;
import org.jboss.forge.parser.java.JavaClass;
import org.jboss.forge.parser.java.JavaEnum;
import org.jboss.forge.parser.java.JavaSource;
import org.jboss.forge.parser.java.Member;
Expand All @@ -34,7 +37,6 @@
import org.jboss.forge.parser.java.SourceType;
import org.jboss.forge.parser.java.SyntaxError;
import org.jboss.forge.parser.java.Visibility;
import org.jboss.forge.parser.java.EnumConstant.Body;
import org.jboss.forge.parser.java.ast.MethodFinderVisitor;
import org.jboss.forge.parser.java.ast.TypeDeclarationFinderVisitor;
import org.jboss.forge.parser.java.util.Strings;
Expand Down Expand Up @@ -480,9 +482,21 @@ public Field<Body> addField()
@Override
public Field<Body> addField(final String declaration)
{
Field<Body> field = new FieldImpl<Body>(this, declaration);
addField(field);
return field;
String stub = "public class Stub { " + declaration + " }";
JavaClass temp = (JavaClass) JavaParser.parse(stub);
List<Field<JavaClass>> fields = temp.getFields();
Field<Body> result = null;
for (Field<JavaClass> stubField : fields)
{
Object variableDeclaration = stubField.getInternal();
Field<Body> field = new FieldImpl<Body>(this, variableDeclaration, true);
addField(field);
if (result == null)
{
result = field;
}
}
return result;
}

@SuppressWarnings("unchecked")
Expand All @@ -498,7 +512,7 @@ private void addField(Field<Body> field)
}
idx++;
}
bodyDeclarations.add(idx, (BodyDeclaration) field.getInternal());
bodyDeclarations.add(idx, (BodyDeclaration) ((VariableDeclarationFragment) field.getInternal()).getParent());
}

@Override
Expand All @@ -512,10 +526,14 @@ public List<Field<Body>> getFields()
{
if (bodyDeclaration instanceof FieldDeclaration)
{
result.add(new FieldImpl<Body>(this, bodyDeclaration));
FieldDeclaration fieldDeclaration = (FieldDeclaration) bodyDeclaration;
List<VariableDeclarationFragment> fragments = fieldDeclaration.fragments();
for (VariableDeclarationFragment fragment : fragments)
{
result.add(new FieldImpl<Body>(this, fragment));
}
}
}

return Collections.unmodifiableList(result);
}

Expand Down Expand Up @@ -551,10 +569,36 @@ public boolean hasField(final Field<Body> field)
return getFields().contains(field);
}

@SuppressWarnings("unchecked")
@Override
public Body removeField(final Field<Body> field)
{
getBody().bodyDeclarations().remove(field.getInternal());
VariableDeclarationFragment fragment = (VariableDeclarationFragment) field.getInternal();
Iterator<Object> declarationsIterator = getBody().bodyDeclarations().iterator();
while (declarationsIterator.hasNext())
{
Object next = declarationsIterator.next();
if (next instanceof FieldDeclaration)
{
FieldDeclaration declaration = (FieldDeclaration) next;
if (declaration.equals(fragment.getParent()))
{
List<VariableDeclarationFragment> fragments = declaration.fragments();
if (fragments.contains(fragment))
{
if (fragments.size() == 1)
{
declarationsIterator.remove();
}
else
{
fragments.remove(fragment);
}
break;
}
}
}
}
return this;
}

Expand Down

0 comments on commit 414d29f

Please sign in to comment.