@@ -10,6 +10,8 @@ const parser = require("./parser");
1010const tokens = require ( "./tokens" ) ;
1111const AST = require ( "./ast" ) ;
1212
13+ const DEFAULT_PHP_VERSION = "8.4" ;
14+
1315/**
1416 * @private
1517 */
@@ -43,10 +45,10 @@ function combine(src, to) {
4345 * @example
4446 * var parser = require('php-parser');
4547 * var instance = new parser({
48+ * version: 704 // or '7.4'
4649 * parser: {
4750 * extractDoc: true,
4851 * suppressErrors: true,
49- * version: 704 // or '7.4'
5052 * },
5153 * ast: {
5254 * withPositions: true
@@ -81,30 +83,40 @@ const Engine = function (options) {
8183 if ( ! options . lexer ) {
8284 options . lexer = { } ;
8385 }
84- if ( options . parser . version ) {
85- if ( typeof options . parser . version === "string" ) {
86- let version = options . parser . version . split ( "." ) ;
87- version = parseInt ( version [ 0 ] ) * 100 + parseInt ( version [ 1 ] ) ;
88- if ( isNaN ( version ) ) {
89- throw new Error ( "Bad version number : " + options . parser . version ) ;
90- } else {
91- options . parser . version = version ;
92- }
93- } else if ( typeof options . parser . version !== "number" ) {
94- throw new Error ( "Expecting a number for version" ) ;
95- }
96- if ( options . parser . version < 500 || options . parser . version > 900 ) {
97- throw new Error ( "Can only handle versions between 5.x to 8.x" ) ;
98- }
99- }
10086 }
10187 combine ( options , this ) ;
102-
103- // same version flags based on parser options
104- this . lexer . version = this . parser . version ;
10588 }
89+
90+ // options.parser.version is deprecated, use options.version instead
91+ const versionString = options ?. version ?? options ?. parser ?. version ;
92+ this . version = normalizeVersion ( versionString ?? DEFAULT_PHP_VERSION ) ;
10693} ;
10794
95+ /**
96+ * Validate and normalize a version (string or number) to a version number
97+ * @private
98+ * @param {String|Number } versionString - The version string or number to
99+ * validate and normalize, e.g., "7.4", or 704
100+ * @return {Number } - The normalized version number, e.g. 704
101+ * @throws {Error } - If the version is not a valid number or out of range
102+ */
103+ function normalizeVersion ( versionString ) {
104+ let version = versionString ;
105+ if ( typeof version === "string" ) {
106+ const versionParts = version . split ( "." ) ;
107+ version = parseInt ( versionParts [ 0 ] ) * 100 + parseInt ( versionParts [ 1 ] ) ;
108+ if ( isNaN ( version ) ) {
109+ throw new Error ( "Bad version number : " + versionString ) ;
110+ }
111+ } else if ( typeof version !== "number" ) {
112+ throw new Error ( "Expecting a string or number for version" ) ;
113+ }
114+ if ( version < 500 || version > 900 ) {
115+ throw new Error ( "Can only handle versions between 5.x to 8.x" ) ;
116+ }
117+ return version ;
118+ }
119+
108120/**
109121 * Check if the inpyt is a buffer or a string
110122 * @private
0 commit comments