blob: 5e0ab1eededc4b0c992040afc9641d8622822ea1 [file] [log] [blame]
package org.eclipse.dltk.itcl.internal.core.search.mixin;
import java.util.List;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.declarations.MethodDeclaration;
import org.eclipse.dltk.ast.declarations.TypeDeclaration;
import org.eclipse.dltk.ast.statements.Statement;
import org.eclipse.dltk.core.mixin.IMixinRequestor;
import org.eclipse.dltk.core.mixin.IMixinRequestor.ElementInfo;
import org.eclipse.dltk.itcl.internal.core.IIncrTclModifiers;
import org.eclipse.dltk.itcl.internal.core.parser.ast.IncrTclFieldDeclaration;
import org.eclipse.dltk.itcl.internal.core.parser.ast.IncrTclInstanceVariable;
import org.eclipse.dltk.itcl.internal.core.parser.ast.IncrTclMethodDeclaration;
import org.eclipse.dltk.itcl.internal.core.search.mixin.model.IncrTclClass;
import org.eclipse.dltk.itcl.internal.core.search.mixin.model.IncrTclClassInstance;
import org.eclipse.dltk.itcl.internal.core.search.mixin.model.IncrTclInstProc;
import org.eclipse.dltk.tcl.core.TclParseUtil;
import org.eclipse.dltk.tcl.core.ast.ExtendedTclMethodDeclaration;
import org.eclipse.dltk.tcl.core.extensions.IMixinBuildVisitorExtension;
import org.eclipse.dltk.tcl.internal.core.search.mixin.TclMixinBuildVisitor;
import org.eclipse.dltk.tcl.internal.core.search.mixin.model.TclField;
import org.eclipse.dltk.tcl.internal.core.search.mixin.model.TclProc;
public class IncrTclMixinBuildVisitorExtension implements IMixinBuildVisitorExtension {
@Override
public boolean visit(MethodDeclaration s, TclMixinBuildVisitor original) {
if (s instanceof IncrTclMethodDeclaration) {
this.visitIncrTclMethod(s, original);
return true;
}
return false;
}
private void visitIncrTclMethod(MethodDeclaration s, TclMixinBuildVisitor original) {
ExtendedTclMethodDeclaration method = (ExtendedTclMethodDeclaration) s;
ElementInfo info = new ElementInfo();
String name = s.getName();
ASTNode declaringType = method.getDeclaringType();
if (declaringType != null && declaringType instanceof TypeDeclaration) {
List<ASTNode> levels = TclParseUtil.findLevelsTo(original.getModuleDeclaration(), declaringType);
info.key = original.getKeyFromLevels(levels) + IMixinRequestor.MIXIN_NAME_SEPARATOR
+ original.tclNameToKey(name);
}
if (original.getSignature()) {
switch (method.getKind()) {
case ExtendedTclMethodDeclaration.KIND_INSTPROC:
info.object = new IncrTclInstProc();
break;
case ExtendedTclMethodDeclaration.KIND_PROC:
info.object = new TclProc();
break;
}
}
if (info.key != null) {
original.getRequestor().reportElement(info);
}
// System.out.println("Report proc or instproc:" + info.key);
}
@Override
public boolean visit(TypeDeclaration s, TclMixinBuildVisitor original) {
if ((s.getModifiers() & IIncrTclModifiers.AccIncrTcl) != 0) {
ElementInfo info = new ElementInfo();
info.key = original.getNamespacePrefix() + original.tclNameToKey(s.getName());
if (info.key.startsWith("{")) {
info.key = info.key.substring(1);
}
// System.out.println("Report Tcl namespace:" + info.key);
original.pushNamespaceName(s);
if (original.getSignature()) {
// if (s instanceof XOTclObjectDeclaration) {
// info.object = new IncrTclObject();
// } else {
IncrTclClass tclClass = new IncrTclClass();
info.object = tclClass;
tclClass.setNamespace(original.getNamespacePrefix());
// }
}
original.getRequestor().reportElement(info);
return true;
}
return false;
}
@Override
public boolean visit(Statement s, TclMixinBuildVisitor original) {
if (s instanceof IncrTclInstanceVariable) {
IncrTclInstanceVariable instanceVar = (IncrTclInstanceVariable) s;
List<ASTNode> levels = TclParseUtil.findLevelsTo(original.getModuleDeclaration(), instanceVar);
ElementInfo info = new ElementInfo();
info.key = original.getKeyFromLevels(levels);
if (original.getSignature()) {
info.object = new IncrTclClassInstance();
}
original.getRequestor().reportElement(info);
return true;
} else if (s instanceof IncrTclFieldDeclaration) {
IncrTclFieldDeclaration var = (IncrTclFieldDeclaration) s;
String name = var.getName();
TypeDeclaration type = var.getDeclaringType();
List<ASTNode> levels = TclParseUtil.findLevelsTo(original.getModuleDeclaration(), type);
ElementInfo info = new ElementInfo();
info.key = original.getKeyFromLevels(levels) + IMixinRequestor.MIXIN_NAME_SEPARATOR
+ original.tclNameToKey(name);
if (original.getSignature()) {
info.object = new TclField();
}
original.getRequestor().reportElement(info);
return true;
}
return false;
}
}