package org.eclipse.dltk.xotcl.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.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.xotcl.core.IXOTclModifiers; import org.eclipse.dltk.xotcl.core.ast.xotcl.XOTclFieldDeclaration; import org.eclipse.dltk.xotcl.core.ast.xotcl.XOTclInstanceVariable; import org.eclipse.dltk.xotcl.core.ast.xotcl.XOTclMethodDeclaration; import org.eclipse.dltk.xotcl.core.ast.xotcl.XOTclObjectDeclaration; import org.eclipse.dltk.xotcl.internal.core.search.mixin.model.XOTclClass; import org.eclipse.dltk.xotcl.internal.core.search.mixin.model.XOTclClassInstance; import org.eclipse.dltk.xotcl.internal.core.search.mixin.model.XOTclInstProc; import org.eclipse.dltk.xotcl.internal.core.search.mixin.model.XOTclObject; import org.eclipse.dltk.xotcl.internal.core.search.mixin.model.XOTclProc; public class XOTclMixinBuildVisitorExtension implements IMixinBuildVisitorExtension { public boolean visit(MethodDeclaration s, TclMixinBuildVisitor original) { if (s instanceof XOTclMethodDeclaration) { this.visitXOTclMethod(s, original); return true; } return false; } private void visitXOTclMethod(MethodDeclaration s, TclMixinBuildVisitor original) { ExtendedTclMethodDeclaration method = (ExtendedTclMethodDeclaration) s; ElementInfo info = new ElementInfo(); String name = s.getName(); ASTNode declaringXOTclType = method.getDeclaringType(); if (declaringXOTclType != null && declaringXOTclType instanceof TypeDeclaration) { List levels = TclParseUtil.findLevelsTo(original.getModuleDeclaration(), declaringXOTclType); 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 XOTclInstProc(); break; case ExtendedTclMethodDeclaration.KIND_PROC: info.object = new XOTclProc(); break; } } original.getRequestor().reportElement(info); // System.out.println("Report proc or instproc:" + info.key); } public boolean visit(TypeDeclaration s, TclMixinBuildVisitor original) { if ((s.getModifiers() & IXOTclModifiers.AccXOTcl) != 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 XOTclObject(); } else { XOTclClass tclClass = new XOTclClass(); info.object = tclClass; tclClass.setNamespace(original.getNamespacePrefix()); } } original.getRequestor().reportElement(info); return true; } return false; } public boolean visit(Statement s, TclMixinBuildVisitor original) { if (s instanceof XOTclInstanceVariable) { XOTclInstanceVariable instanceVar = (XOTclInstanceVariable) s; List levels = TclParseUtil.findLevelsTo(original.getModuleDeclaration(), instanceVar); ElementInfo info = new ElementInfo(); info.key = original.getKeyFromLevels(levels); if (original.getSignature()) { info.object = new XOTclClassInstance(); } original.getRequestor().reportElement(info); return true; } else if (s instanceof XOTclFieldDeclaration) { XOTclFieldDeclaration var = (XOTclFieldDeclaration) s; String name = var.getName(); TypeDeclaration type = var.getDeclaringType(); List 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; } }