public override void AddNode(GraphMenuItem nodeTreeViewItem)
        {
            if (nodeTreeViewItem.TypeInfo is INamespaceSymbol)
            {
                return;
            }

            if (nodeTreeViewItem.TypeInfo is NodeType nodeType)
            {
                CreateSpecialNode(nodeType);
                return;
            }

            if (nodeTreeViewItem.TypeInfo is INamedTypeSymbol namedTypeSymbol)
            {
                if (namedTypeSymbol.SpecialType == SpecialType.System_Void)
                {
                    AddNode(MethodDeclerationNode.Create());
                }
                else
                {
                    AddNode(VariableNode.Create(namedTypeSymbol.ToDisplayString(), null, namedTypeSymbol.ToString()));
                }
            }
            else if (nodeTreeViewItem.TypeInfo is IMethodSymbol methodSymbol)
            {
                AddNode(ExternalMethodNode.Create($"{methodSymbol.ContainingType.Name}.{methodSymbol.Name}", methodSymbol.ToString(), methodSymbol.Parameters, methodSymbol.ReturnType));
            }
            //else if (nodeTreeViewItem.TypeInfo is Void)
            //{

            //}

            //base.AddNode(nodeTreeViewItem);
        }
        protected override CrawlSyntaxNode VisitMethodDecleration(MethodDeclerationNode methodDecleration)
        {
            var decl = (MethodDeclerationNode)base.VisitMethodDecleration(methodDecleration);

            List <ParameterNode> newParams = new List <ParameterNode>();

            foreach (ParameterNode param in decl.Parameters)
            {
                if (param.Reference) //If it's a reference, don't mess with it.
                {
                    newParams.Add(param);
                }
                else
                {
                    //If there is any risk of side-effects affecting non-ref parameter, don't optimize to ref.
                    var visitor = new CheckSideEffectsOfSingleParameterVisitor(param.Identifier.Value);
                    if (visitor.Visit(methodDecleration.Body))
                    {
                        newParams.Add(param);
                    }
                    else
                    {
                        newParams.Add(CrawlSyntaxNode.Parameter(param.Interval, param.Reference,
                                                                false, param.ParameterType, param.Identifier));
                    }
                }
            }

            return(CrawlSyntaxNode.MethodDecleration(decl.Interval, decl.ProtectionLevel, decl.Scope, decl.MethodSignature,
                                                     newParams, decl.Body, decl.Identifier, decl.GenericParameters));
        }
Exemple #3
0
        public BlockScope CollectIdentifiers(BlockNode block)
        {
            DeclaringScope declaringScope = DeclaringScope.MethodLike;

            if (block.Parent is ClassTypeDeclerationNode)
            {
                declaringScope = DeclaringScope.ClassLike;
            }

            ListDictionary <string, TypeInformation> scope = new ListDictionary <string, TypeInformation>();

            foreach (var child in block)
            {
                if (child.Type == NodeType.VariableDecleration)
                {
                    VariableDeclerationNode variableNode = (VariableDeclerationNode)child;
                    foreach (var decleration in variableNode.Declerations)
                    {
                        string name = decleration.Identifier.Name;
                        scope.Add(name,
                                  new TypeInformation(
                                      variableNode.DeclerationType.ActualType,
                                      variableNode.ProtectionLevel,
                                      decleration.Interval.a,
                                      declaringScope));
                    }
                }
                else if (child.Type == NodeType.MethodDecleration)
                {
                    MethodDeclerationNode methodNode = (MethodDeclerationNode)child;
                    string name = methodNode.Identifier.Value;
                    scope.Add(name,
                              new TypeInformation(
                                  methodNode.MethodSignature.ActualType,
                                  methodNode.ProtectionLevel,
                                  methodNode.Interval.a,
                                  declaringScope));
                }
            }

            ConcurrentDictionary <string, TypeInformation[]> newscope = new ConcurrentDictionary <string, TypeInformation[]>(_scopeDictionary);

            foreach (KeyValuePair <string, List <TypeInformation> > pair in scope)
            {
                newscope.TryAdd(pair.Key, pair.Value.ToArray());
            }
            return(new BlockScope(newscope, _classes));
        }
        protected override CrawlSyntaxNode VisitMethodDecleration(MethodDeclerationNode methodDecleration)
        {
            IScope containingScope = methodDecleration.FindFirstScope();

            GenericScope scope = new GenericScope(
                methodDecleration
                .Parameters
                .Select(
                    (parameter, index) =>
                    new KeyValuePair <string, TypeInformation>(parameter.Identifier.Value,
                                                               new TypeInformation(
                                                                   parameter.ParameterType.ActualType,
                                                                   ProtectionLevel.NotApplicable,
                                                                   parameter.Interval.b
                                                                   )
                                                               )
                    )
                );

            MethodDeclerationNode node = (MethodDeclerationNode)base.VisitMethodDecleration(methodDecleration);

            return(node.WithScope(scope));
        }