// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See the LICENSE file in the project root for full license information. #include "tree_sitter/parser.h" #include enum TOKEN_TYPE { STATEMENT_TERMINATOR }; /* --- API --- */ void *tree_sitter_powershell_external_scanner_create(); void tree_sitter_powershell_external_scanner_destroy(void *p); unsigned tree_sitter_powershell_external_scanner_serialize(void *payload, char *buffer); void tree_sitter_powershell_external_scanner_deserialize(void *payload, const char *buffer, unsigned length); bool tree_sitter_powershell_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols); /* --- Internal Functions --- */ static void skip(TSLexer *lexer) { lexer->advance(lexer, true); } static bool scan_statement_terminator(void *payload, TSLexer *lexer, const bool *valid_symbols) { if (valid_symbols[STATEMENT_TERMINATOR]) { lexer->result_symbol = STATEMENT_TERMINATOR; // This token has no characters -- everything is lookahead to determine its existence lexer->mark_end(lexer); for (;;) { if (lexer->lookahead == 0) return true; if (lexer->lookahead == '}') return true; if (lexer->lookahead == ';') return true; if (lexer->lookahead == ')') return true; if (lexer->lookahead == '\n') return true; if (!iswspace(lexer->lookahead)) return false; skip(lexer); } } return false; } /* --- API Implementation --- */ bool tree_sitter_powershell_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) { return scan_statement_terminator(payload, lexer, valid_symbols); } void *tree_sitter_powershell_external_scanner_create() { return NULL; } void tree_sitter_powershell_external_scanner_destroy(void *p) { } unsigned tree_sitter_powershell_external_scanner_serialize(void *payload, char *buffer) { return 0; } void tree_sitter_powershell_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) { }