package org.maziarz.yiiclipse.codegen;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.php.internal.core.ast.nodes.AST;
import org.eclipse.php.internal.core.ast.nodes.ArrayCreation;
import org.eclipse.php.internal.core.ast.nodes.ArrayElement;
import org.eclipse.php.internal.core.ast.nodes.Expression;
import org.eclipse.php.internal.core.ast.nodes.ExpressionStatement;
import org.eclipse.php.internal.core.ast.nodes.Program;
import org.eclipse.php.internal.core.ast.nodes.Scalar;
/**
* Translates Lists and HashMap object into relevant PHP array
* @author krma
*/
public class ArrayMapper {
private AST container;
public ArrayMapper(AST container) {
this.container = container;
}
public Expression convert(Object o){
return this.getMapper(o).convert(o);
}
public ArrayCreation getArray(Object object){
if (object instanceof Collection || object instanceof Map) {
Expression element = (getMapper(object)).convert(object);
return (ArrayCreation)element;
}
throw new RuntimeException("Object is not supported ("+object.getClass()+")");
}
public static String getArrayAsString(Object o){
PhpCodeGenerator generator = new PhpCodeGenerator();
Program program = generator.getProgram();
ArrayMapper am = new ArrayMapper(program.getAST());
Expression expr = am.getMapper(o).convert(o);
ExpressionStatement stmt = program.getAST().newExpressionStatement(expr);
program.statements().add(stmt);
return generator.emit().replace("\n", "");
}
public ObjectArrayMapper getMapper(Object o) {
if (o == null){
return null;
}
if (o instanceof List) {
return new CollectionArrayMapper(container);
} else
if (o instanceof Map) {
return new MapArrayMapper(container);
} else
if (o instanceof String) {
return new ScalarArrayMapper(container);
} else
if (o instanceof Integer) {
return new ScalarArrayMapper(container);
}
throw new RuntimeException("Unsupported object type ("+o.getClass()+")");
}
public static String s(String string){
return "'"+string+"'";
}
public static Map getMap(org.eclipse.php.internal.core.compiler.ast.nodes.ArrayCreation array){
Map map = new LinkedHashMap();
for (org.eclipse.php.internal.core.compiler.ast.nodes.ArrayElement el : array.getElements()){
if (el.getKey() != null) {
map.put(getStringValue(el.getKey()), getStringValue(el.getValue()));
} else {
map.put(getStringValue(el.getValue()), null);
}
}
return map;
}
protected static Object getStringValue(org.eclipse.dltk.ast.expressions.Expression expression){
if (expression instanceof org.eclipse.php.internal.core.compiler.ast.nodes.Scalar){
return ((org.eclipse.php.internal.core.compiler.ast.nodes.Scalar)expression).getValue();
} else if (expression instanceof org.eclipse.php.internal.core.compiler.ast.nodes.ArrayCreation){
return getMap((org.eclipse.php.internal.core.compiler.ast.nodes.ArrayCreation)expression);
}
return "<NONE>";
}
}