/*******************************************************************************
* This file is part of the Symfony eclipse plugin.
*
* (c) Robert Gruendler <r.gruendler@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
******************************************************************************/
package com.dubture.symfony.core.compiler;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.ast.declarations.MethodDeclaration;
import org.eclipse.dltk.ast.declarations.TypeDeclaration;
import org.eclipse.dltk.ast.expressions.Expression;
import org.eclipse.dltk.ast.expressions.MethodCallExpression;
import org.eclipse.dltk.ast.expressions.StringLiteral;
import org.eclipse.dltk.ast.statements.Statement;
import org.eclipse.dltk.compiler.env.IModuleSource;
import org.eclipse.php.core.compiler.PHPSourceElementRequestorExtension;
import org.eclipse.php.internal.core.Logger;
import org.eclipse.php.core.compiler.ast.nodes.ClassDeclaration;
import org.eclipse.php.core.compiler.ast.nodes.FullyQualifiedReference;
import org.eclipse.php.core.compiler.ast.nodes.PHPMethodDeclaration;
import com.dubture.symfony.core.builder.SymfonyNature;
import com.dubture.symfony.core.model.Service;
import com.dubture.symfony.core.model.SymfonyModelAccess;
import com.dubture.symfony.core.preferences.SymfonyCoreConstants;
import com.dubture.symfony.core.util.PathUtils;
/**
*
*
*
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class SourceElementRequestor extends PHPSourceElementRequestorExtension {
private ClassDeclaration currentClass;
private boolean inController;
private SymfonyModelAccess model = SymfonyModelAccess.getDefault();
private boolean isSymfonySource;
@Override
public void setSourceModule(IModuleSource sourceModule) {
super.setSourceModule(sourceModule);
try {
isSymfonySource = sourceModule.getModelElement().getScriptProject().getProject().exists() && sourceModule.getModelElement().getScriptProject().getProject().getNature(SymfonyNature.NATURE_ID) != null;
} catch (CoreException e) {
isSymfonySource = false;
Logger.logException(e);
}
}
public boolean isInController() {
return inController;
}
@Override
public boolean visit(TypeDeclaration s) throws Exception {
if (!isSymfonySource)
return false;
if (s instanceof ClassDeclaration) {
currentClass = (ClassDeclaration) s;
for (Object o : currentClass.getSuperClasses().getChilds()) {
if (o instanceof FullyQualifiedReference) {
FullyQualifiedReference superReference = (FullyQualifiedReference) o;
//TODO: find a way to check against the FQCN
// via the UseStatement
if (/*superReference.getNamespace().equals(SymfonyCoreConstants.CONTROLLER_NS)
&& */superReference.getName().equals(SymfonyCoreConstants.CONTROLLER_CLASS)) {
// the ControllerIndexer does the actual work of parsing the
// the relevant elements inside the controller
// which are then being collected in the endVisit() method
inController = true;
}
}
}
}
return true;
}
@Override
public boolean visit(Statement st) throws Exception {
return true;
}
@Override
public boolean visit(Expression st) throws Exception {
if (!isSymfonySource)
return false;
if (st instanceof StringLiteral) {
StringLiteral literal = (StringLiteral) st;
String literalValue = literal.getValue().replaceAll("['\"]", "");
if (PathUtils.isViewPath(literalValue)) {
//TODO: report viewpath reference
}
// IPath path = getSourceModule().getModelElement().getScriptProject().getPath();
// Service service = model.findService(literalValue, path);
// if (service != null) {
// fRequestor.acceptTypeReference(service.getFullyQualifiedName(), literal.sourceStart());
// }
}
return true;
}
@Override
public boolean visit(MethodDeclaration s) throws Exception {
if (s instanceof PHPMethodDeclaration) {
}
return true;
}
@Override
public boolean endvisit(TypeDeclaration s) throws Exception {
if (currentClass != null) {
}
inController = false;
currentClass = null;
return true;
}
}