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

public interface HasModifier extends Element{
    void setSource(de.peeeq.wurstscript.parser.WPos source);
    de.peeeq.wurstscript.parser.WPos getSource();
    void setModifiers(Modifiers modifiers);
    Modifiers getModifiers();
    Element getParent();
    <T> T match(Matcher<T> s);
    void match(MatcherVoid s);
    public interface Matcher<T> {
        T case_WParameter(WParameter wParameter);
        T case_TupleDef(TupleDef tupleDef);
        T case_GlobalVarDef(GlobalVarDef globalVarDef);
        T case_NativeFunc(NativeFunc nativeFunc);
        T case_WShortParameter(WShortParameter wShortParameter);
        T case_FuncDef(FuncDef funcDef);
        T case_TypeParamDef(TypeParamDef typeParamDef);
        T case_NativeType(NativeType nativeType);
        T case_EnumDef(EnumDef enumDef);
        T case_ModuleInstanciation(ModuleInstanciation moduleInstanciation);
        T case_ConstructorDef(ConstructorDef constructorDef);
        T case_InterfaceDef(InterfaceDef interfaceDef);
        T case_EnumMember(EnumMember enumMember);
        T case_ModuleDef(ModuleDef moduleDef);
        T case_ExtensionFuncDef(ExtensionFuncDef extensionFuncDef);
        T case_ClassDef(ClassDef classDef);
        T case_WPackage(WPackage wPackage);
        T case_LocalVarDef(LocalVarDef localVarDef);
    }

    public interface MatcherVoid {
        void case_WParameter(WParameter wParameter);
        void case_TupleDef(TupleDef tupleDef);
        void case_GlobalVarDef(GlobalVarDef globalVarDef);
        void case_NativeFunc(NativeFunc nativeFunc);
        void case_WShortParameter(WShortParameter wShortParameter);
        void case_FuncDef(FuncDef funcDef);
        void case_TypeParamDef(TypeParamDef typeParamDef);
        void case_NativeType(NativeType nativeType);
        void case_EnumDef(EnumDef enumDef);
        void case_ModuleInstanciation(ModuleInstanciation moduleInstanciation);
        void case_ConstructorDef(ConstructorDef constructorDef);
        void case_InterfaceDef(InterfaceDef interfaceDef);
        void case_EnumMember(EnumMember enumMember);
        void case_ModuleDef(ModuleDef moduleDef);
        void case_ExtensionFuncDef(ExtensionFuncDef extensionFuncDef);
        void case_ClassDef(ClassDef classDef);
        void case_WPackage(WPackage wPackage);
        void case_LocalVarDef(LocalVarDef localVarDef);
    }

    HasModifier copy();
    HasModifier copyWithRefs();
    /** */
    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 boolean attrIsCompiletime();
    /** */
    public abstract boolean attrHasAnnotation(String name);
    /** */
    public abstract Annotation attrGetAnnotation(String name);
    /** */
    public abstract boolean attrIsPublic();
    /** */
    public abstract boolean attrIsPublicRead();
    /** */
    public abstract boolean attrIsPrivate();
    /** */
    public abstract boolean attrIsProtected();
    /** */
    public abstract boolean attrIsStatic();
    /** */
    public abstract boolean attrIsOverride();
    /** */
    public abstract boolean attrIsAbstract();
    /** */
    public abstract boolean attrIsConstant();
    /** */
    public abstract boolean attrIsVararg();
    /** */
    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 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.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);
}