/*******************************************************************************
* 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.index;
import org.eclipse.dltk.ast.Modifiers;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.SourceRange;
import org.eclipse.dltk.internal.core.ModelElement;
import org.eclipse.dltk.internal.core.SourceField;
import org.eclipse.dltk.internal.core.SourceType;
import org.eclipse.php.core.compiler.PHPFlags;
import org.eclipse.php.internal.core.index.IPHPDocAwareElement;
import org.eclipse.php.internal.core.index.PHPElementResolver;
import org.json.simple.JSONObject;
import com.dubture.symfony.core.log.Logger;
import com.dubture.symfony.core.model.ISymfonyModelElement;
import com.dubture.symfony.core.util.JsonUtils;
/**
*
* {@link SymfonyElementResolver} resolves {@link IModelElement}
* types from the H2 index with the Type {@link ISymfonyModelElement.TEMPLATE_VARIABLE}
*
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class SymfonyElementResolver extends PHPElementResolver {
@Override
public IModelElement resolve(int elementType, int flags, int offset,
int length, int nameOffset, int nameLength, String elementName,
String metadata, String doc, String qualifier, String parent,
ISourceModule sourceModule) {
// this is a Symfony2 element, try to resolve it
if (elementType == ISymfonyModelElement.TEMPLATE_VARIABLE) {
try {
String type = JsonUtils.getElementType(metadata);
if (type == null)
return null;
// we can only handle references at the moment
if (type.equals("reference")) {
JSONObject data = JsonUtils.getReferenceData(metadata);
String className = (String) data.get("elementName");
String q = (String) data.get("qualifier");
String viewPath = (String) data.get("viewPath");
String method = (String) data.get("method");
ModelElement parentElement = (ModelElement) sourceModule;
if (qualifier != null) {
parentElement = new ControllerType(parentElement, qualifier,
Modifiers.AccNameSpace, 0, 0, 0, 0, null, doc);
return new TemplateField(parentElement, elementName, q, className, viewPath, method);
}
} else if (type.equals("scalar")) {
JSONObject data = JsonUtils.getScalar(metadata);
String className = (String) data.get("elementName");
String viewPath = (String) data.get("viewPath");
String method = (String) data.get("method");
ModelElement parentElement = (ModelElement) sourceModule;
return new TemplateField(parentElement, elementName, null, className, viewPath, method);
}
} catch (Exception e) {
Logger.logException(e);
}
}
return super
.resolve(elementType, flags, offset, length, nameOffset, nameLength,
elementName, metadata, doc, qualifier, parent, sourceModule);
}
public static class TemplateField extends SourceField {
private String qualifier;
private String className;
private String viewPath;
private String method;
public TemplateField(ModelElement parent, String name, String qualifier, String className, String viewPath, String method) {
super(parent, name);
this.qualifier = qualifier;
this.className = className;
this.viewPath = viewPath;
this.method = method;
}
public String getQualifier() {
return qualifier;
}
public String getClassName() {
return className;
}
public String getViewPath() {
return viewPath;
}
public IMethod getMethod() {
return getSourceModule().getMethod(method);
}
public String getMethodName() {
return method;
}
}
private static class ControllerType extends SourceType implements
IPHPDocAwareElement {
private int flags;
private ISourceRange sourceRange;
private String[] superClassNames;
private String doc;
public ControllerType(ModelElement parent, String name, int flags,
int offset, int length, int nameOffset, int nameLength,
String[] superClassNames, String doc) {
super(parent, name);
this.flags = flags;
this.sourceRange = new SourceRange(offset, length);
new SourceRange(nameOffset, nameLength);
this.superClassNames = superClassNames;
this.doc = doc;
}
public int getFlags() throws ModelException {
return flags;
}
public ISourceRange getNameRange() throws ModelException {
return super.getNameRange();
}
public ISourceRange getSourceRange() throws ModelException {
return sourceRange;
}
public String[] getSuperClasses() throws ModelException {
return superClassNames;
}
public boolean isDeprecated() {
return PHPFlags.isDeprecated(flags);
}
public String[] getReturnTypes() {
return null;
}
}
}