//generated by abstract-syntax-gen
package de.peeeq.wurstscript.ast;
import java.util.*;

public interface ActionStatement extends Element, WStatement{
    void setSource(de.peeeq.wurstscript.parser.WPos source);
    de.peeeq.wurstscript.parser.WPos getSource();
    Element getParent();
    <T> T match(Matcher<T> s);
    void match(MatcherVoid s);
    public interface Matcher<T> {
        T case_StmtSet(StmtSet stmtSet);
        T case_ExprMemberMethodDot(ExprMemberMethodDot exprMemberMethodDot);
        T case_ExprMemberMethodDotDot(ExprMemberMethodDotDot exprMemberMethodDotDot);
        T case_ExprDestroy(ExprDestroy exprDestroy);
        T case_ExprVarAccess(ExprVarAccess exprVarAccess);
        T case_ExprMemberVarDot(ExprMemberVarDot exprMemberVarDot);
        T case_ExprFunctionCall(ExprFunctionCall exprFunctionCall);
        T case_ExprMemberVarDotDot(ExprMemberVarDotDot exprMemberVarDotDot);
        T case_StmtSkip(StmtSkip stmtSkip);
        T case_LocalVarDef(LocalVarDef localVarDef);
        T case_StmtErr(StmtErr stmtErr);
        T case_ExprNewObject(ExprNewObject exprNewObject);
    }

    public interface MatcherVoid {
        void case_StmtSet(StmtSet stmtSet);
        void case_ExprMemberMethodDot(ExprMemberMethodDot exprMemberMethodDot);
        void case_ExprMemberMethodDotDot(ExprMemberMethodDotDot exprMemberMethodDotDot);
        void case_ExprDestroy(ExprDestroy exprDestroy);
        void case_ExprVarAccess(ExprVarAccess exprVarAccess);
        void case_ExprMemberVarDot(ExprMemberVarDot exprMemberVarDot);
        void case_ExprFunctionCall(ExprFunctionCall exprFunctionCall);
        void case_ExprMemberVarDotDot(ExprMemberVarDotDot exprMemberVarDotDot);
        void case_StmtSkip(StmtSkip stmtSkip);
        void case_LocalVarDef(LocalVarDef localVarDef);
        void case_StmtErr(StmtErr stmtErr);
        void case_ExprNewObject(ExprNewObject exprNewObject);
    }

    ActionStatement copy();
    ActionStatement copyWithRefs();
    /** "returns all statements which can be executed after this statement"*/
    public abstract java.util.List<WStatement> attrNextStatements();
    /** "returns all statements which could have been executed before this statement"*/
    public abstract java.util.List<WStatement> attrPreviousStatements();
    /** "returns the index this statement has in the underlying list"*/
    public abstract int attrListIndex();
    /** */
    public abstract de.peeeq.immutablecollections.ImmutableList<NameDef> attrReadVariables();
    /** */
    public abstract boolean attrIsDynamicContext();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable PackageOrGlobal attrNearestPackage();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable NamedScope attrNearestNamedScope();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable WScope attrNearestScope();
    /** */
    public abstract String attrPathDescription();
    /** */
    public abstract CompilationUnit attrCompilationUnit();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable ClassDef attrNearestClassDef();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable ClassOrInterface attrNearestClassOrInterface();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable ClassOrModule attrNearestClassOrModule();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable StructureDef attrNearestStructureDef();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable FunctionImplementation attrNearestFuncDef();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable ExprClosure attrNearestExprClosure();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable ExprStatementsBlock attrNearestExprStatementsBlock();
    /** "returns the element itself if it is a NameDef or returns the referenced NameDef if the elem is a reference or returns null otherwise "*/
    public abstract @org.eclipse.jdt.annotation.Nullable NameDef tryGetNameDef();
    /** */
    public abstract de.peeeq.wurstscript.parser.WPos attrSource();
    /** "returns the position where errors are marked"*/
    public abstract de.peeeq.wurstscript.parser.WPos attrErrorPos();
    /** */
    public abstract WurstModel getModel();
    /** */
    public abstract de.peeeq.wurstscript.jassIm.ImStmt imTranslateStmt(de.peeeq.wurstscript.translation.imtranslation.ImTranslator translator, de.peeeq.wurstscript.jassIm.ImFunction f);
    /** */
    public abstract void addError(String msg);
    /** */
    public abstract void addWarning(String msg);
    /** */
    public abstract de.peeeq.wurstscript.attributes.ErrorHandler getErrorHandler();
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable TypeDef lookupType(String name, boolean showErrors);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.PackageLink lookupPackage(String name, boolean showErrors);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.NameLink lookupVar(String name, boolean showErrors);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.NameLink lookupVarNoConfig(String name, boolean showErrors);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.NameLink lookupMemberVar(de.peeeq.wurstscript.types.WurstType receiverType, String name, boolean showErrors);
    /** */
    public abstract com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupFuncs(String name, boolean showErrors);
    /** */
    public abstract com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupFuncsNoConfig(String name, boolean showErrors);
    /** */
    public abstract com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupMemberFuncs(de.peeeq.wurstscript.types.WurstType receiverType, String name, boolean showErrors);
    /** */
    public abstract @org.eclipse.jdt.annotation.Nullable TypeDef lookupType(String name);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.PackageLink lookupPackage(String name);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.NameLink lookupVar(String name);
    /** */
    public abstract de.peeeq.wurstscript.attributes.names.NameLink lookupMemberVar(de.peeeq.wurstscript.types.WurstType receiverType, String name);
    /** */
    public abstract com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupFuncs(String name);
    /** */
    public abstract com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupMemberFuncs(de.peeeq.wurstscript.types.WurstType receiverType, String name);
    /** */
    public abstract com.google.common.collect.ImmutableList<VarDef> attrUsedGlobalVariables();
    /** */
    public abstract com.google.common.collect.ImmutableList<VarDef> attrReadGlobalVariables();
    /** */
    public abstract com.google.common.collect.ImmutableCollection<WPackage> attrUsedPackages();
    /** */
    public abstract String description();
    /** */
    public abstract String descriptionHtml();
    /** */
    public abstract boolean isSubtreeOf(Element other);
    /** */
    public abstract void prettyPrint(de.peeeq.wurstscript.attributes.prettyPrint.Spacer spacer, StringBuilder sb, int indent);
}