private static bool IsStatic(INamedDeclaration declaration) { switch (declaration) { case VariableDeclaration variableDeclaration: return(variableDeclaration.Modifiers.Contains(MemberModifier.Static)); case GetterSetterDeclaration getterSetterDeclaration: if (getterSetterDeclaration.Getter != null) { return(getterSetterDeclaration.Getter.Modifiers.Contains(MemberModifier.Static)); } return(getterSetterDeclaration.Setter.Modifiers.Contains(MemberModifier.Static)); case MethodDeclaration methodDeclaration: return(methodDeclaration.Modifiers.Contains(MemberModifier.Static)); case ModuleDeclaration _: case ClassDeclaration _: case EnumDeclaration _: case EnumValue _: return(true); default: throw new Exception("Unexpected declaration: " + declaration?.GetType().FullName); } }
private void ReplaceGetterOrSetter(IExpression expression, INamedDeclaration declaration, IExpression @base) { if (declaration is GetterDeclaration) { var methodInvocation = new MethodInvocationExpression(expression.Context, @base.Yield()); expression.ReplaceWith(methodInvocation); Visit(methodInvocation); } else if (declaration is SetterDeclaration) { var assignment = (AssignmentExpression)expression.Parent; var methodInvocation = new MethodInvocationExpression( expression.Context, @base.Yield().Concat <INode>(assignment.Right.Yield()) ); assignment.ReplaceWith(methodInvocation); Visit(methodInvocation); } }
private void EnterMethodOrGetterOrSetter(INamedDeclaration namedDeclaration) { if (visitedMethods.Contains(namedDeclaration)) { skipChildren = true; return; } if (currentMethodStack.Contains(namedDeclaration)) { var path = currentMethodStack.SkipWhile(x => x != namedDeclaration).Concat(namedDeclaration.Yield()) .Select( (MethodDeclaration methodDeclaration) => $"\tmethod {methodDeclaration.Name} ({methodDeclaration.Context.GetPositionString()})", (GetterDeclaration getterDeclaration) => $"\tgetter {getterDeclaration.Name} ({getterDeclaration.Context.GetPositionString()})", (SetterDeclaration setterDeclaration) => $"\tsetter {setterDeclaration.Name} ({setterDeclaration.Context.GetPositionString()})" ).MkString("\n"); throw new CompilationError(namedDeclaration.Context, "Recursive methods are not allowed\n" + path); } currentMethodStack.Push(namedDeclaration); switch (namedDeclaration) { case MethodDeclaration methodDeclaration: if (methodDeclaration.ReturnType == null) { inferredMethodTypes.Add(methodDeclaration, new List <ITypeNode>()); } break; case GetterDeclaration getterDeclaration: if (getterDeclaration.ReturnType == null) { inferredMethodTypes.Add(getterDeclaration, new List <ITypeNode>()); } break; } }
public virtual void ExitINamedDeclaration(INamedDeclaration iNamedDeclaration) { }
public virtual void EnterINamedDeclaration(INamedDeclaration iNamedDeclaration) { }