/*******************************************************************************
* Copyright (c) 2011 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.tooling.ast_actual;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import melnorme.lang.tooling.ast.ASTVisitor;
import dtool.ast.definitions.DefVarFragment;
import dtool.ast.definitions.DefinitionAlias.DefinitionAliasFragment;
import dtool.ast.definitions.DefinitionAliasFunctionDecl;
import dtool.ast.definitions.DefinitionAliasVarDecl;
import dtool.ast.definitions.DefinitionClass;
import dtool.ast.definitions.DefinitionConstructor;
import dtool.ast.definitions.DefinitionEnum;
import dtool.ast.definitions.DefinitionEnumVar.DefinitionEnumVarFragment;
import dtool.ast.definitions.DefinitionFunction;
import dtool.ast.definitions.DefinitionInterface;
import dtool.ast.definitions.DefinitionMixinInstance;
import dtool.ast.definitions.DefinitionStruct;
import dtool.ast.definitions.DefinitionTemplate;
import dtool.ast.definitions.DefinitionUnion;
import dtool.ast.definitions.DefinitionVariable;
import dtool.ast.definitions.EnumMember;
import dtool.ast.definitions.Module;
import dtool.ast.references.NamedReference;
public abstract class ASTSwitchVisitor extends ASTVisitor {
// NOTE: make sure preVisit code matches endVisit
@Override
public final boolean preVisit(ASTNode node) {
switch (node.getNodeType()) {
case MODULE:
return visit((Module) node);
case DEFINITION_VARIABLE:
case DEFINITION_AUTO_VARIABLE:
return visit((DefinitionVariable) node);
case DEFINITION_VAR_FRAGMENT:
return visit((DefVarFragment) node);
case DEFINITION_FUNCTION:
return visit((DefinitionFunction) node);
case DEFINITION_CONSTRUCTOR:
return visit((DefinitionConstructor) node);
case DEFINITION_STRUCT:
return visit((DefinitionStruct) node);
case DEFINITION_UNION:
return visit((DefinitionUnion) node);
case DEFINITION_CLASS:
return visit((DefinitionClass) node);
case DEFINITION_INTERFACE:
return visit((DefinitionInterface) node);
case DEFINITION_TEMPLATE:
return visit((DefinitionTemplate) node);
case DEFINITION_MIXIN_INSTANCE:
return visit((DefinitionMixinInstance) node);
case DEFINITION_ENUM_VAR_FRAGMENT:
return visit((DefinitionEnumVarFragment) node);
case DEFINITION_ENUM:
return visit((DefinitionEnum) node);
case ENUM_MEMBER:
return visit((EnumMember) node);
case DEFINITION_ALIAS_VAR_DECL:
return visit((DefinitionAliasVarDecl) node);
case DEFINITION_ALIAS_FRAGMENT:
return visit((DefinitionAliasFragment) node);
case DEFINITION_ALIAS_FUNCTION_DECL:
return visit((DefinitionAliasFunctionDecl) node);
case REF_IDENTIFIER:
case REF_IMPORT_SELECTION:
case REF_MODULE_QUALIFIED:
case REF_QUALIFIED:
case REF_PRIMITIVE:
case REF_MODULE:
return visit((NamedReference) node);
default:
assertTrue(!(node instanceof NamedReference));
return visitOther(node);
}
}
@Override
public final void postVisit(ASTNode node) {
switch (node.getNodeType()) {
case MODULE:
endVisit((Module) node); return;
case DEFINITION_VARIABLE:
case DEFINITION_AUTO_VARIABLE:
endVisit((DefinitionVariable) node); return;
case DEFINITION_VAR_FRAGMENT:
endVisit((DefVarFragment) node); return;
case DEFINITION_FUNCTION:
endVisit((DefinitionFunction) node); return;
case DEFINITION_CONSTRUCTOR:
endVisit((DefinitionConstructor) node); return;
case DEFINITION_STRUCT:
endVisit((DefinitionStruct) node); return;
case DEFINITION_UNION:
endVisit((DefinitionUnion) node); return;
case DEFINITION_CLASS:
endVisit((DefinitionClass) node); return;
case DEFINITION_INTERFACE:
endVisit((DefinitionInterface) node); return;
case DEFINITION_TEMPLATE:
endVisit((DefinitionTemplate) node); return;
case DEFINITION_MIXIN_INSTANCE:
endVisit((DefinitionMixinInstance) node); return;
case DEFINITION_ENUM_VAR_FRAGMENT:
endVisit((DefinitionEnumVarFragment) node); return;
case DEFINITION_ENUM:
endVisit((DefinitionEnum) node); return;
case ENUM_MEMBER:
endVisit((EnumMember) node); return;
case DEFINITION_ALIAS_VAR_DECL:
endVisit((DefinitionAliasVarDecl) node); return;
case DEFINITION_ALIAS_FRAGMENT:
endVisit((DefinitionAliasFragment) node); return;
case DEFINITION_ALIAS_FUNCTION_DECL:
endVisit((DefinitionAliasFunctionDecl) node); return;
default:
endVisitOther(node);
break;
}
}
public abstract boolean visitOther(ASTNode node);
public abstract void endVisitOther(ASTNode node);
public abstract boolean visit(Module node);
public abstract void endVisit(Module node);
public abstract boolean visit(DefinitionStruct node);
public abstract void endVisit(DefinitionStruct node);
public abstract boolean visit(DefinitionUnion node);
public abstract void endVisit(DefinitionUnion node);
public abstract boolean visit(DefinitionClass node);
public abstract void endVisit(DefinitionClass node);
public abstract boolean visit(DefinitionInterface node);
public abstract void endVisit(DefinitionInterface node);
public abstract boolean visit(DefinitionTemplate node);
public abstract void endVisit(DefinitionTemplate node);
public abstract boolean visit(DefinitionMixinInstance node);
public abstract void endVisit(DefinitionMixinInstance node);
public abstract boolean visit(DefinitionEnumVarFragment node);
public abstract void endVisit(DefinitionEnumVarFragment node);
public abstract boolean visit(DefinitionEnum node);
public abstract void endVisit(DefinitionEnum node);
public abstract boolean visit(EnumMember node);
public abstract void endVisit(EnumMember node);
public abstract boolean visit(DefinitionAliasVarDecl node);
public abstract void endVisit(DefinitionAliasVarDecl node);
public abstract boolean visit(DefinitionAliasFragment node);
public abstract void endVisit(DefinitionAliasFragment node);
public abstract boolean visit(DefinitionAliasFunctionDecl node);
public abstract void endVisit(DefinitionAliasFunctionDecl node);
/* ---------------------------------- */
public abstract boolean visit(DefinitionFunction node);
public abstract void endVisit(DefinitionFunction node);
public abstract boolean visit(DefinitionConstructor node);
public abstract void endVisit(DefinitionConstructor node);
/* ---------------------------------- */
public abstract boolean visit(DefinitionVariable node);
public abstract void endVisit(DefinitionVariable node);
public abstract boolean visit(DefVarFragment node);
public abstract void endVisit(DefVarFragment node);
/* ---------------------------------- */
public abstract boolean visit(NamedReference elem);
/* ========================================== */
public static abstract class ASTCommonSwitchVisitor extends ASTSwitchVisitor {
@Override public void endVisitOther(ASTNode node) { }
@Override public void endVisit(Module node) { }
@Override public void endVisit(DefinitionStruct node) {}
@Override public void endVisit(DefinitionUnion node) { }
@Override public void endVisit(DefinitionClass node) { }
@Override public void endVisit(DefinitionInterface node) { }
@Override public void endVisit(DefinitionTemplate node) { }
@Override public void endVisit(DefinitionMixinInstance node) { }
@Override public void endVisit(DefinitionEnumVarFragment node) { }
@Override public void endVisit(DefinitionEnum node) { }
@Override public void endVisit(EnumMember node) { }
@Override public void endVisit(DefinitionAliasVarDecl node) { }
@Override public void endVisit(DefinitionAliasFragment node) { }
@Override public void endVisit(DefinitionAliasFunctionDecl node) { }
@Override public void endVisit(DefinitionFunction node) { }
@Override public void endVisit(DefinitionConstructor node) { }
@Override public void endVisit(DefinitionVariable node) { }
@Override public void endVisit(DefVarFragment node) { }
}
}