public virtual string Identifier([NotNull] string name, [CanBeNull] ICollection <string> scope = null) { Check.NotEmpty(name, nameof(name)); var builder = new StringBuilder(); var partStart = 0; for (var i = 0; i < name.Length; i++) { if (!SyntaxFacts.IsIdentifierPartCharacter(name[i])) { if (partStart != i) { builder.Append(name.Substring(partStart, i - partStart)); } partStart = i + 1; } } if (partStart != name.Length) { builder.Append(name.Substring(partStart)); } if (!SyntaxFacts.IsIdentifierStartCharacter(builder[0])) { builder.Insert(0, "_"); } var identifier = builder.ToString(); if (scope != null) { var uniqueIdentifier = identifier; var qualifier = 0; while (scope.Contains(uniqueIdentifier)) { uniqueIdentifier = identifier + qualifier++; } scope.Add(uniqueIdentifier); identifier = uniqueIdentifier; } if (SyntaxFacts.GetKeywordKind(identifier) != SyntaxKind.None || SyntaxFacts.GetPreprocessorKeywordKind(identifier) != SyntaxKind.None || SyntaxFacts.GetContextualKeywordKind(identifier) != SyntaxKind.None) { return("@" + identifier); } return(identifier); }
private void ReadIdentifierOrKeyword() { var start = _charReader.Position; // Skip first letter NextChar(); // The following characters can be letters, digits the underscore and the dollar sign. while (char.IsLetterOrDigit(_charReader.Current) || _charReader.Current == '_' || _charReader.Current == '$') { NextChar(); } var end = _charReader.Position; var span = TextSpan.FromBounds(start, end); var text = File.Text.GetSubText(span).ToString(); _kind = SyntaxFacts.GetKeywordKind(text); _contextualKind = (_mode == LexerMode.Directive) ? SyntaxFacts.GetPreprocessorKeywordKind(text) : SyntaxFacts.GetContextualKeywordKind(text); switch (_kind) { case SyntaxKind.TrueKeyword: _value = true; break; case SyntaxKind.FalseKeyword: _value = false; break; default: _value = text; break; } }