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

@SuppressWarnings({"cast", "unused", "rawtypes"})
class ExprMemberMethodDotDotImpl implements ExprMemberMethodDotDot{
    ExprMemberMethodDotDotImpl(de.peeeq.wurstscript.parser.WPos source, Expr left, Identifier funcNameId, TypeExprList typeArgs, Arguments args) {
        if (source == null)
            throw new IllegalArgumentException("Element source must not be null.");
        if (left == null)
            throw new IllegalArgumentException("Element left must not be null.");
        if (funcNameId == null)
            throw new IllegalArgumentException("Element funcNameId must not be null.");
        if (typeArgs == null)
            throw new IllegalArgumentException("Element typeArgs must not be null.");
        if (args == null)
            throw new IllegalArgumentException("Element args must not be null.");
        this.source = source;
        this.left = left;
        this.funcNameId = funcNameId;
        this.typeArgs = typeArgs;
        this.args = args;
        left.setParent(this);
        funcNameId.setParent(this);
        typeArgs.setParent(this);
        args.setParent(this);
    }

    private Element parent;
    public Element getParent() { return parent; }
    public void setParent(Element parent) {
        if (parent != null && this.parent != null) {
            throw new Error("Cannot change parent of element " + this.getClass().getSimpleName() + ", as it is already used in another tree."
                + "Use the copy method to create a new tree or remove the tree from its old parent or set the parent to null before moving the tree. ");
        }
        this.parent = parent;
    }

    public void replaceBy(Element other) {
        if (parent == null)
            throw new RuntimeException("Node not attached to tree.");
        for (int i=0; i<parent.size(); i++) {
            if (parent.get(i) == this) {
                parent.set(i, other);
                return;
            }
        }
    }

    private de.peeeq.wurstscript.parser.WPos source;
    public void setSource(de.peeeq.wurstscript.parser.WPos source) {
        if (source == null) throw new IllegalArgumentException();
        this.source = source;
    } 
    public de.peeeq.wurstscript.parser.WPos getSource() { return source; }

    private Expr left;
    public void setLeft(Expr left) {
        if (left == null) throw new IllegalArgumentException();
        this.left.setParent(null);
        left.setParent(this);
        this.left = left;
    } 
    public Expr getLeft() { return left; }

    private Identifier funcNameId;
    public void setFuncNameId(Identifier funcNameId) {
        if (funcNameId == null) throw new IllegalArgumentException();
        this.funcNameId.setParent(null);
        funcNameId.setParent(this);
        this.funcNameId = funcNameId;
    } 
    public Identifier getFuncNameId() { return funcNameId; }

    private TypeExprList typeArgs;
    public void setTypeArgs(TypeExprList typeArgs) {
        if (typeArgs == null) throw new IllegalArgumentException();
        this.typeArgs.setParent(null);
        typeArgs.setParent(this);
        this.typeArgs = typeArgs;
    } 
    public TypeExprList getTypeArgs() { return typeArgs; }

    private Arguments args;
    public void setArgs(Arguments args) {
        if (args == null) throw new IllegalArgumentException();
        this.args.setParent(null);
        args.setParent(this);
        this.args = args;
    } 
    public Arguments getArgs() { return args; }

    public Element get(int i) {
        switch (i) {
            case 0: return left;
            case 1: return funcNameId;
            case 2: return typeArgs;
            case 3: return args;
            default: throw new IllegalArgumentException("Index out of range: " + i);
        }
    }
    public Element set(int i, Element newElem) {
        Element oldElem;
        switch (i) {
            case 0: oldElem = left; setLeft((Expr) newElem); return oldElem;
            case 1: oldElem = funcNameId; setFuncNameId((Identifier) newElem); return oldElem;
            case 2: oldElem = typeArgs; setTypeArgs((TypeExprList) newElem); return oldElem;
            case 3: oldElem = args; setArgs((Arguments) newElem); return oldElem;
            default: throw new IllegalArgumentException("Index out of range: " + i);
        }
    }

    @Override
    public void forEachElement(java.util.function.Consumer<? super Element> action) {
        action.accept(this.left);
        action.accept(this.funcNameId);
        action.accept(this.typeArgs);
        action.accept(this.args);
    }
    public int size() {
        return 4;
    }
    @Override public ExprMemberMethodDotDot copy() {
        ExprMemberMethodDotDot result = new ExprMemberMethodDotDotImpl(source, (Expr) this.left.copy(), (Identifier) this.funcNameId.copy(), (TypeExprList) this.typeArgs.copy(), (Arguments) this.args.copy());
        return result;
    }

