protected SyntaxDiagnosticInfo[] GetErrors(int leadingTriviaWidth) { if (_errors != null) { if (leadingTriviaWidth > 0) { var array = new SyntaxDiagnosticInfo[_errors.Count]; for (int i = 0; i < _errors.Count; i++) { // fixup error positioning to account for leading trivia array[i] = _errors[i].WithOffset(_errors[i].Offset + leadingTriviaWidth); } return(array); } else { return(_errors.ToArray()); } } else { return(null); } }
protected void AddError(SyntaxDiagnosticInfo error) { if (error != null) { if (_errors == null) { _errors = new List <SyntaxDiagnosticInfo>(8); } _errors.Add(error); } }
public char NextCharOrUnicodeEscape(out char surrogateCharacter, out SyntaxDiagnosticInfo info) { var ch = this.PeekChar(); Debug.Assert(ch != InvalidCharacter, "Precondition established by all callers; required for correctness of AdvanceChar() call."); if (ch == '\\') { var ch2 = this.PeekChar(1); if (ch2 == 'U' || ch2 == 'u') { return(this.ScanUnicodeEscape(peek: false, surrogateCharacter: out surrogateCharacter, info: out info)); } } surrogateCharacter = InvalidCharacter; info = null; this.AdvanceChar(); return(ch); }
private char ScanUnicodeEscape(bool peek, out char surrogateCharacter, out SyntaxDiagnosticInfo info) { surrogateCharacter = InvalidCharacter; info = null; int start = this.Position; char character = this.PeekChar(); Debug.Assert(character == '\\'); this.AdvanceChar(); character = this.PeekChar(); if (character == 'U') { uint uintChar = 0; this.AdvanceChar(); if (!SyntaxFacts.IsHexDigit(this.PeekChar())) { if (!peek) { info = CreateIllegalEscapeDiagnostic(start); } } else { for (int i = 0; i < 8; i++) { character = this.PeekChar(); if (!SyntaxFacts.IsHexDigit(character)) { if (!peek) { info = CreateIllegalEscapeDiagnostic(start); } break; } uintChar = (uint)((uintChar << 4) + SyntaxFacts.HexValue(character)); this.AdvanceChar(); } if (uintChar > 0x0010FFFF) { if (!peek) { info = CreateIllegalEscapeDiagnostic(start); } } else { character = GetCharsFromUtf32(uintChar, out surrogateCharacter); } } } else { Debug.Assert(character == 'u' || character == 'x'); int intChar = 0; this.AdvanceChar(); if (!SyntaxFacts.IsHexDigit(this.PeekChar())) { if (!peek) { info = CreateIllegalEscapeDiagnostic(start); } } else { for (int i = 0; i < 4; i++) { char ch2 = this.PeekChar(); if (!SyntaxFacts.IsHexDigit(ch2)) { if (character == 'u') { if (!peek) { info = CreateIllegalEscapeDiagnostic(start); } } break; } intChar = (intChar << 4) + SyntaxFacts.HexValue(ch2); this.AdvanceChar(); } character = (char)intChar; } } return(character); }
public char NextUnicodeEscape(out char surrogateCharacter, out SyntaxDiagnosticInfo info) { return(ScanUnicodeEscape(peek: false, surrogateCharacter: out surrogateCharacter, info: out info)); }