public override void VisitTaskDefinition(TaskDefinitionSyntax taskDefinitionSyntax) {
            var identifier = taskDefinitionSyntax.Identifier;
            var location   = identifier.GetLocation();

            if(location == null) {
                return;
            }

            var taskName = identifier.ToString();

            var taskDeclaration = _taskDeklarations.TryFindSymbol(taskName);
            if(taskDeclaration.Location != location) {
                taskDeclaration = null;
            }

            _taskDefinition = new TaskDefinitionSymbol(taskName, location, taskDefinitionSyntax, taskDeclaration);

            // Declarations
            foreach(var nodeDeclarationSyntax in taskDefinitionSyntax.NodeDeclarationBlock?.NodeDeclarations ?? Enumerable.Empty<NodeDeclarationSyntax>()) {
                Visit(nodeDeclarationSyntax);
            }

            // Transitions
            foreach (var transitionDefinitionSyntax in taskDefinitionSyntax.TransitionDefinitionBlock?.TransitionDefinitions ?? Enumerable.Empty<TransitionDefinitionSyntax>()) {
                Visit(transitionDefinitionSyntax);
            }

            // ExitTransitions
            foreach (var transitionDefinitionSyntax in taskDefinitionSyntax.TransitionDefinitionBlock?.ExitTransitionDefinitions ?? Enumerable.Empty<ExitTransitionDefinitionSyntax>()) {
                Visit(transitionDefinitionSyntax);
            }

            VerifyTaskDefinition();
        }
        internal ExitTransition(ExitTransitionDefinitionSyntax syntax,
                                TaskDefinitionSymbol taskDefinition,
                                [CanBeNull] NodeReferenceSymbol source,
                                [CanBeNull] ConnectionPointReferenceSymbol connectionPoint,
                                [CanBeNull] EdgeModeSymbol edgeMode,
                                [CanBeNull] NodeReferenceSymbol target) {

            if (syntax == null) {
                throw new ArgumentNullException(nameof(syntax));
            }
            if (taskDefinition == null) {
                throw new ArgumentNullException(nameof(taskDefinition));
            }

            Syntax          = syntax;
            TaskDefinition = taskDefinition;
            Source          = source;
            ConnectionPoint = connectionPoint;
            EdgeMode        = edgeMode;
            Target          = target;

            if(connectionPoint != null) {                
                connectionPoint.ExitTransition = this;
            }
        }
 public TaskDefinitionBuilderResult(TaskDefinitionSymbol taskDefinition, IReadOnlyList<Diagnostic> diagnostics) {
     TaskDefinition = taskDefinition;
     Diagnostics = diagnostics ?? new List<Diagnostic>();
 }