Skip to content

Commit

Permalink
parse edition syntax (#300)
Browse files Browse the repository at this point in the history
  • Loading branch information
disjukr committed Dec 10, 2023
1 parent aa80096 commit dc5949d
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 0 deletions.
12 changes: 12 additions & 0 deletions core/ast/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export type Node =

type index_Node =
| Syntax
| Edition
| Import
| Package
| Option
Expand All @@ -72,6 +73,7 @@ export type Statement =

export type TopLevelStatement =
| Syntax
| Edition
| Import
| Package
| Option
Expand All @@ -96,6 +98,16 @@ export interface Syntax extends StatementBase {
semi: Semi;
}

export interface Edition extends StatementBase {
type: "edition";
keyword: Keyword;
eq: Token;
quoteOpen: Token;
edition: Token;
quoteClose: Token;
semi: Semi;
}

export interface Import extends StatementBase {
type: "import";
keyword: Keyword;
Expand Down
38 changes: 38 additions & 0 deletions core/parser/proto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export function parse(text: string): ParseResult {
parser.on("comment", (comment) => comments.push(comment));
const statements = acceptStatements<ast.TopLevelStatement>(parser, [
acceptSyntax,
acceptEdition,
acceptImport,
acceptPackage,
acceptOption,
Expand Down Expand Up @@ -632,6 +633,43 @@ function acceptSyntax(
};
}

function acceptEdition(
parser: ProtoParser,
leadingComments: ast.CommentGroup[],
leadingDetachedComments: ast.CommentGroup[],
): ast.Edition | undefined {
const keyword = acceptKeyword(parser, "edition");
if (!keyword) return;
skipWsAndComments(parser);
const eq = parser.expect("=");
skipWsAndComments(parser);
const quoteOpen = parser.expect(/^['"]/);
const edition = parser.expect(/^[^'"]+/);
const quoteClose = parser.expect(/^['"]/);
skipWsAndComments(parser);
const semi = expectSemi(parser);
const trailingComments = acceptTrailingComments(parser);
return {
...mergeSpans([
leadingDetachedComments,
leadingComments,
keyword,
semi,
trailingComments,
]),
leadingComments,
trailingComments,
leadingDetachedComments,
type: "edition",
keyword,
eq,
quoteOpen,
edition,
quoteClose,
semi,
};
}

function acceptImport(
parser: ProtoParser,
leadingComments: ast.CommentGroup[],
Expand Down
11 changes: 11 additions & 0 deletions core/visitor/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export interface Visitor {
visitProto: VisitFn<ast.Proto>;
visitTopLevelStatement: VisitFn<ast.TopLevelStatement>;
visitSyntax: VisitFn<ast.Syntax>;
visitEdition: VisitFn<ast.Edition>;
visitImport: VisitFn<ast.Import>;
visitPackage: VisitFn<ast.Package>;
visitOption: VisitFn<ast.Option>;
Expand Down Expand Up @@ -107,6 +108,16 @@ export const visitor: Visitor = {
visitor.visitSemi(visitor, node.semi);
});
},
visitEdition(visitor, node) {
visitStatementBase(visitor, node, () => {
visitor.visitKeyword(visitor, node.keyword);
visitor.visitToken(visitor, node.eq);
visitor.visitToken(visitor, node.quoteOpen);
visitor.visitToken(visitor, node.edition);
visitor.visitToken(visitor, node.quoteClose);
visitor.visitSemi(visitor, node.semi);
});
},
visitImport(visitor, node) {
visitStatementBase(visitor, node, () => {
visitor.visitKeyword(visitor, node.keyword);
Expand Down

0 comments on commit dc5949d

Please sign in to comment.