コード例 #1
0
        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);
            }
        }
コード例 #2
0
 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);
     }
 }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
ファイル: TreeVoidWalker.cs プロジェクト: Beier/Omnium
 public virtual void ExitINamedDeclaration(INamedDeclaration iNamedDeclaration)
 {
 }
コード例 #5
0
ファイル: TreeVoidWalker.cs プロジェクト: Beier/Omnium
 public virtual void EnterINamedDeclaration(INamedDeclaration iNamedDeclaration)
 {
 }