/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt VS Tools.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
/// This file contains definitions of basic QML syntax elements.
namespace QtVsTools.Qml.Syntax
{
///
/// Reference to a location in the source code parsed by the QML parser.
/// Maps one-to-one with the Span concept in the Visual Studio SDK.
///
public struct SourceLocation
{
public int Offset;
public int Length;
}
///
/// Token constants from the Qt Declarative parser.
///
public enum TokenKind
{
#region Copied from qqmljsgrammar_p.h
EOF_SYMBOL = 0,
REDUCE_HERE = 125,
T_AND = 1,
T_AND_AND = 2,
T_AND_EQ = 3,
T_ARROW = 93,
T_AS = 110,
T_AUTOMATIC_SEMICOLON = 62,
T_BREAK = 4,
T_CASE = 5,
T_CATCH = 6,
T_CLASS = 98,
T_COLON = 7,
T_COMMA = 8,
T_COMMENT = 91,
T_COMPATIBILITY_SEMICOLON = 92,
T_CONST = 86,
T_CONTINUE = 9,
T_DEBUGGER = 88,
T_DEFAULT = 10,
T_DELETE = 11,
T_DIVIDE_ = 12,
T_DIVIDE_EQ = 13,
T_DO = 14,
T_DOT = 15,
T_ELLIPSIS = 95,
T_ELSE = 16,
T_ENUM = 94,
T_EQ = 17,
T_EQ_EQ = 18,
T_EQ_EQ_EQ = 19,
T_ERROR = 114,
T_EXPORT = 101,
T_EXTENDS = 99,
T_FALSE = 85,
T_FEED_JS_EXPRESSION = 118,
T_FEED_JS_MODULE = 120,
T_FEED_JS_SCRIPT = 119,
T_FEED_JS_STATEMENT = 117,
T_FEED_UI_OBJECT_MEMBER = 116,
T_FEED_UI_PROGRAM = 115,
T_FINALLY = 20,
T_FOR = 21,
T_FORCE_BLOCK = 122,
T_FORCE_DECLARATION = 121,
T_FOR_LOOKAHEAD_OK = 123,
T_FROM = 102,
T_FUNCTION = 22,
T_GE = 23,
T_GET = 112,
T_GT = 24,
T_GT_GT = 25,
T_GT_GT_EQ = 26,
T_GT_GT_GT = 27,
T_GT_GT_GT_EQ = 28,
T_IDENTIFIER = 29,
T_IF = 30,
T_IMPORT = 108,
T_IN = 31,
T_INSTANCEOF = 32,
T_LBRACE = 33,
T_LBRACKET = 34,
T_LE = 35,
T_LET = 87,
T_LPAREN = 36,
T_LT = 37,
T_LT_LT = 38,
T_LT_LT_EQ = 39,
T_MINUS = 40,
T_MINUS_EQ = 41,
T_MINUS_MINUS = 42,
T_MULTILINE_STRING_LITERAL = 90,
T_NEW = 43,
T_NOT = 44,
T_NOT_EQ = 45,
T_NOT_EQ_EQ = 46,
T_NO_SUBSTITUTION_TEMPLATE = 103,
T_NULL = 83,
T_NUMERIC_LITERAL = 47,
T_OF = 111,
T_ON = 124,
T_OR = 48,
T_OR_EQ = 49,
T_OR_OR = 50,
T_PLUS = 51,
T_PLUS_EQ = 52,
T_PLUS_PLUS = 53,
T_PRAGMA = 109,
T_PROPERTY = 68,
T_PUBLIC = 107,
T_QUESTION = 54,
T_RBRACE = 55,
T_RBRACKET = 56,
T_READONLY = 70,
T_REMAINDER = 57,
T_REMAINDER_EQ = 58,
T_RESERVED_WORD = 89,
T_RETURN = 59,
T_RPAREN = 60,
T_SEMICOLON = 61,
T_SET = 113,
T_SIGNAL = 69,
T_STAR = 63,
T_STAR_EQ = 66,
T_STAR_STAR = 64,
T_STAR_STAR_EQ = 65,
T_STATIC = 100,
T_STRING_LITERAL = 67,
T_SUPER = 97,
T_SWITCH = 71,
T_TEMPLATE_HEAD = 104,
T_TEMPLATE_MIDDLE = 105,
T_TEMPLATE_TAIL = 106,
T_THIS = 72,
T_THROW = 73,
T_TILDE = 74,
T_TRUE = 84,
T_TRY = 75,
T_TYPEOF = 76,
T_VAR = 77,
T_VOID = 78,
T_WHILE = 79,
T_WITH = 80,
T_XOR = 81,
T_XOR_EQ = 82,
T_YIELD = 96,
ACCEPT_STATE = 1008,
RULE_COUNT = 586,
STATE_COUNT = 1009,
TERMINAL_COUNT = 126,
NON_TERMINAL_COUNT = 213,
GOTO_INDEX_OFFSET = 1009,
GOTO_INFO_OFFSET = 6012,
GOTO_CHECK_OFFSET = 6012
#endregion
}
public abstract class SyntaxElement { }
///
/// Represents a token identified by the QML lexer
///
public class Token : SyntaxElement
{
public TokenKind Kind { get; private set; }
public SourceLocation Location { get; private set; }
protected Token() { }
public static Token Create(TokenKind kind, int offset, int length)
{
return Create(kind, new SourceLocation
{
Offset = offset,
Length = length,
});
}
public static Token Create(TokenKind kind, SourceLocation location)
{
Token token;
switch (kind) {
#region case KEYWORD:
case TokenKind.T_AS:
case TokenKind.T_BREAK:
case TokenKind.T_CASE:
case TokenKind.T_CATCH:
case TokenKind.T_CONST:
case TokenKind.T_CONTINUE:
case TokenKind.T_DEFAULT:
case TokenKind.T_DELETE:
case TokenKind.T_DO:
case TokenKind.T_ELSE:
case TokenKind.T_ENUM:
case TokenKind.T_FALSE:
case TokenKind.T_FINALLY:
case TokenKind.T_FOR:
case TokenKind.T_FUNCTION:
case TokenKind.T_IF:
case TokenKind.T_IMPORT:
case TokenKind.T_IN:
case TokenKind.T_INSTANCEOF:
case TokenKind.T_LET:
case TokenKind.T_NEW:
case TokenKind.T_NULL:
case TokenKind.T_ON:
case TokenKind.T_PRAGMA:
case TokenKind.T_PROPERTY:
case TokenKind.T_PUBLIC:
case TokenKind.T_READONLY:
case TokenKind.T_RESERVED_WORD:
case TokenKind.T_RETURN:
case TokenKind.T_SET:
case TokenKind.T_SIGNAL:
case TokenKind.T_SWITCH:
case TokenKind.T_THIS:
case TokenKind.T_THROW:
case TokenKind.T_TRUE:
case TokenKind.T_TRY:
case TokenKind.T_TYPEOF:
case TokenKind.T_VAR:
case TokenKind.T_VOID:
case TokenKind.T_WHILE:
case TokenKind.T_WITH:
#endregion
token = new KeywordToken();
break;
case TokenKind.T_NUMERIC_LITERAL:
token = new NumberToken();
break;
case TokenKind.T_MULTILINE_STRING_LITERAL:
case TokenKind.T_STRING_LITERAL:
token = new StringToken();
break;
case TokenKind.T_COMMENT:
token = new CommentToken();
break;
default:
token = new Token();
break;
}
token.Kind = kind;
token.Location = location;
return token;
}
}
public class KeywordToken : Token { }
public class NumberToken : Token { }
public class StringToken : Token { }
public class CommentToken : Token { }
}