package org.maziarz.yiiclipse.validate;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IModelElementVisitor;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.builder.IBuildContext;
import org.eclipse.dltk.core.builder.IBuildParticipant;
import org.eclipse.dltk.core.builder.ISourceLineTracker;
import org.eclipse.dltk.internal.core.ModelElement;
import org.eclipse.dltk.internal.core.SourceMethod;
import org.eclipse.dltk.internal.core.SourceModule;
import org.eclipse.dltk.internal.core.SourceType;
import org.eclipse.php.internal.core.ast.nodes.ASTNode;
import org.eclipse.php.internal.core.ast.nodes.ASTParser;
import org.eclipse.php.internal.core.ast.nodes.Expression;
import org.eclipse.php.internal.core.ast.nodes.MethodInvocation;
import org.eclipse.php.internal.core.ast.nodes.Program;
import org.eclipse.php.internal.core.ast.nodes.Scalar;
import org.eclipse.php.internal.core.ast.visitor.AbstractVisitor;
import org.maziarz.yiiclipse.utils.ASTUtils;
import org.maziarz.yiiclipse.utils.StringUtils;
import org.maziarz.yiiclipse.utils.YiiPathResolver;
public class YiiclipseBuildParticipant implements IBuildParticipant {
/*-
* TODO: do participants read from extension point
private final TclCheckInfo[] checks = ChecksExtensionManager...
*/
// private YiiclipseCheckInfo[] checks = new YiiclipseCheckInfo[];
public YiiclipseBuildParticipant(IScriptProject project) {
}
@Override
public void build(final IBuildContext context) throws CoreException {
final ISourceModule module = context.getSourceModule();
final ISourceLineTracker lineTracker = context.getLineTracker();
module.accept(new IModelElementVisitor() {
private ModelElement modelElement;
private ASTParser parser = ASTParser.newParser(module);
private Program p;
private IType currentType;
{
try {
p = parser.createAST(null);
} catch (Exception e) {}
}
@SuppressWarnings("restriction")
@Override
public boolean visit(IModelElement element) {
/*-
if (element instanceof ModelElement) {
modelElement = (ModelElement) element;
try {
IModelElement[] me = ((ModelElement)element).getChildren();
for (IModelElement e : me) {
System.out.println("Element: "+e.toString());
}
} catch (ModelException e) {
e.printStackTrace();
}
}
*/
if (element instanceof SourceModule) {
return true;
}
if (element instanceof SourceType) {
currentType = (SourceType)element;
return true;
}
if (element instanceof SourceMethod) {
SourceMethod sourceMethod = (SourceMethod) element;
try {
String name = element.getElementName();
ISourceRange range = sourceMethod.getNameRange();
if (name.startsWith("action")) {
ASTNode elementAt = p.getElementAt(range.getOffset());
ASTNode functionDeclaration = elementAt.getParent();
functionDeclaration.accept(new AbstractVisitor() {
public boolean visit(MethodInvocation mi) {
if (ASTUtils.isSimpleVariable(mi.getDispatcher(), "this", true)) {
if (ASTUtils.isSimpleVariable(mi.getMethod().getFunctionName().getName(), "render", false)) {
List<Expression> params = mi.getMethod().parameters();
if (params.size() > 0) {
if (params.get(0) instanceof Scalar) {
Scalar view = (Scalar)params.get(0);
String expectedViewName = StringUtils.stripQuotes(view.getStringValue());
String resolvedPath = YiiPathResolver.resolveViewPath(//
context.getSourceModule(), //
currentType.getElementName(),//
expectedViewName);
Path path = new Path(resolvedPath);
IResource findElement = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (findElement == null) {
context.getProblemReporter().reportProblem(//
new YiiclipseProblem("View file not found: "+path, //
view.getStart() + 1,//
view.getStart() + view.getLength() - 1, //
lineTracker.getLineOffset(view.getStart())
));
}
}
}
}
};
return false;
}
});
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
});
}
}