예제 #1
0
        internal async Task <BreakpointToggleResult> TryToggleBreakpoint(int lineStart, int lineEnd)
        {
            //string line = AvaloniaEditor.TextArea.Document.GetText(lineStart, lineEnd - lineStart);
            string line = EditorControl.Text.ToString(new TextSpan(lineStart, lineEnd - lineStart));

            if (line.Contains(Utils.BreakpointMarker))
            {
                line = line.Replace(Utils.BreakpointMarker, "");
                if (string.IsNullOrWhiteSpace(line))
                {
                    await EditorControl.SetText(EditorControl.Text.WithChanges(new TextChange(new TextSpan(lineStart, lineEnd - lineStart + Environment.NewLine.Length), "")));
                }
                else
                {
                    await EditorControl.SetText(EditorControl.Text.WithChanges(new TextChange(new TextSpan(lineStart, lineEnd - lineStart + Environment.NewLine.Length), line)));
                }
                return(BreakpointToggleResult.Removed);
            }
            else
            {
                SyntaxTree tree = await EditorControl.GetSyntaxTree();

                TextSpan targetSpan = new TextSpan(lineStart, 1);

                SyntaxNode node = tree.GetRoot().FindNode(targetSpan);

                SyntaxNode fullNode = node;

                while (fullNode.Parent != null && !fullNode.Kind().IsStatement())
                {
                    fullNode = fullNode.Parent;
                }

                if (fullNode.Kind().IsStatement())
                {
                    int charInd = tree.GetMappedLineSpan(fullNode.Span).StartLinePosition.Character;

                    SyntaxTrivia commentTrivia = SyntaxFactory.Comment(Utils.BreakpointMarker + Environment.NewLine + new string(' ', charInd));

                    SyntaxNode newNode = fullNode.WithLeadingTrivia(fullNode.GetLeadingTrivia().Add(commentTrivia));

                    string newDocString = newNode.GetText().ToString();

                    await EditorControl.SetText(EditorControl.Text.WithChanges(new TextChange(new TextSpan(fullNode.FullSpan.Start, fullNode.FullSpan.Length), newDocString)));

                    //AvaloniaEditor.TextArea.Document.Replace(fullNode.FullSpan.Start, fullNode.FullSpan.Length, newDocString);
                    return(BreakpointToggleResult.Added);
                }
                else
                {
                    return(BreakpointToggleResult.InvalidPosition);
                }
            }
        }
예제 #2
0
        private async Task Initialize(string sourceText, string preSource, string postSource, IEnumerable <CachedMetadataReference> references, CSharpCompilationOptions compilationOptions, string guid, Shortcut[] additionalShortcuts)
        {
            this.CompilationOptions = compilationOptions;
            this.Guid = guid;

            EditorControl = this.FindControl <CSharpSourceEditorControl>("EditorControl");

            await EditorControl.SetText(sourceText);

            this.PreSource  = preSource;
            this.PostSource = postSource;

            OriginalText      = EditorControl.Text.ToString();
            OriginalDocument  = EditorControl.Document;
            LastSavedText     = OriginalText;
            OriginalTimeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            CompletionService service = CompletionService.GetService(OriginalDocument);

            this.FindControl <CompletionWindow>("CompletionWindow").Document          = OriginalDocument;
            this.FindControl <CompletionWindow>("CompletionWindow").CompletionService = service;

            this.CompletionWindow   = this.FindControl <CompletionWindow>("CompletionWindow");
            this.MethodOverloadList = this.FindControl <MethodOverloadList>("MethodOverloadList");

            this.FindControl <MethodOverloadList>("MethodOverloadList").Document = OriginalDocument;

            this.FindControl <CompletionWindow>("CompletionWindow").Committed += CompletionCommitted;

            StatusBar = this.FindControl <StatusBar>("StatusBar");

            ErrorContainer       = this.FindControl <ErrorContainer>("ErrorContainer");
            ReferencesContainer  = this.FindControl <ReferencesContainer>("ReferencesContainer");
            SaveHistoryContainer = this.FindControl <SaveHistoryContainer>("SaveHistoryContainer");
            SettingsContainer    = new SettingsContainer(additionalShortcuts)
            {
                Margin = new Thickness(10, 0, 0, 10), IsVisible = false
            };
            Grid.SetRow(SettingsContainer, 2);
            this.FindControl <Grid>("ContainerGrid").Children.Add(SettingsContainer);



            await this.SetReferences(ImmutableList.Create((from el in references select(MetadataReference) el).ToArray()));

            EditorControl.ClearUndoStack();

            this.CompilationErrorChecker = CompilationErrorChecker.Attach(this);

            this.SymbolToolTip            = this.FindControl <SymbolToolTip>("SymbolToolTip");
            this.SymbolToolTip.References = References;

            this.BreakpointPanel = this.FindControl <BreakpointPanel>("BreakpointPanel");

            string autosaveDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), Assembly.GetEntryAssembly().GetName().Name);

            Directory.CreateDirectory(Path.Combine(autosaveDirectory, Guid));
            AutoSaveFile   = Path.Combine(autosaveDirectory, Guid, "autosave_" + System.Guid.NewGuid().ToString("N") + ".cs");
            SaveDirectory  = Path.Combine(autosaveDirectory, Guid);
            this.AutoSaver = AutoSaver.Start(this, AutoSaveFile);

            InputHandler = new InputHandler(this, EditorControl, this.FindControl <CompletionWindow>("CompletionWindow"), this.FindControl <MethodOverloadList>("MethodOverloadList"), service);
            EditorControl.ToggleBreakpoint += async(s, e) =>
            {
                await this.TryToggleBreakpoint(e.LineStart, e.LineEnd);
            };
        }