internal static void VerifySemanticDiagnostics( this EditScript <SyntaxNode> editScript, params RudeEditDiagnosticDescription[] expectedDiagnostics) { VerifySemanticDiagnostics(editScript, null, expectedDiagnostics); }
internal static void VerifyPreserveLocalVariables(EditScript<SyntaxNode> edits, bool preserveLocalVariables) { var decl1 = (MethodDeclarationSyntax)((ClassDeclarationSyntax)((CompilationUnitSyntax)edits.Match.OldRoot).Members[0]).Members[0]; var body1 = ((MethodDeclarationSyntax)SyntaxFactory.SyntaxTree(decl1).GetRoot()).Body; var decl2 = (MethodDeclarationSyntax)((ClassDeclarationSyntax)((CompilationUnitSyntax)edits.Match.NewRoot).Members[0]).Members[0]; var body2 = ((MethodDeclarationSyntax)SyntaxFactory.SyntaxTree(decl2).GetRoot()).Body; var diagnostics = new List<RudeEditDiagnostic>(); bool isActiveMethod; var match = Analyzer.ComputeBodyMatch(body1, body2, new AbstractEditAndContinueAnalyzer.ActiveNode[0], diagnostics, out isActiveMethod); // Active methods are detected to preserve local variables for variable mapping and // edited async/iterator methods are considered active. Assert.Equal(preserveLocalVariables, isActiveMethod); }
public void SetData(IList <string> stringList, EditScript script, bool useA) { this.lines = new DiffViewLines(stringList, script, useA); this.UpdateAfterSetData(); }
public void SetData(IList <string> StringListA, IList <string> StringListB, EditScript Script) { SetData(StringListA, StringListB, Script, "", ""); }
internal void VerifyRudeDiagnostics( EditScript <SyntaxNode> editScript, ActiveStatementsDescription description, RudeEditDiagnosticDescription[] expectedDiagnostics) { var oldActiveStatements = description.OldStatements; if (description.OldTrackingSpans != null) { Assert.Equal(oldActiveStatements.Length, description.OldTrackingSpans.Length); } var newSource = editScript.Match.NewRoot.SyntaxTree.ToString(); var oldSource = editScript.Match.OldRoot.SyntaxTree.ToString(); var oldText = SourceText.From(oldSource); var newText = SourceText.From(newSource); var diagnostics = new ArrayBuilder <RudeEditDiagnostic>(); var updatedActiveMethodMatches = new ArrayBuilder <UpdatedMemberInfo>(); var actualNewActiveStatements = ImmutableArray.CreateBuilder <ActiveStatement>(oldActiveStatements.Length); actualNewActiveStatements.Count = actualNewActiveStatements.Capacity; var actualNewExceptionRegions = ImmutableArray.CreateBuilder <ImmutableArray <LinePositionSpan> >(oldActiveStatements.Length); actualNewExceptionRegions.Count = actualNewExceptionRegions.Capacity; var editMap = BuildEditMap(editScript); var documentId = DocumentId.CreateNewId(ProjectId.CreateNewId("TestEnCProject"), "TestEnCDocument"); var testAccessor = Analyzer.GetTestAccessor(); testAccessor.AnalyzeMemberBodiesSyntax( editScript, editMap, oldText, newText, oldActiveStatements.AsImmutable(), description.OldTrackingSpans.ToImmutableArrayOrEmpty(), actualNewActiveStatements, actualNewExceptionRegions, updatedActiveMethodMatches, diagnostics); testAccessor.ReportTopLevelSynctactiveRudeEdits(diagnostics, editScript, editMap); diagnostics.Verify(newSource, expectedDiagnostics); // check active statements: AssertSpansEqual(description.NewSpans, actualNewActiveStatements.Select(s => s.Span), newSource, newText); if (diagnostics.Count == 0) { // check old exception regions: for (var i = 0; i < oldActiveStatements.Length; i++) { var actualOldExceptionRegions = Analyzer.GetExceptionRegions( oldText, editScript.Match.OldRoot, oldActiveStatements[i].Span, isNonLeaf: oldActiveStatements[i].IsNonLeaf, out _); AssertSpansEqual(description.OldRegions[i], actualOldExceptionRegions, oldSource, oldText); } // check new exception regions: Assert.Equal(description.NewRegions.Length, actualNewExceptionRegions.Count); for (var i = 0; i < description.NewRegions.Length; i++) { AssertSpansEqual(description.NewRegions[i], actualNewExceptionRegions[i], newSource, newText); } } else { for (var i = 0; i < oldActiveStatements.Length; i++) { Assert.Equal(0, description.NewRegions[i].Length); } } }
public static void VerifyEdits <TNode>(this EditScript <TNode> actual, params string[] expected) { AssertEx.Equal( expected.Select(s => string.Format("\"{0}\"", s)), actual.Edits.Select(e => string.Format("\"{0}\"", e.GetDebuggerDisplay())), itemSeparator: ",\r\n"); }
internal void VerifyRudeDiagnostics( EditScript <SyntaxNode> editScript, ActiveStatementsDescription description, RudeEditDiagnosticDescription[] expectedDiagnostics) { var oldActiveStatements = description.OldSpans; if (description.TrackingSpans != null) { Assert.Equal(oldActiveStatements.Length, description.TrackingSpans.Length); } string newSource = editScript.Match.NewRoot.SyntaxTree.ToString(); string oldSource = editScript.Match.OldRoot.SyntaxTree.ToString(); var oldText = SourceText.From(oldSource); var newText = SourceText.From(newSource); var diagnostics = new List <RudeEditDiagnostic>(); var actualNewActiveStatements = new LinePositionSpan[oldActiveStatements.Length]; var actualNewExceptionRegions = new ImmutableArray <LinePositionSpan> [oldActiveStatements.Length]; var updatedActiveMethodMatches = new List <ValueTuple <int, Match <SyntaxNode> > >(); var editMap = Analyzer.BuildEditMap(editScript); DocumentId documentId = DocumentId.CreateNewId(ProjectId.CreateNewId("TestEnCProject"), "TestEnCDocument"); TestActiveStatementTrackingService trackingService; if (description.TrackingSpans != null) { trackingService = new TestActiveStatementTrackingService(documentId, description.TrackingSpans); } else { trackingService = null; } Analyzer.AnalyzeSyntax( editScript, editMap, oldText, newText, documentId, trackingService, oldActiveStatements.AsImmutable(), actualNewActiveStatements, actualNewExceptionRegions, updatedActiveMethodMatches, diagnostics); diagnostics.Verify(newSource, expectedDiagnostics); // check active statements: AssertSpansEqual(description.NewSpans, actualNewActiveStatements, newSource, newText); if (diagnostics.Count == 0) { // check old exception regions: for (int i = 0; i < oldActiveStatements.Length; i++) { var actualOldExceptionRegions = Analyzer.GetExceptionRegions( oldText, editScript.Match.OldRoot, oldActiveStatements[i].Span, isLeaf: (oldActiveStatements[i].Flags & ActiveStatementFlags.LeafFrame) != 0); AssertSpansEqual(description.OldRegions[i], actualOldExceptionRegions, oldSource, oldText); } // check new exception regions: Assert.Equal(description.NewRegions.Length, actualNewExceptionRegions.Length); for (int i = 0; i < description.NewRegions.Length; i++) { AssertSpansEqual(description.NewRegions[i], actualNewExceptionRegions[i], newSource, newText); } } else { for (int i = 0; i < oldActiveStatements.Length; i++) { Assert.Equal(0, description.NewRegions[i].Length); } } if (description.TrackingSpans != null) { AssertEx.Equal(trackingService.TrackingSpans, description.NewSpans.Select(s => (TextSpan?)s)); } }
internal void VerifyRudeDiagnostics( EditScript <SyntaxNode> editScript, ActiveStatementsDescription description, RudeEditDiagnosticDescription[] expectedDiagnostics) { var oldActiveStatements = description.OldStatements; if (description.OldTrackingSpans != null) { Assert.Equal(oldActiveStatements.Length, description.OldTrackingSpans.Length); } var newSource = editScript.Match.NewRoot.SyntaxTree.ToString(); var oldSource = editScript.Match.OldRoot.SyntaxTree.ToString(); var oldText = SourceText.From(oldSource); var newText = SourceText.From(newSource); var diagnostics = new List <RudeEditDiagnostic>(); var actualNewActiveStatements = new ActiveStatement[oldActiveStatements.Length]; var actualNewExceptionRegions = new ImmutableArray <LinePositionSpan> [oldActiveStatements.Length]; var updatedActiveMethodMatches = new List <AbstractEditAndContinueAnalyzer.UpdatedMemberInfo>(); var editMap = Analyzer.BuildEditMap(editScript); var documentId = DocumentId.CreateNewId(ProjectId.CreateNewId("TestEnCProject"), "TestEnCDocument"); TestActiveStatementTrackingService trackingService; if (description.OldTrackingSpans != null) { trackingService = new TestActiveStatementTrackingService(documentId, description.OldTrackingSpans); } else { trackingService = null; } Analyzer.GetTestAccessor().AnalyzeSyntax( editScript, editMap, oldText, newText, documentId, trackingService, oldActiveStatements.AsImmutable(), actualNewActiveStatements, actualNewExceptionRegions, updatedActiveMethodMatches, diagnostics); diagnostics.Verify(newSource, expectedDiagnostics); // check active statements: AssertSpansEqual(description.NewSpans, actualNewActiveStatements.Select(s => s.Span), newSource, newText); if (diagnostics.Count == 0) { // check old exception regions: for (var i = 0; i < oldActiveStatements.Length; i++) { var actualOldExceptionRegions = Analyzer.GetExceptionRegions( oldText, editScript.Match.OldRoot, oldActiveStatements[i].Span, isNonLeaf: oldActiveStatements[i].IsNonLeaf, out _); AssertSpansEqual(description.OldRegions[i], actualOldExceptionRegions, oldSource, oldText); } // check new exception regions: Assert.Equal(description.NewRegions.Length, actualNewExceptionRegions.Length); for (var i = 0; i < description.NewRegions.Length; i++) { AssertSpansEqual(description.NewRegions[i], actualNewExceptionRegions[i], newSource, newText); } } else { for (var i = 0; i < oldActiveStatements.Length; i++) { Assert.Equal(0, description.NewRegions[i].Length); } } if (description.OldTrackingSpans != null) { // Verify that the new tracking spans are equal to the new active statements. AssertEx.Equal(trackingService.TrackingSpans, description.NewSpans.Select(s => (TextSpan?)s)); } }
/// <summary> /// Loads an edit script from a Patchup (.patch) file /// </summary> /// <param name="path">The path to the Patchup (.patch) file.</param> public void Load(string path) { byte[] packedEditScript = File.ReadAllBytes(path); this.EditScript = Unpack(packedEditScript); }
internal static void VerifySemanticDiagnostics( this EditScript <SyntaxNode> editScript, params RudeEditDiagnosticDescription[] diagnostics) { VerifySemanticDiagnostics(editScript, activeStatements: null, targetFrameworks: null, capabilities: null, diagnostics); }
private void pboxEditScript_Click(object sender, EventArgs e) { EditScript?.Invoke(this, CurrentScript); }
internal EditScriptReference(EditScript editScriptReference, EditScript next) : base(next) { this._editScriptReference = editScriptReference; }
internal EditScriptAdd(int startTargetIndex, int endTargetIndex, EditScript next) : base(next) { this._startTargetIndex = startTargetIndex; this._endTargetIndex = endTargetIndex; }
internal EditScript(EditScript next) { this._nextEditScript = next; }
internal void VerifySemantics( EditScript <SyntaxNode> editScript, ActiveStatementsDescription?activeStatements = null, IEnumerable <string>?additionalOldSources = null, IEnumerable <string>?additionalNewSources = null, SemanticEditDescription[]?expectedSemanticEdits = null, DiagnosticDescription?expectedDeclarationError = null, RudeEditDiagnosticDescription[]?expectedDiagnostics = null) { activeStatements ??= ActiveStatementsDescription.Empty; var editMap = BuildEditMap(editScript); var oldRoot = editScript.Match.OldRoot; var newRoot = editScript.Match.NewRoot; var oldSource = oldRoot.SyntaxTree.ToString(); var newSource = newRoot.SyntaxTree.ToString(); var oldText = SourceText.From(oldSource); var newText = SourceText.From(newSource); IEnumerable <SyntaxTree> oldTrees = new[] { oldRoot.SyntaxTree }; IEnumerable <SyntaxTree> newTrees = new[] { newRoot.SyntaxTree }; if (additionalOldSources != null) { oldTrees = oldTrees.Concat(additionalOldSources.Select(s => ParseText(s))); } if (additionalOldSources != null) { newTrees = newTrees.Concat(additionalNewSources.Select(s => ParseText(s))); } var oldCompilation = CreateLibraryCompilation("Old", oldTrees); var newCompilation = CreateLibraryCompilation("New", newTrees); var oldModel = oldCompilation.GetSemanticModel(oldRoot.SyntaxTree); var newModel = newCompilation.GetSemanticModel(newRoot.SyntaxTree); var oldActiveStatements = activeStatements.OldStatements.AsImmutable(); var updatedActiveMethodMatches = new List <UpdatedMemberInfo>(); var triviaEdits = new List <(SyntaxNode OldNode, SyntaxNode NewNode)>(); var actualLineEdits = new List <LineChange>(); var actualSemanticEdits = new List <SemanticEdit>(); var diagnostics = new List <RudeEditDiagnostic>(); Assert.IsType <TestActiveStatementSpanTracker>(Analyzer.GetTestAccessor().ActiveStatementSpanTracker); var documentId = DocumentId.CreateNewId(ProjectId.CreateNewId()); var actualNewActiveStatements = new ActiveStatement[activeStatements.OldStatements.Length]; var actualNewExceptionRegions = new ImmutableArray <LinePositionSpan> [activeStatements.OldStatements.Length]; Analyzer.GetTestAccessor().AnalyzeSyntax( editScript, editMap, oldText, newText, documentId, oldActiveStatements, actualNewActiveStatements, actualNewExceptionRegions, updatedActiveMethodMatches, diagnostics); diagnostics.Verify(newSource); Analyzer.GetTestAccessor().AnalyzeTrivia( oldText, newText, editScript.Match, editMap, triviaEdits, actualLineEdits, diagnostics, CancellationToken.None); diagnostics.Verify(newSource); Analyzer.GetTestAccessor().AnalyzeSemantics( editScript, editMap, oldText, oldActiveStatements, triviaEdits, updatedActiveMethodMatches, oldModel, newModel, actualSemanticEdits, diagnostics, out var firstDeclarationErrorOpt, CancellationToken.None); var actualDeclarationErrors = (firstDeclarationErrorOpt != null) ? new[] { firstDeclarationErrorOpt } : Array.Empty <Diagnostic>(); var expectedDeclarationErrors = (expectedDeclarationError != null) ? new[] { expectedDeclarationError } : Array.Empty <DiagnosticDescription>(); actualDeclarationErrors.Verify(expectedDeclarationErrors); diagnostics.Verify(newSource, expectedDiagnostics); if (expectedSemanticEdits == null) { return; } Assert.Equal(expectedSemanticEdits.Length, actualSemanticEdits.Count); for (var i = 0; i < actualSemanticEdits.Count; i++) { var editKind = expectedSemanticEdits[i].Kind; Assert.Equal(editKind, actualSemanticEdits[i].Kind); var expectedOldSymbol = (editKind == SemanticEditKind.Update) ? expectedSemanticEdits[i].SymbolProvider(oldCompilation) : null; var expectedNewSymbol = expectedSemanticEdits[i].SymbolProvider(newCompilation); var actualOldSymbol = actualSemanticEdits[i].OldSymbol; var actualNewSymbol = actualSemanticEdits[i].NewSymbol; Assert.Equal(expectedOldSymbol, actualOldSymbol); Assert.Equal(expectedNewSymbol, actualNewSymbol); var expectedSyntaxMap = expectedSemanticEdits[i].SyntaxMap; var actualSyntaxMap = actualSemanticEdits[i].SyntaxMap; Assert.Equal(expectedSemanticEdits[i].PreserveLocalVariables, actualSemanticEdits[i].PreserveLocalVariables); if (expectedSyntaxMap != null) { Contract.ThrowIfNull(actualSyntaxMap); Assert.True(expectedSemanticEdits[i].PreserveLocalVariables); var newNodes = new List <SyntaxNode>(); foreach (var expectedSpanMapping in expectedSyntaxMap) { var newNode = FindNode(newRoot, expectedSpanMapping.Value); var expectedOldNode = FindNode(oldRoot, expectedSpanMapping.Key); var actualOldNode = actualSyntaxMap(newNode); Assert.Equal(expectedOldNode, actualOldNode); newNodes.Add(newNode); } } else if (!expectedSemanticEdits[i].PreserveLocalVariables) { Assert.Null(actualSyntaxMap); } } }
/// <summary> /// Builds an EditScript which patches the original data to the desired data and uses this to create the Patchup patch. /// </summary> /// <param name="from">The original byte data which the patch will be applied to.</param> /// <param name="to">The desired byte data which will result after applying the patch to the original byte data.</param> public void Build(byte[] from, byte[] to) { this.EditScript = MyersDiff.SingleThreaded(from, to); }
internal void VerifyRudeDiagnostics( EditScript <SyntaxNode> editScript, ActiveStatementsDescription description, RudeEditDiagnosticDescription[] expectedDiagnostics) { var oldActiveStatements = description.OldStatements; if (description.OldTrackingSpans != null) { Assert.Equal(oldActiveStatements.Length, description.OldTrackingSpans.Length); } var newSource = editScript.Match.NewRoot.SyntaxTree.ToString(); var oldSource = editScript.Match.OldRoot.SyntaxTree.ToString(); var oldText = SourceText.From(oldSource); var newText = SourceText.From(newSource); var diagnostics = new List <RudeEditDiagnostic>(); var actualNewActiveStatements = new ActiveStatement[oldActiveStatements.Length]; var actualNewExceptionRegions = new ImmutableArray <LinePositionSpan> [oldActiveStatements.Length]; var updatedActiveMethodMatches = new List <UpdatedMemberInfo>(); var editMap = BuildEditMap(editScript); var documentId = DocumentId.CreateNewId(ProjectId.CreateNewId("TestEnCProject"), "TestEnCDocument"); var spanTracker = Assert.IsType <TestActiveStatementSpanTracker>(Analyzer.GetTestAccessor().ActiveStatementSpanTracker); spanTracker.Spans = (description.OldTrackingSpans != null) ? new Dictionary <DocumentId, TextSpan?[]> { { documentId, description.OldTrackingSpans } } : null; Analyzer.GetTestAccessor().AnalyzeSyntax( editScript, editMap, oldText, newText, documentId, oldActiveStatements.AsImmutable(), actualNewActiveStatements, actualNewExceptionRegions, updatedActiveMethodMatches, diagnostics); diagnostics.Verify(newSource, expectedDiagnostics); // check active statements: AssertSpansEqual(description.NewSpans, actualNewActiveStatements.Select(s => s.Span), newSource, newText); if (diagnostics.Count == 0) { // check old exception regions: for (var i = 0; i < oldActiveStatements.Length; i++) { var actualOldExceptionRegions = Analyzer.GetExceptionRegions( oldText, editScript.Match.OldRoot, oldActiveStatements[i].Span, isNonLeaf: oldActiveStatements[i].IsNonLeaf, out _); AssertSpansEqual(description.OldRegions[i], actualOldExceptionRegions, oldSource, oldText); } // check new exception regions: Assert.Equal(description.NewRegions.Length, actualNewExceptionRegions.Length); for (var i = 0; i < description.NewRegions.Length; i++) { AssertSpansEqual(description.NewRegions[i], actualNewExceptionRegions[i], newSource, newText); } } else { for (var i = 0; i < oldActiveStatements.Length; i++) { Assert.Equal(0, description.NewRegions[i].Length); } } }
public void SetData(IList StringListA, IList StringListB, EditScript Script) { SetData(StringListA, StringListB, Script, String.Empty, String.Empty); }
internal void VerifySemantics( EditScript <SyntaxNode> editScript, ActiveStatementsDescription activeStatements, IEnumerable <string> additionalOldSources, IEnumerable <string> additionalNewSources, SemanticEditDescription[] expectedSemanticEdits, RudeEditDiagnosticDescription[] expectedDiagnostics) { var editMap = Analyzer.BuildEditMap(editScript); var oldRoot = editScript.Match.OldRoot; var newRoot = editScript.Match.NewRoot; var oldSource = oldRoot.SyntaxTree.ToString(); var newSource = newRoot.SyntaxTree.ToString(); var oldText = SourceText.From(oldSource); var newText = SourceText.From(newSource); IEnumerable <SyntaxTree> oldTrees = new[] { oldRoot.SyntaxTree }; IEnumerable <SyntaxTree> newTrees = new[] { newRoot.SyntaxTree }; if (additionalOldSources != null) { oldTrees = oldTrees.Concat(additionalOldSources.Select(s => ParseText(s))); } if (additionalOldSources != null) { newTrees = newTrees.Concat(additionalNewSources.Select(s => ParseText(s))); } var oldCompilation = CreateLibraryCompilation("Old", oldTrees); var newCompilation = CreateLibraryCompilation("New", newTrees); oldTrees.SelectMany(tree => tree.GetDiagnostics()).Where(d => d.Severity == DiagnosticSeverity.Error).Verify(); newTrees.SelectMany(tree => tree.GetDiagnostics()).Where(d => d.Severity == DiagnosticSeverity.Error).Verify(); var oldModel = oldCompilation.GetSemanticModel(oldRoot.SyntaxTree); var newModel = newCompilation.GetSemanticModel(newRoot.SyntaxTree); var oldActiveStatements = activeStatements.OldSpans.AsImmutable(); var updatedActiveMethodMatches = new List <ValueTuple <int, Match <SyntaxNode> > >(); var triviaEdits = new List <KeyValuePair <SyntaxNode, SyntaxNode> >(); var actualLineEdits = new List <LineChange>(); var actualSemanticEdits = new List <SemanticEdit>(); var diagnostics = new List <RudeEditDiagnostic>(); var actualNewActiveStatements = new LinePositionSpan[activeStatements.OldSpans.Length]; var actualNewExceptionRegions = new ImmutableArray <LinePositionSpan> [activeStatements.OldSpans.Length]; Analyzer.AnalyzeSyntax( editScript, editMap, oldText, newText, null, null, oldActiveStatements, actualNewActiveStatements, actualNewExceptionRegions, updatedActiveMethodMatches, diagnostics); diagnostics.Verify(newSource); Analyzer.AnalyzeTrivia( oldText, newText, editScript.Match, editMap, triviaEdits, actualLineEdits, diagnostics, default(CancellationToken)); diagnostics.Verify(newSource); Analyzer.AnalyzeSemantics( editScript, editMap, oldText, oldActiveStatements, triviaEdits, updatedActiveMethodMatches, oldModel, newModel, actualSemanticEdits, diagnostics, default(CancellationToken)); diagnostics.Verify(newSource, expectedDiagnostics); if (expectedSemanticEdits == null) { return; } Assert.Equal(expectedSemanticEdits.Length, actualSemanticEdits.Count); for (int i = 0; i < actualSemanticEdits.Count; i++) { var editKind = expectedSemanticEdits[i].Kind; Assert.Equal(editKind, actualSemanticEdits[i].Kind); var expectedOldSymbol = (editKind == SemanticEditKind.Update) ? expectedSemanticEdits[i].SymbolProvider(oldCompilation) : null; var expectedNewSymbol = expectedSemanticEdits[i].SymbolProvider(newCompilation); var actualOldSymbol = actualSemanticEdits[i].OldSymbol; var actualNewSymbol = actualSemanticEdits[i].NewSymbol; Assert.Equal(expectedOldSymbol, actualOldSymbol); Assert.Equal(expectedNewSymbol, actualNewSymbol); var expectedSyntaxMap = expectedSemanticEdits[i].SyntaxMap; var actualSyntaxMap = actualSemanticEdits[i].SyntaxMap; Assert.Equal(expectedSemanticEdits[i].PreserveLocalVariables, actualSemanticEdits[i].PreserveLocalVariables); if (expectedSyntaxMap != null) { Assert.NotNull(actualSyntaxMap); Assert.True(expectedSemanticEdits[i].PreserveLocalVariables); var newNodes = new List <SyntaxNode>(); foreach (var expectedSpanMapping in expectedSyntaxMap) { var newNode = FindNode(newRoot, expectedSpanMapping.Value); var expectedOldNode = FindNode(oldRoot, expectedSpanMapping.Key); var actualOldNode = actualSyntaxMap(newNode); Assert.Equal(expectedOldNode, actualOldNode); newNodes.Add(newNode); } AssertEx.SetEqual(newNodes, GetDeclarators(actualNewSymbol)); } else { Assert.Null(actualSyntaxMap); } } }
internal static void VerifySemantics( this EditScript <SyntaxNode> editScript, params SemanticEditDescription[] expectedSemanticEdits) { VerifySemantics(editScript, ActiveStatementsDescription.Empty, expectedSemanticEdits, capabilities: null); }
internal EditScriptAddOpened(int startTargetIndex, EditScript next) : base(next) { this._startTargetIndex = startTargetIndex; }
/// <summary> /// Sends the contents of the database to support. /// </summary> /// <param name="FileName">Name of file used to keep track of state changes.</param> /// <param name="IncludeUnchanged">If unchanged material should be included.</param> /// <param name="SendAsAlert">If an alert is to be sent.</param> public static async Task EvaluateDatabaseDiff(string FileName, bool IncludeUnchanged, bool SendAsAlert) { Dictionary <string, bool> CollectionNames = new Dictionary <string, bool>(); foreach (string CollectionName in await Database.GetCollections()) { CollectionNames[CollectionName] = true; } CollectionNames.Remove("DnsCache"); string[] Selection = new string[CollectionNames.Count]; CollectionNames.Keys.CopyTo(Selection, 0); StringBuilder Xml = new StringBuilder(); using (XmlDatabaseExport Output = new XmlDatabaseExport(Xml, true, 256)) { await Database.Export(Output, Selection); } string AppDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); FileName = Path.Combine(AppDataFolder, FileName); string CurrentState = Xml.ToString(); string PrevState = File.Exists(FileName) ? File.ReadAllText(FileName) : string.Empty; EditScript <string> Script = Difference.AnalyzeRows(PrevState, CurrentState); StringBuilder Markdown = new StringBuilder(); string Prefix; Markdown.Append("Database content changes (`"); Markdown.Append(FileName); Markdown.AppendLine("`):"); foreach (Step <string> Step in Script.Steps) { Markdown.AppendLine(); switch (Step.Operation) { case EditOperation.Keep: default: if (!IncludeUnchanged) { continue; } Prefix = ">\t"; break; case EditOperation.Insert: Prefix = "+>\t"; break; case EditOperation.Delete: Prefix = "->\t"; break; } Markdown.Append(Prefix); Markdown.AppendLine("```xml"); foreach (string Row in Step.Symbols) { Markdown.Append(Prefix); Markdown.Append(Row); Markdown.AppendLine(" "); } Markdown.Append(Prefix); Markdown.AppendLine("```"); } string DiffMsg = Markdown.ToString(); if (SendAsAlert) { await SendAlert(DiffMsg, "text/markdown"); } File.WriteAllText(FileName, CurrentState); File.WriteAllText(FileName + ".diff.md", DiffMsg); }
public static void VerifyEdits <TNode>(this EditScript <TNode> actual, params string[] expected) => AssertEx.Equal(expected, actual.Edits.Select(e => e.GetDebuggerDisplay()), itemSeparator: ",\r\n");
internal EditScriptRemoveOpened(int startSourceIndex, EditScript next) : base(next) { this._startSourceIndex = startSourceIndex; }
internal static void VerifyRudeDiagnostics( this EditScript <SyntaxNode> editScript, params RudeEditDiagnosticDescription[] expectedDiagnostics) { VerifyRudeDiagnostics(editScript, ActiveStatementsDescription.Empty, expectedDiagnostics); }
internal EditScriptRemove(int startSourceIndex, int endSourceIndex, EditScript next) : base(next) { this._startSourceIndex = startSourceIndex; this._endSourceIndex = endSourceIndex; }
internal static void VerifyPreserveLocalVariables(EditScript<SyntaxNode> edits, bool preserveLocalVariables) { var decl1 = (MethodDeclarationSyntax)((ClassDeclarationSyntax)((CompilationUnitSyntax)edits.Match.OldRoot).Members[0]).Members[0]; var body1 = ((MethodDeclarationSyntax)SyntaxFactory.SyntaxTree(decl1).GetRoot()).Body; var decl2 = (MethodDeclarationSyntax)((ClassDeclarationSyntax)((CompilationUnitSyntax)edits.Match.NewRoot).Members[0]).Members[0]; var body2 = ((MethodDeclarationSyntax)SyntaxFactory.SyntaxTree(decl2).GetRoot()).Body; var diagnostics = new List<RudeEditDiagnostic>(); var match = Analyzer.ComputeBodyMatch(body1, body2, Array.Empty<AbstractEditAndContinueAnalyzer.ActiveNode>(), diagnostics, out var oldHasStateMachineSuspensionPoint, out var newHasStateMachineSuspensionPoint); bool needsSyntaxMap = oldHasStateMachineSuspensionPoint && newHasStateMachineSuspensionPoint; // Active methods are detected to preserve local variables for variable mapping and // edited async/iterator methods are considered active. Assert.Equal(preserveLocalVariables, needsSyntaxMap); }
private void Awake() { es = GameObject.Find("Panel_Edit").GetComponent <EditScript>(); }