|
@@ -69,13 +69,13 @@ class ParentsStack {
|
|
|
class JSONState implements languages.IState {
|
|
|
private _state: languages.IState;
|
|
|
|
|
|
- public scanError: json.ScanError;
|
|
|
+ public scanError: ScanError;
|
|
|
public lastWasColon: boolean;
|
|
|
public parents: ParentsStack | null;
|
|
|
|
|
|
constructor(
|
|
|
state: languages.IState,
|
|
|
- scanError: json.ScanError,
|
|
|
+ scanError: ScanError,
|
|
|
lastWasColon: boolean,
|
|
|
parents: ParentsStack | null
|
|
|
) {
|
|
@@ -112,6 +112,36 @@ class JSONState implements languages.IState {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const enum ScanError {
|
|
|
+ None = 0,
|
|
|
+ UnexpectedEndOfComment = 1,
|
|
|
+ UnexpectedEndOfString = 2,
|
|
|
+ UnexpectedEndOfNumber = 3,
|
|
|
+ InvalidUnicode = 4,
|
|
|
+ InvalidEscapeCharacter = 5,
|
|
|
+ InvalidCharacter = 6
|
|
|
+}
|
|
|
+
|
|
|
+const enum SyntaxKind {
|
|
|
+ OpenBraceToken = 1,
|
|
|
+ CloseBraceToken = 2,
|
|
|
+ OpenBracketToken = 3,
|
|
|
+ CloseBracketToken = 4,
|
|
|
+ CommaToken = 5,
|
|
|
+ ColonToken = 6,
|
|
|
+ NullKeyword = 7,
|
|
|
+ TrueKeyword = 8,
|
|
|
+ FalseKeyword = 9,
|
|
|
+ StringLiteral = 10,
|
|
|
+ NumericLiteral = 11,
|
|
|
+ LineCommentTrivia = 12,
|
|
|
+ BlockCommentTrivia = 13,
|
|
|
+ LineBreakTrivia = 14,
|
|
|
+ Trivia = 15,
|
|
|
+ Unknown = 16,
|
|
|
+ EOF = 17
|
|
|
+}
|
|
|
+
|
|
|
function tokenize(
|
|
|
comments: boolean,
|
|
|
line: string,
|
|
@@ -124,11 +154,11 @@ function tokenize(
|
|
|
let adjustOffset = false;
|
|
|
|
|
|
switch (state.scanError) {
|
|
|
- case json.ScanError.UnexpectedEndOfString:
|
|
|
+ case ScanError.UnexpectedEndOfString:
|
|
|
line = '"' + line;
|
|
|
numberOfInsertedCharacters = 1;
|
|
|
break;
|
|
|
- case json.ScanError.UnexpectedEndOfComment:
|
|
|
+ case ScanError.UnexpectedEndOfComment:
|
|
|
line = '/*' + line;
|
|
|
numberOfInsertedCharacters = 2;
|
|
|
break;
|
|
@@ -147,8 +177,8 @@ function tokenize(
|
|
|
let offset = offsetDelta + scanner.getPosition();
|
|
|
let type = '';
|
|
|
|
|
|
- const kind = scanner.scan();
|
|
|
- if (kind === json.SyntaxKind.EOF) {
|
|
|
+ const kind = <SyntaxKind><any>scanner.scan();
|
|
|
+ if (kind === SyntaxKind.EOF) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -168,50 +198,50 @@ function tokenize(
|
|
|
|
|
|
// brackets and type
|
|
|
switch (kind) {
|
|
|
- case json.SyntaxKind.OpenBraceToken:
|
|
|
+ case SyntaxKind.OpenBraceToken:
|
|
|
parents = ParentsStack.push(parents, JSONParent.Object);
|
|
|
type = TOKEN_DELIM_OBJECT;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.CloseBraceToken:
|
|
|
+ case SyntaxKind.CloseBraceToken:
|
|
|
parents = ParentsStack.pop(parents);
|
|
|
type = TOKEN_DELIM_OBJECT;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.OpenBracketToken:
|
|
|
+ case SyntaxKind.OpenBracketToken:
|
|
|
parents = ParentsStack.push(parents, JSONParent.Array);
|
|
|
type = TOKEN_DELIM_ARRAY;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.CloseBracketToken:
|
|
|
+ case SyntaxKind.CloseBracketToken:
|
|
|
parents = ParentsStack.pop(parents);
|
|
|
type = TOKEN_DELIM_ARRAY;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.ColonToken:
|
|
|
+ case SyntaxKind.ColonToken:
|
|
|
type = TOKEN_DELIM_COLON;
|
|
|
lastWasColon = true;
|
|
|
break;
|
|
|
- case json.SyntaxKind.CommaToken:
|
|
|
+ case SyntaxKind.CommaToken:
|
|
|
type = TOKEN_DELIM_COMMA;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.TrueKeyword:
|
|
|
- case json.SyntaxKind.FalseKeyword:
|
|
|
+ case SyntaxKind.TrueKeyword:
|
|
|
+ case SyntaxKind.FalseKeyword:
|
|
|
type = TOKEN_VALUE_BOOLEAN;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.NullKeyword:
|
|
|
+ case SyntaxKind.NullKeyword:
|
|
|
type = TOKEN_VALUE_NULL;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.StringLiteral:
|
|
|
+ case SyntaxKind.StringLiteral:
|
|
|
const currentParent = parents ? parents.type : JSONParent.Object;
|
|
|
const inArray = currentParent === JSONParent.Array;
|
|
|
type = lastWasColon || inArray ? TOKEN_VALUE_STRING : TOKEN_PROPERTY_NAME;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
|
- case json.SyntaxKind.NumericLiteral:
|
|
|
+ case SyntaxKind.NumericLiteral:
|
|
|
type = TOKEN_VALUE_NUMBER;
|
|
|
lastWasColon = false;
|
|
|
break;
|
|
@@ -220,10 +250,10 @@ function tokenize(
|
|
|
// comments, iff enabled
|
|
|
if (comments) {
|
|
|
switch (kind) {
|
|
|
- case json.SyntaxKind.LineCommentTrivia:
|
|
|
+ case SyntaxKind.LineCommentTrivia:
|
|
|
type = TOKEN_COMMENT_LINE;
|
|
|
break;
|
|
|
- case json.SyntaxKind.BlockCommentTrivia:
|
|
|
+ case SyntaxKind.BlockCommentTrivia:
|
|
|
type = TOKEN_COMMENT_BLOCK;
|
|
|
break;
|
|
|
}
|
|
@@ -231,7 +261,7 @@ function tokenize(
|
|
|
|
|
|
ret.endState = new JSONState(
|
|
|
state.getStateData(),
|
|
|
- scanner.getTokenError(),
|
|
|
+ <ScanError><any>scanner.getTokenError(),
|
|
|
lastWasColon,
|
|
|
parents
|
|
|
);
|