    @Override public ExprMemberMethodDotDot copyWithRefs() {
        ExprMemberMethodDotDot res = copy();
        return res;
    }

    @Override public void clearAttributes() {
        left.clearAttributes();
        funcNameId.clearAttributes();
        typeArgs.clearAttributes();
        args.clearAttributes();
        clearAttributesLocal();
    }
    @Override public void clearAttributesLocal() {
        zzattr_attrNextStatements_state = 0;
        zzattr_attrPreviousStatements_state = 0;
        zzattr_attrListIndex_state = 0;
        zzattr_attrReadVariables_state = 0;
        zzattr_attrTyp_state = 0;
        zzattr_attrConstantValue_state = 0;
        zzattr_attrTypRaw_state = 0;
        zzattr_attrExpectedTypRaw_state = 0;
        zzattr_attrExpectedTyp_state = 0;
        zzattr_attrImplicitParameter_state = 0;
        zzattr_attrPossibleFunctionSignatures_state = 0;
        zzattr_attrFunctionSignature_state = 0;
        zzattr_attrCallSignature_state = 0;
        zzattr_attrPossibleFuncDefs_state = 0;
        zzattr_attrFuncLink_state = 0;
        zzattr_attrUsedGlobalVariables_state = 0;
        zzattr_attrReadGlobalVariables_state = 0;
    }
    @Override public void accept(Visitor v) {
        v.visit(this);
    }
    @Override public <T> T match(ActionStatement.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(ActionStatement.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(VarInitialization.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(VarInitialization.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(AstElementWithFuncName.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(AstElementWithFuncName.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(HasReadVariables.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(HasReadVariables.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(HasTypeArgs.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(HasTypeArgs.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(ExprMemberMethod.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(ExprMemberMethod.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(OptExpr.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(OptExpr.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(Expr.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(Expr.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(HasReceiver.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(HasReceiver.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(AstElementWithSource.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(AstElementWithSource.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(ExprMember.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(ExprMember.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(WStatement.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(WStatement.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(AstElementWithTypeArgs.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(AstElementWithTypeArgs.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(FuncRef.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(FuncRef.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(Element.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(Element.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(StmtCall.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(StmtCall.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(AstElementWithArgs.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(AstElementWithArgs.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(ExprOrStatements.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(ExprOrStatements.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public <T> T match(FunctionCall.Matcher<T> matcher) {
        return matcher.case_ExprMemberMethodDotDot(this);
    }
    @Override public void match(FunctionCall.MatcherVoid matcher) {
        matcher.case_ExprMemberMethodDotDot(this);
    }

    @Override public String toString() {
        return "ExprMemberMethodDotDot(" + source + ", " +left + ", " +funcNameId + ", " +typeArgs + ", " +args+")";
    }
    public boolean structuralEquals(Element e) {
        if (e instanceof ExprMemberMethodDotDot) {
            ExprMemberMethodDotDot o = (ExprMemberMethodDotDot) e;
            return this.left.structuralEquals(o.getLeft())
                && this.funcNameId.structuralEquals(o.getFuncNameId())
                && this.typeArgs.structuralEquals(o.getTypeArgs())
                && this.args.structuralEquals(o.getArgs());
        } else {
            return false;
        }
    }
// circular = null
    private int zzattr_attrNextStatements_state = 0;
    private java.util.List<WStatement> zzattr_attrNextStatements_cache;
    /** "returns all statements which can be executed after this statement"*/
    public java.util.List<WStatement> attrNextStatements() {
        if (zzattr_attrNextStatements_state == 0) {
            try {
                zzattr_attrNextStatements_state = 1;
                zzattr_attrNextStatements_cache = de.peeeq.wurstscript.attributes.Flow.getNext((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrNextStatements_state = 0;
            }
            zzattr_attrNextStatements_state = 2;
        } else if (zzattr_attrNextStatements_state == 1) {
            throw new CyclicDependencyError(this, "attrNextStatements");
        }
        return zzattr_attrNextStatements_cache;
    }
// circular = null
    private int zzattr_attrPreviousStatements_state = 0;
    private java.util.List<WStatement> zzattr_attrPreviousStatements_cache;
    /** "returns all statements which could have been executed before this statement"*/
    public java.util.List<WStatement> attrPreviousStatements() {
        if (zzattr_attrPreviousStatements_state == 0) {
            try {
                zzattr_attrPreviousStatements_state = 1;
                zzattr_attrPreviousStatements_cache = de.peeeq.wurstscript.attributes.Flow.getPrevious((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrPreviousStatements_state = 0;
            }
            zzattr_attrPreviousStatements_state = 2;
        } else if (zzattr_attrPreviousStatements_state == 1) {
            throw new CyclicDependencyError(this, "attrPreviousStatements");
        }
        return zzattr_attrPreviousStatements_cache;
    }
// circular = null
    private int zzattr_attrListIndex_state = 0;
    private int zzattr_attrListIndex_cache;
    /** "returns the index this statement has in the underlying list"*/
    public int attrListIndex() {
        if (zzattr_attrListIndex_state == 0) {
            try {
                zzattr_attrListIndex_state = 1;
                zzattr_attrListIndex_cache = de.peeeq.wurstscript.attributes.Flow.getListIndex((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrListIndex_state = 0;
            }
            zzattr_attrListIndex_state = 2;
        } else if (zzattr_attrListIndex_state == 1) {
            throw new CyclicDependencyError(this, "attrListIndex");
        }
        return zzattr_attrListIndex_cache;
    }
// circular = null
    private int zzattr_attrReadVariables_state = 0;
    private de.peeeq.immutablecollections.ImmutableList<NameDef> zzattr_attrReadVariables_cache;
    /** */
    public de.peeeq.immutablecollections.ImmutableList<NameDef> attrReadVariables() {
        if (zzattr_attrReadVariables_state == 0) {
            try {
                zzattr_attrReadVariables_state = 1;
                zzattr_attrReadVariables_cache = de.peeeq.wurstscript.attributes.ReadVariables.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrReadVariables_state = 0;
            }
            zzattr_attrReadVariables_state = 2;
        } else if (zzattr_attrReadVariables_state == 1) {
            throw new CyclicDependencyError(this, "attrReadVariables");
        }
        return zzattr_attrReadVariables_cache;
    }
// circular = null
    private int zzattr_attrTyp_state = 0;
    private de.peeeq.wurstscript.types.WurstType zzattr_attrTyp_cache;
    /** */
    public de.peeeq.wurstscript.types.WurstType attrTyp() {
        if (zzattr_attrTyp_state == 0) {
            try {
                zzattr_attrTyp_state = 1;
                zzattr_attrTyp_cache = de.peeeq.wurstscript.attributes.AttrExprType.normalizedType((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrTyp_state = 0;
            }
            zzattr_attrTyp_state = 2;
        } else if (zzattr_attrTyp_state == 1) {
            throw new CyclicDependencyError(this, "attrTyp");
        }
        return zzattr_attrTyp_cache;
    }
// circular = null
    private int zzattr_attrConstantValue_state = 0;
    private de.peeeq.wurstscript.intermediatelang.ILconst zzattr_attrConstantValue_cache;
    /** */
    public de.peeeq.wurstscript.intermediatelang.ILconst attrConstantValue() {
        if (zzattr_attrConstantValue_state == 0) {
            try {
                zzattr_attrConstantValue_state = 1;
                zzattr_attrConstantValue_cache = de.peeeq.wurstscript.attributes.AttrConstantValue.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrConstantValue_state = 0;
            }
            zzattr_attrConstantValue_state = 2;
        } else if (zzattr_attrConstantValue_state == 1) {
            throw new CyclicDependencyError(this, "attrConstantValue");
        }
        return zzattr_attrConstantValue_cache;
    }
// circular = null
    private int zzattr_attrTypRaw_state = 0;
    private de.peeeq.wurstscript.types.WurstType zzattr_attrTypRaw_cache;
    /** */
    public de.peeeq.wurstscript.types.WurstType attrTypRaw() {
        if (zzattr_attrTypRaw_state == 0) {
            try {
                zzattr_attrTypRaw_state = 1;
                zzattr_attrTypRaw_cache = de.peeeq.wurstscript.attributes.AttrExprType.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrTypRaw_state = 0;
            }
            zzattr_attrTypRaw_state = 2;
        } else if (zzattr_attrTypRaw_state == 1) {
            throw new CyclicDependencyError(this, "attrTypRaw");
        }
        return zzattr_attrTypRaw_cache;
    }
// circular = null
    private int zzattr_attrExpectedTypRaw_state = 0;
    private de.peeeq.wurstscript.types.WurstType zzattr_attrExpectedTypRaw_cache;
    /** */
    public de.peeeq.wurstscript.types.WurstType attrExpectedTypRaw() {
        if (zzattr_attrExpectedTypRaw_state == 0) {
            try {
                zzattr_attrExpectedTypRaw_state = 1;
                zzattr_attrExpectedTypRaw_cache = de.peeeq.wurstscript.attributes.AttrExprExpectedType.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrExpectedTypRaw_state = 0;
            }
            zzattr_attrExpectedTypRaw_state = 2;
        } else if (zzattr_attrExpectedTypRaw_state == 1) {
            throw new CyclicDependencyError(this, "attrExpectedTypRaw");
        }
        return zzattr_attrExpectedTypRaw_cache;
    }
// circular = null
    private int zzattr_attrExpectedTyp_state = 0;
    private de.peeeq.wurstscript.types.WurstType zzattr_attrExpectedTyp_cache;
    /** "try to guess what type is expected here"*/
    public de.peeeq.wurstscript.types.WurstType attrExpectedTyp() {
        if (zzattr_attrExpectedTyp_state == 0) {
            try {
                zzattr_attrExpectedTyp_state = 1;
                zzattr_attrExpectedTyp_cache = de.peeeq.wurstscript.attributes.AttrExprExpectedType.normalizedType((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrExpectedTyp_state = 0;
            }
            zzattr_attrExpectedTyp_state = 2;
        } else if (zzattr_attrExpectedTyp_state == 1) {
            throw new CyclicDependencyError(this, "attrExpectedTyp");
        }
        return zzattr_attrExpectedTyp_cache;
    }
    /** "more precise expected type, after overloading"*/
    public de.peeeq.wurstscript.types.WurstType attrExpectedTypAfterOverloading() {
        return de.peeeq.wurstscript.attributes.AttrExprExpectedType.afterOverloading((ExprMemberMethodDotDot)this);
    }
// circular = null
    private int zzattr_attrImplicitParameter_state = 0;
    private OptExpr zzattr_attrImplicitParameter_cache;
    /** */
    public OptExpr attrImplicitParameter() {
        if (zzattr_attrImplicitParameter_state == 0) {
            try {
                zzattr_attrImplicitParameter_state = 1;
                zzattr_attrImplicitParameter_cache = de.peeeq.wurstscript.attributes.AttrImplicitParameter.getImplicitParameter((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrImplicitParameter_state = 0;
            }
            zzattr_attrImplicitParameter_state = 2;
        } else if (zzattr_attrImplicitParameter_state == 1) {
            throw new CyclicDependencyError(this, "attrImplicitParameter");
        }
        return zzattr_attrImplicitParameter_cache;
    }
    /** */
    public boolean attrIsDynamicContext() {
        return de.peeeq.wurstscript.attributes.IsDynamicContext.calculate((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable PackageOrGlobal attrNearestPackage() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestPackage((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable NamedScope attrNearestNamedScope() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestNamedScope((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable WScope attrNearestScope() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestScope((ExprMemberMethodDotDot)this);
    }
    /** */
    public String attrPathDescription() {
        return de.peeeq.wurstscript.attributes.PathDescription.get((ExprMemberMethodDotDot)this);
    }
    /** */
    public CompilationUnit attrCompilationUnit() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestCompilationUnit((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable ClassDef attrNearestClassDef() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestClassDef((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable ClassOrInterface attrNearestClassOrInterface() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestClassOrInterface((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable ClassOrModule attrNearestClassOrModule() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestClassOrModule((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable StructureDef attrNearestStructureDef() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestStructureDef((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable FunctionImplementation attrNearestFuncDef() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestFuncDef((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable ExprClosure attrNearestExprClosure() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestExprClosure((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable ExprStatementsBlock attrNearestExprStatementsBlock() {
        return de.peeeq.wurstscript.attributes.AttrNearest.nearestExprStatementsBlock((ExprMemberMethodDotDot)this);
    }
    /** "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 @org.eclipse.jdt.annotation.Nullable NameDef tryGetNameDef() {
        return de.peeeq.wurstscript.attributes.AttrNameDef.tryGetNameDef((ExprMemberMethodDotDot)this);
    }
// circular = null
    private int zzattr_attrPossibleFunctionSignatures_state = 0;
    private com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.types.FunctionSignature> zzattr_attrPossibleFunctionSignatures_cache;
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.types.FunctionSignature> attrPossibleFunctionSignatures() {
        if (zzattr_attrPossibleFunctionSignatures_state == 0) {
            try {
                zzattr_attrPossibleFunctionSignatures_state = 1;
                zzattr_attrPossibleFunctionSignatures_cache = de.peeeq.wurstscript.attributes.AttrPossibleFunctionSignatures.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrPossibleFunctionSignatures_state = 0;
            }
            zzattr_attrPossibleFunctionSignatures_state = 2;
        } else if (zzattr_attrPossibleFunctionSignatures_state == 1) {
            throw new CyclicDependencyError(this, "attrPossibleFunctionSignatures");
        }
        return zzattr_attrPossibleFunctionSignatures_cache;
    }
// circular = null
    private int zzattr_attrFunctionSignature_state = 0;
    private de.peeeq.wurstscript.types.FunctionSignature zzattr_attrFunctionSignature_cache;
    /** */
    public de.peeeq.wurstscript.types.FunctionSignature attrFunctionSignature() {
        if (zzattr_attrFunctionSignature_state == 0) {
            try {
                zzattr_attrFunctionSignature_state = 1;
                zzattr_attrFunctionSignature_cache = de.peeeq.wurstscript.attributes.AttrFunctionSignature.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrFunctionSignature_state = 0;
            }
            zzattr_attrFunctionSignature_state = 2;
        } else if (zzattr_attrFunctionSignature_state == 1) {
            throw new CyclicDependencyError(this, "attrFunctionSignature");
        }
        return zzattr_attrFunctionSignature_cache;
    }
// circular = null
    private int zzattr_attrCallSignature_state = 0;
    private de.peeeq.wurstscript.types.CallSignature zzattr_attrCallSignature_cache;
    /** */
    public de.peeeq.wurstscript.types.CallSignature attrCallSignature() {
        if (zzattr_attrCallSignature_state == 0) {
            try {
                zzattr_attrCallSignature_state = 1;
                zzattr_attrCallSignature_cache = de.peeeq.wurstscript.attributes.AttrCallSignature.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrCallSignature_state = 0;
            }
            zzattr_attrCallSignature_state = 2;
        } else if (zzattr_attrCallSignature_state == 1) {
            throw new CyclicDependencyError(this, "attrCallSignature");
        }
        return zzattr_attrCallSignature_cache;
    }
    /** */
    public de.peeeq.wurstscript.parser.WPos attrSource() {
        return de.peeeq.wurstscript.attributes.AttrPos.getPos((ExprMemberMethodDotDot)this);
    }
    /** "returns the position where errors are marked"*/
    public de.peeeq.wurstscript.parser.WPos attrErrorPos() {
        return de.peeeq.wurstscript.attributes.AttrPos.getErrorPos((ExprMemberMethodDotDot)this);
    }
    /** */
    public WurstModel getModel() {
        return de.peeeq.wurstscript.attributes.AttrImportedPackage.getModel((ExprMemberMethodDotDot)this);
    }
    /** */
    public de.peeeq.wurstscript.jassIm.ImExpr imTranslateExpr(de.peeeq.wurstscript.translation.imtranslation.ImTranslator translator, de.peeeq.wurstscript.jassIm.ImFunction f) {
        return de.peeeq.wurstscript.translation.imtranslation.ExprTranslation.translate((ExprMemberMethodDotDot)this, translator, f);
    }
    /** */
    public de.peeeq.wurstscript.jassIm.ImExprOpt imTranslateExprOpt(de.peeeq.wurstscript.translation.imtranslation.ImTranslator translator, de.peeeq.wurstscript.jassIm.ImFunction f) {
        return de.peeeq.wurstscript.translation.imtranslation.ExprTranslation.translate((ExprMemberMethodDotDot)this, translator, f);
    }
    /** */
    public de.peeeq.wurstscript.jassIm.ImStmt imTranslateStmt(de.peeeq.wurstscript.translation.imtranslation.ImTranslator translator, de.peeeq.wurstscript.jassIm.ImFunction f) {
        return de.peeeq.wurstscript.translation.imtranslation.StmtTranslation.translate((ExprMemberMethodDotDot)this, translator, f);
    }
    /** */
    public void addError(String msg) {
        de.peeeq.wurstscript.attributes.ErrorHandling.addError((ExprMemberMethodDotDot)this, msg);
    }
    /** */
    public void addWarning(String msg) {
        de.peeeq.wurstscript.attributes.ErrorHandling.addWarning((ExprMemberMethodDotDot)this, msg);
    }
    /** */
    public de.peeeq.wurstscript.attributes.ErrorHandler getErrorHandler() {
        return de.peeeq.wurstscript.attributes.ErrorHandling.getErrorHandler((ExprMemberMethodDotDot)this);
    }
// circular = null
    private int zzattr_attrPossibleFuncDefs_state = 0;
    private com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> zzattr_attrPossibleFuncDefs_cache;
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> attrPossibleFuncDefs() {
        if (zzattr_attrPossibleFuncDefs_state == 0) {
            try {
                zzattr_attrPossibleFuncDefs_state = 1;
                zzattr_attrPossibleFuncDefs_cache = de.peeeq.wurstscript.attributes.PossibleFuncDefs.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrPossibleFuncDefs_state = 0;
            }
            zzattr_attrPossibleFuncDefs_state = 2;
        } else if (zzattr_attrPossibleFuncDefs_state == 1) {
            throw new CyclicDependencyError(this, "attrPossibleFuncDefs");
        }
        return zzattr_attrPossibleFuncDefs_cache;
    }
// circular = null
    private int zzattr_attrFuncLink_state = 0;
    private de.peeeq.wurstscript.attributes.names.FuncLink zzattr_attrFuncLink_cache;
    /** */
    public de.peeeq.wurstscript.attributes.names.FuncLink attrFuncLink() {
        if (zzattr_attrFuncLink_state == 0) {
            try {
                zzattr_attrFuncLink_state = 1;
                zzattr_attrFuncLink_cache = de.peeeq.wurstscript.attributes.AttrFuncDef.calculate((ExprMemberMethodDotDot)this);
            } finally {
                zzattr_attrFuncLink_state = 0;
            }
            zzattr_attrFuncLink_state = 2;
        } else if (zzattr_attrFuncLink_state == 1) {
            throw new CyclicDependencyError(this, "attrFuncLink");
        }
        return zzattr_attrFuncLink_cache;
    }
    /** */
    public FunctionDefinition attrFuncDef() {
        return de.peeeq.wurstscript.attributes.AttrFuncDef.calculateDef((ExprMemberMethodDotDot)this);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable TypeDef lookupType(String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupType((ExprMemberMethodDotDot)this, name, showErrors);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.PackageLink lookupPackage(String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupPackage((ExprMemberMethodDotDot)this, name, showErrors);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.NameLink lookupVar(String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupVar((ExprMemberMethodDotDot)this, name, showErrors);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.NameLink lookupVarNoConfig(String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupVarNoConfig((ExprMemberMethodDotDot)this, name, showErrors);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.NameLink lookupMemberVar(de.peeeq.wurstscript.types.WurstType receiverType, String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupMemberVar((ExprMemberMethodDotDot)this, receiverType, name, showErrors);
    }
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupFuncs(String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupFuncs((ExprMemberMethodDotDot)this, name, showErrors);
    }
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupFuncsNoConfig(String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupFuncsNoConfig((ExprMemberMethodDotDot)this, name, showErrors);
    }
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupMemberFuncs(de.peeeq.wurstscript.types.WurstType receiverType, String name, boolean showErrors) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupMemberFuncs((ExprMemberMethodDotDot)this, receiverType, name, showErrors);
    }
    /** */
    public @org.eclipse.jdt.annotation.Nullable TypeDef lookupType(String name) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupTypeShort((ExprMemberMethodDotDot)this, name);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.PackageLink lookupPackage(String name) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupPackageShort((ExprMemberMethodDotDot)this, name);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.NameLink lookupVar(String name) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupVarShort((ExprMemberMethodDotDot)this, name);
    }
    /** */
    public de.peeeq.wurstscript.attributes.names.NameLink lookupMemberVar(de.peeeq.wurstscript.types.WurstType receiverType, String name) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupMemberVarShort((ExprMemberMethodDotDot)this, receiverType, name);
    }
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupFuncs(String name) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupFuncsShort((ExprMemberMethodDotDot)this, name);
    }
    /** */
    public com.google.common.collect.ImmutableCollection<de.peeeq.wurstscript.attributes.names.FuncLink> lookupMemberFuncs(de.peeeq.wurstscript.types.WurstType receiverType, String name) {
        return de.peeeq.wurstscript.attributes.names.NameResolution.lookupMemberFuncsShort((ExprMemberMethodDotDot)this, receiverType, name);
    }
// circular = de.peeeq.wurstscript.utils.Utils.emptyList
    private int zzattr_attrUsedGlobalVariables_state = 0;
    private com.google.common.collect.ImmutableList<VarDef> zzattr_attrUsedGlobalVariables_cache;
    /** */
    public com.google.common.collect.ImmutableList<VarDef> attrUsedGlobalVariables() {
        if (zzattr_attrUsedGlobalVariables_state == 0) {
            zzattr_attrUsedGlobalVariables_state = 1;
            zzattr_attrUsedGlobalVariables_cache = de.peeeq.wurstscript.utils.Utils.emptyList();
            while (true) {
                com.google.common.collect.ImmutableList<VarDef> r = de.peeeq.wurstscript.attributes.UsedGlobalVariables.getUsedGlobals((ExprMemberMethodDotDot)this);
                if (zzattr_attrUsedGlobalVariables_state == 3) {
                    if (!zzattr_attrUsedGlobalVariables_cache.equals(r)) {
                        zzattr_attrUsedGlobalVariables_cache = r;
                        continue;
                    }
                }
                zzattr_attrUsedGlobalVariables_cache = r;
                break;
            }
            zzattr_attrUsedGlobalVariables_state = 2;
        } else if (zzattr_attrUsedGlobalVariables_state == 1) {
            zzattr_attrUsedGlobalVariables_state = 3;
        }
        return zzattr_attrUsedGlobalVariables_cache;
    }
// circular = de.peeeq.wurstscript.utils.Utils.emptyList
    private int zzattr_attrReadGlobalVariables_state = 0;
    private com.google.common.collect.ImmutableList<VarDef> zzattr_attrReadGlobalVariables_cache;
    /** */
    public com.google.common.collect.ImmutableList<VarDef> attrReadGlobalVariables() {
        if (zzattr_attrReadGlobalVariables_state == 0) {
            zzattr_attrReadGlobalVariables_state = 1;
            zzattr_attrReadGlobalVariables_cache = de.peeeq.wurstscript.utils.Utils.emptyList();
            while (true) {
                com.google.common.collect.ImmutableList<VarDef> r = de.peeeq.wurstscript.attributes.UsedGlobalVariables.getReadGlobals((ExprMemberMethodDotDot)this);
                if (zzattr_attrReadGlobalVariables_state == 3) {
                    if (!zzattr_attrReadGlobalVariables_cache.equals(r)) {
                        zzattr_attrReadGlobalVariables_cache = r;
                        continue;
                    }
                }
                zzattr_attrReadGlobalVariables_cache = r;
                break;
            }
            zzattr_attrReadGlobalVariables_state = 2;
        } else if (zzattr_attrReadGlobalVariables_state == 1) {
            zzattr_attrReadGlobalVariables_state = 3;
        }
        return zzattr_attrReadGlobalVariables_cache;
    }
    /** */
    public com.google.common.collect.ImmutableCollection<WPackage> attrUsedPackages() {
        return de.peeeq.wurstscript.attributes.UsedPackages.usedPackages((ExprMemberMethodDotDot)this);
    }
    /** */
    public String description() {
        return de.peeeq.wurstscript.attributes.Description.description((ExprMemberMethodDotDot)this);
    }
    /** */
    public String descriptionHtml() {
        return de.peeeq.wurstscript.attributes.DescriptionHtml.description((ExprMemberMethodDotDot)this);
    }
    /** */
    public boolean isSubtreeOf(Element other) {
        return de.peeeq.wurstscript.attributes.SmallHelpers.isSubtreeOf((ExprMemberMethodDotDot)this, other);
    }
    /** */
    public void prettyPrint(de.peeeq.wurstscript.attributes.prettyPrint.Spacer spacer, StringBuilder sb, int indent) {
        de.peeeq.wurstscript.attributes.prettyPrint.PrettyPrinter.prettyPrint((ExprMemberMethodDotDot)this, spacer, sb, indent);
    }
    /** */
    public String getFuncName() {
        return de.peeeq.wurstscript.attributes.SmallHelpers.getFuncName((ExprMemberMethodDotDot)this);
    }
}