コード例 #1
0
ファイル: SyntaxFactory.cs プロジェクト: TheTrigger/VoidMain
 public void LiteralToken(SyntaxTokenBuilder builder,
                          string input, int position, int length, string stringValue,
                          bool quoted = false, bool missing = false)
 {
     builder.InitializeWith(quoted ? SyntaxKind.QuotedLiteralToken : SyntaxKind.LiteralToken,
                            new TextSpan(input, position, length), stringValue, missing);
 }
コード例 #2
0
ファイル: SyntaxFactory.cs プロジェクト: TheTrigger/VoidMain
 public void IdentifierToken(SyntaxTokenBuilder builder,
                             string input, int position, int length, string stringValue,
                             bool missing = false)
 {
     builder.InitializeWith(SyntaxKind.IdentifierToken,
                            new TextSpan(input, position, length), stringValue, missing);
 }
コード例 #3
0
        private OptionSyntax ScanOption(ElementsCursor <SyntaxToken> cursor, List <SyntaxError> errors,
                                        SyntaxToken nameMarker, SyntaxToken name, IReadOnlyList <string> commandName)
        {
            SyntaxToken valueMarker = null;
            ValueSyntax value       = null;

            if (!HasMoreTokens(cursor))
            {
                return(new OptionSyntax(nameMarker, name, valueMarker, value));
            }

            var token = cursor.Peek();

            if (IsOptionValueMarker(token))
            {
                valueMarker = token;
                cursor.MoveNext();
                token = cursor.Peek();
            }
            else
            {
                if (!HasSpaceAfterOrEnd(name, token))
                {
                    var builder = new SyntaxTokenBuilder(name);
                    builder.TrailingTrivia = _syntaxFactory.WhitespaceTriviaAfter(name, length: 0, missing: true);
                    name = builder.Build();

                    errors.Add(_syntaxFactory.MissingWhitespaceError(name.TrailingTrivia.Span));
                }

                _semanticModel.TryGetOptionType(commandName, name.StringValue, out Type valueType);

                if (IsFlag(valueType))
                {
                    // Flag can have a value only if a value marker is specified
                    // because it have value 'true' by default.
                    return(new OptionSyntax(nameMarker, name, valueMarker, value));
                }
            }

            bool missingValue = valueMarker != null &&
                                (!HasMoreTokens(cursor) || (valueMarker.HasTrailingTrivia && IsOptionNameOrEndOfOptions(token, cursor.Peek(1))));

            if (missingValue)
            {
                SyntaxToken valueToken = null;
                var         builder    = new SyntaxTokenBuilder();
                var         span       = valueMarker.Span;
                _syntaxFactory.LiteralToken(builder, span.Source, span.End, 0, null, missing: true);

                if (valueMarker.HasTrailingTrivia)
                {
                    // Place trailing trivia after missing option value
                    builder.TrailingTrivia = valueMarker.TrailingTrivia;
                    valueToken             = builder.Build();

                    // and remove it from value marker.
                    builder.InitializeWith(valueMarker);
                    builder.TrailingTrivia = null;
                    valueMarker            = builder.Build();
                }
                else
                {
                    valueToken = builder.Build();
                }

                errors.Add(_syntaxFactory.MissingOptionValueError(valueToken.Span));
                value = new ValueSyntax(valueToken);
                return(new OptionSyntax(nameMarker, name, valueMarker, value));
            }

            bool isValue = (valueMarker != null && !valueMarker.HasTrailingTrivia) ||
                           !IsOptionNameOrEndOfOptions(token, cursor.Peek(1));

            if (isValue)
            {
                value = ScanValue(cursor, errors);
            }

            return(new OptionSyntax(nameMarker, name, valueMarker, value));
        }
コード例 #4
0
ファイル: SyntaxFactory.cs プロジェクト: TheTrigger/VoidMain
 public void ColonToken(SyntaxTokenBuilder builder,
                        string input, int position, bool missing = false)
 {
     builder.InitializeWith(SyntaxKind.ColonToken,
                            new TextSpan(input, position, 1), ":", missing);
 }
コード例 #5
0
ファイル: SyntaxFactory.cs プロジェクト: TheTrigger/VoidMain
 public void DashDashToken(SyntaxTokenBuilder builder,
                           string input, int position, bool missing = false)
 {
     builder.InitializeWith(SyntaxKind.DashDashToken,
                            new TextSpan(input, position, 2), "--", missing);
 }
コード例 #6
0
ファイル: SyntaxFactory.cs プロジェクト: TheTrigger/VoidMain
 public void EndOfInputToken(SyntaxTokenBuilder builder,
                             string input, int position, bool missing = false)
 {
     builder.InitializeWith(SyntaxKind.EndOfInputToken,
                            new TextSpan(input, position, 0), "<eoi>", missing);
 }