public EdgeBuildingSyntaxVisitor(SemanticModel semanticModel, TypeSystem typeSystem, TypeSystem.Builder typeSystemBuilder, SyntaxToNodeMapping mapping, CancellationToken cancellationToken)
     : base(semanticModel, typeSystemBuilder, cancellationToken)
 {
     this.typeSystem        = typeSystem;
     this.typeSystemBuilder = typeSystemBuilder;
     this.mapping           = mapping;
     this.operationVisitor  = new EdgeBuildingOperationVisitor(this, typeSystem, typeSystemBuilder);
 }
        private void CreateEdges(SyntaxTree syntaxTree, CancellationToken cancellationToken)
        {
            var semanticModel = compilation.GetSemanticModel(syntaxTree);
            var tsBuilder     = new TypeSystem.Builder(typeSystem);
            var visitor       = new EdgeBuildingSyntaxVisitor(semanticModel, typeSystem, tsBuilder, typeSystem.GetMapping(syntaxTree), cancellationToken);

            visitor.Visit(syntaxTree.GetRoot(cancellationToken));
            lock (typeSystem) {
                tsBuilder.Flush(typeSystem);
            }
        }
        private void CreateNodes(SyntaxTree syntaxTree, CancellationToken cancellationToken)
        {
            var semanticModel = compilation.GetSemanticModel(syntaxTree);
            var tsBuilder     = new TypeSystem.Builder(typeSystem);
            var visitor       = new NodeBuildingSyntaxVisitor(semanticModel, tsBuilder, cancellationToken);

            visitor.Visit(syntaxTree.GetRoot(cancellationToken));
            lock (typeSystem) {
                typeSystem.RegisterNodes(syntaxTree, visitor.Mapping);
                tsBuilder.Flush(typeSystem);
            }
        }
        private void CreateEdges(SyntaxTree syntaxTree, CancellationToken cancellationToken)
        {
            var semanticModel = compilation.GetSemanticModel(syntaxTree);
            var tsBuilder     = new TypeSystem.Builder(typeSystem);
            var mapping       = typeSystem.GetMapping(syntaxTree);
            var visitor       = new EdgeBuildingSyntaxVisitor(semanticModel, typeSystem, tsBuilder, mapping, cancellationToken);

            visitor.Visit(syntaxTree.GetRoot(cancellationToken));
            foreach (var cref in mapping.CrefSyntaxes)
            {
                visitor.HandleCref(cref);
            }
            lock (typeSystem) {
                tsBuilder.Flush(typeSystem);
            }
        }
        public void JoinWith(Snapshot snapshot, TypeSystem.Builder tsBuilder, EdgeLabel edgeLabel)
        {
            if (unreachable)
            {
                RestoreSnapshot(snapshot);
                return;
            }
            else if (snapshot.Unreachable)
            {
                return; // no-op
            }
            Debug.Assert(!unreachable && !snapshot.Unreachable);
            thisPath = Join(thisPath, snapshot.ThisPath);
            locals   = JoinDict(locals.ToImmutable(), snapshot.Locals);

            ImmutableDictionary <ISymbol, PathNode> .Builder JoinDict(ImmutableDictionary <ISymbol, PathNode> a, ImmutableDictionary <ISymbol, PathNode> b)
            {
                ImmutableDictionary <ISymbol, PathNode> .Builder newDict = emptyMembers.ToBuilder();
                foreach (var(local, pathFromSnapshot) in b)
                {
                    if (a.TryGetValue(local, out var pathFromThis))
                    {
                        newDict[local] = Join(pathFromThis, pathFromSnapshot);
                    }
                }
                return(newDict);
            }

            PathNode Join(PathNode a, PathNode b)
            {
                var newMembers     = JoinDict(a.Members, b.Members);
                var newNullability = tsBuilder.Join(a.Nullability, b.Nullability, edgeLabel);

                return(new PathNode(newNullability, newMembers.ToImmutable()));
            }
        }
Exemple #6
0
 public NodeBuildingSyntaxVisitor(SemanticModel semanticModel, TypeSystem.Builder typeSystem, CancellationToken cancellationToken)
     : base(semanticModel, typeSystem, cancellationToken)
 {
 }
 protected GraphBuildingSyntaxVisitor(SemanticModel semanticModel, TypeSystem.Builder typeSystem, CancellationToken cancellationToken)
 {
     this.semanticModel     = semanticModel;
     this.typeSystem        = typeSystem;
     this.cancellationToken = cancellationToken;
 }