private SyntaxTree WithChanges(SourceText newText, IReadOnlyList <TextChangeRange> changes) { if (changes == null) { throw new ArgumentNullException(nameof(changes)); } var oldTree = this; // if changes is entire text do a full reparse if (changes.Count == 1 && changes[0].Span == new TextSpan(0, this.Length) && changes[0].NewLength == newText.Length) { // parser will do a full parse if we give it no changes changes = null; oldTree = null; } using (var lexer = new InternalSyntax.Lexer(newText, this.Options)) using (var parser = new InternalSyntax.LanguageParser(lexer, oldTree?.GetRoot(), changes)) { var compilationUnit = (CompilationUnitSyntax)parser.ParseCompilationUnit().CreateRed(); var tree = new ParsedSyntaxTree(newText, newText.Encoding, newText.ChecksumAlgorithm, this.FilePath, this.Options, compilationUnit, parser.Directives); tree.VerifySource(changes); return(tree); } }
/// <summary> /// Produces a syntax tree by parsing the source text. /// </summary> public static SyntaxTree ParseText( SourceText text, CSharpParseOptions options = null, string path = "", CancellationToken cancellationToken = default(CancellationToken)) { if (text == null) { throw new ArgumentNullException(nameof(text)); } options = options ?? CSharpParseOptions.Default; using (var lexer = new InternalSyntax.Lexer(text, options)) { using (var parser = new InternalSyntax.LanguageParser(lexer, oldTree: null, changes: null, cancellationToken: cancellationToken)) { var compilationUnit = (CompilationUnitSyntax)parser.ParseCompilationUnit().CreateRed(); var tree = new ParsedSyntaxTree(text, text.Encoding, text.ChecksumAlgorithm, path, options, compilationUnit, parser.Directives); tree.VerifySource(); return(tree); } } }
internal DirectiveParser(Lexer lexer, DirectiveStack context) : base(lexer, LexerMode.Directive, null, null, false) { _context = context; }