package com.dubture.composer.core.visitor;
import org.eclipse.dltk.ast.references.VariableReference;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.php.internal.core.compiler.ast.nodes.ArrayCreation;
import org.eclipse.php.internal.core.compiler.ast.nodes.ArrayElement;
import org.eclipse.php.internal.core.compiler.ast.nodes.InfixExpression;
import org.eclipse.php.internal.core.compiler.ast.nodes.Scalar;
import org.eclipse.php.internal.core.compiler.ast.visitor.PHPASTVisitor;
import com.dubture.composer.core.model.ModelAccess;
import com.dubture.getcomposer.core.collection.Psr;
import com.dubture.getcomposer.core.objects.Namespace;
@SuppressWarnings("restriction")
public class AutoloadVisitor extends PHPASTVisitor
{
protected ISourceModule source;
private NamespaceVisitor visitor;
public AutoloadVisitor(ISourceModule source)
{
this.source = source;
}
@Override
public boolean visit(ArrayCreation s) throws Exception
{
visitor = new NamespaceVisitor();
s.traverse(visitor);
Psr psr0 = visitor.getPsr0();
if (psr0.size() > 0) {
ModelAccess.getInstance().updatePsr0(psr0, source.getScriptProject());
}
return true;
}
public Psr getPsr0() {
if (visitor != null) {
return visitor.getPsr0();
}
return null;
}
protected class NamespaceVisitor extends PHPASTVisitor {
protected Psr psr0 = new Psr();
@Override
public boolean visit(ArrayElement element) throws Exception
{
if (!(element.getKey() instanceof Scalar)) {
return false;
}
if (element.getValue() instanceof InfixExpression) {
Scalar namespace = (Scalar) element.getKey();
Scalar path = (Scalar) ((InfixExpression) element.getValue()).getRight();
VariableReference reference = (VariableReference) ((InfixExpression) element.getValue()).getLeft();
extractPsr0(namespace, path, reference);
return false;
} else if(element.getValue() instanceof ArrayCreation) {
Scalar namespace = (Scalar) element.getKey();
ArrayCreation paths = (ArrayCreation) element.getValue();
for (ArrayElement elem : paths.getElements()) {
if (elem.getValue() instanceof InfixExpression) {
Scalar path = (Scalar) ((InfixExpression) elem.getValue()).getRight();
VariableReference reference = (VariableReference) ((InfixExpression) elem.getValue()).getLeft();
extractPsr0(namespace, path, reference);
}
return false;
}
}
return true;
}
protected void extractPsr0(Scalar namespace, Scalar path, VariableReference reference) {
String resourcePath = "";
if ("$baseDir".equals(reference.getName())) {
resourcePath = path.getValue().replace("'", "");
} else if ("$vendorDir".equals(reference.getName())) {
resourcePath = "vendor" + path.getValue().replace("'", "");
}
if (resourcePath.startsWith("/")) {
resourcePath = resourcePath.replaceFirst("/", "");
}
String ns = namespace.getValue().replace("'", "").replace("\\\\", "\\");
psr0.add(new Namespace(ns, resourcePath));
}
public Psr getPsr0()
{
return psr0;
}
}
}