示例#1
0
        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);
        }
示例#2
0
        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;
            }
        }