/******************************************************************************* * Copyright (c) 2012 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 dtool.ast.definitions; import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue; import melnorme.lang.tooling.symbols.INamedElement; public enum EArcheType { Module, Package, Variable, Function, Constructor, //Native, Struct(true), Union(true), Class(true), Interface(true), Template, TypeParameter(true), Mixin, Tuple, //This probably should not be an archetype Enum(true), EnumMember, // Similar to Variable Alias, Error, ; protected final boolean isType; private EArcheType() { this(false); } private EArcheType(boolean isType) { this.isType = isType; } /** Archetype kind is TYPE, meaning it can be used to declare variables. */ public boolean isType() { return isType; } public boolean isError() { return this == Error; } public <T extends ArchetypeSwitchVisitor> T accept(INamedElement element, T visitor) { visitor.visit(element, this); return visitor; } /* ----------------- Visitor ----------------- */ public static class ArchetypeSwitchVisitor { public void visit(INamedElement element, EArcheType archetype) { assertTrue(element == null || element.getArcheType() == archetype); switch (archetype) { case Module: visitModule(element); break; case Variable: visitVariable(element); break; case EnumMember: visitEnumMember(element); break; case Function: visitFunction(element); break; case Constructor: visitConstructor(element); break; case Struct: visitStruct(element); break; case Union: visitUnion(element); break; case Class: visitClass(element); break; case Interface: visitInterface(element); break; case Template: visitTemplate(element); break; case Enum: visitEnumType(element); break; case Mixin: visitMixin(element); break; case Alias: visitAlias(element); break; case Error: visitError(element); break; case Tuple: visitTuple(element); break; case TypeParameter: visitType(element); break; case Package: visitPackage(element); break; } } @SuppressWarnings("unused") protected void visitModule(INamedElement element) { } @SuppressWarnings("unused") protected void visitVariable(INamedElement element) { } @SuppressWarnings("unused") protected void visitEnumMember(INamedElement element) { } @SuppressWarnings("unused") protected void visitFunction(INamedElement element) { } @SuppressWarnings("unused") protected void visitConstructor(INamedElement element) { } @SuppressWarnings("unused") protected void visitStruct(INamedElement element) { } @SuppressWarnings("unused") protected void visitUnion(INamedElement element) { } @SuppressWarnings("unused") protected void visitClass(INamedElement element) { } @SuppressWarnings("unused") protected void visitInterface(INamedElement element) { } @SuppressWarnings("unused") protected void visitTemplate(INamedElement element) { } @SuppressWarnings("unused") protected void visitEnumType(INamedElement node) { } @SuppressWarnings("unused") protected void visitMixin(INamedElement node) { } @SuppressWarnings("unused") protected void visitAlias(INamedElement node) { } @SuppressWarnings("unused") protected void visitPackage(INamedElement element) { } @SuppressWarnings("unused") protected void visitTuple(INamedElement element) { } @SuppressWarnings("unused") protected void visitType(INamedElement element) { } @SuppressWarnings("unused") protected void visitError(INamedElement element) { } } public static class ArchetypeCastVisitor extends ArchetypeSwitchVisitor { @Override protected void visitModule(INamedElement element) { doVisit((Module) element); } @SuppressWarnings("unused") public void doVisit(Module element) { } @Override protected void visitVariable(INamedElement element) { } @Override protected void visitEnumMember(INamedElement element) { } @Override protected void visitFunction(INamedElement element) { doVisit((DefinitionFunction) element); } @SuppressWarnings("unused") public void doVisit(DefinitionFunction element) { } @Override protected void visitConstructor(INamedElement element) { doVisit((DefinitionConstructor) element); } @SuppressWarnings("unused") public void doVisit(DefinitionConstructor element) { } @Override protected void visitStruct(INamedElement element) { } @Override protected void visitUnion(INamedElement element) { } @Override protected void visitClass(INamedElement element) { } @Override protected void visitInterface(INamedElement element) { } @Override protected void visitTemplate(INamedElement element) { } @Override protected void visitEnumType(INamedElement element) { doVisit((DefinitionEnum) element); } @SuppressWarnings("unused") public void doVisit(DefinitionEnum element) { } @Override protected void visitMixin(INamedElement node) { } @Override protected void visitAlias(INamedElement element) { } @Override protected void visitPackage(INamedElement element) { } @Override protected void visitTuple(INamedElement element) { } @Override protected void visitType(INamedElement element) { } @Override protected void visitError(INamedElement element) { } } }