@futpib/parser 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +1 -1
  7. package/build/allSettledStream.test.js +2 -2
  8. package/build/androidPackageParser.d.ts +1 -1
  9. package/build/androidPackageParser.js +5 -3
  10. package/build/androidPackageParser.test.js +7 -7
  11. package/build/androidPackageUnparser.d.ts +2 -2
  12. package/build/androidPackageUnparser.js +18 -14
  13. package/build/androidPackageUnparser.test.js +7 -7
  14. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  15. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  16. package/build/arbitraryDalvikBytecode.js +640 -0
  17. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  18. package/build/arbitraryDalvikExecutable.js +282 -0
  19. package/build/arbitraryDosDateTime.js +1 -0
  20. package/build/arbitraryZipStream.js +1 -1
  21. package/build/arrayParser.js +2 -2
  22. package/build/arrayUnparser.d.ts +1 -1
  23. package/build/backsmali.d.ts +3 -1
  24. package/build/backsmali.js +31 -3
  25. package/build/bash.d.ts +84 -0
  26. package/build/bash.js +1 -0
  27. package/build/bashParser.d.ts +6 -0
  28. package/build/bashParser.js +294 -0
  29. package/build/bashParser.test.d.ts +1 -0
  30. package/build/bashParser.test.js +181 -0
  31. package/build/customInvariant.d.ts +2 -1
  32. package/build/customInvariant.js +4 -6
  33. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  34. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  35. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  36. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  37. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  38. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  39. package/build/dalvikBytecodeParser.d.ts +1105 -5
  40. package/build/dalvikBytecodeParser.js +658 -205
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  42. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  43. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  44. package/build/dalvikBytecodeUnparser.js +642 -0
  45. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  46. package/build/dalvikBytecodeUnparser.test.js +25 -0
  47. package/build/dalvikExecutable.d.ts +65 -8
  48. package/build/dalvikExecutable.js +36 -0
  49. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  50. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  51. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  52. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  53. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  54. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  55. package/build/dalvikExecutableParser.d.ts +2 -2
  56. package/build/dalvikExecutableParser.js +655 -337
  57. package/build/dalvikExecutableParser.test.js +24 -22
  58. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  59. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  60. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  61. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  62. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  63. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  65. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  66. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  67. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  68. package/build/dalvikExecutableUnparser/utils.js +108 -0
  69. package/build/dalvikExecutableUnparser.d.ts +4 -0
  70. package/build/dalvikExecutableUnparser.js +406 -0
  71. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  72. package/build/dalvikExecutableUnparser.test.js +31 -0
  73. package/build/debugLogInputParser.js +1 -1
  74. package/build/disjunctionParser.d.ts +2 -2
  75. package/build/disjunctionParser.js +2 -2
  76. package/build/elementTerminatedArrayParser.d.ts +2 -2
  77. package/build/elementTerminatedArrayParser.js +1 -1
  78. package/build/elementTerminatedArrayParser.test.js +5 -5
  79. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  80. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  81. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  82. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  83. package/build/elementTerminatedSequenceParser.js +1 -1
  84. package/build/elementTerminatedSequenceParser.test.js +2 -2
  85. package/build/endOfInputParser.d.ts +1 -1
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/fetchCid.js +2 -6
  89. package/build/fetchCid.test.d.ts +1 -0
  90. package/build/fetchCid.test.js +16 -0
  91. package/build/fixedLengthSequenceParser.test.js +2 -2
  92. package/build/hasExecutable.js +2 -2
  93. package/build/highResolutionTimer.js +1 -1
  94. package/build/index.d.ts +24 -2
  95. package/build/index.js +22 -1
  96. package/build/inputReader.d.ts +1 -1
  97. package/build/inputReader.test.js +33 -45
  98. package/build/javaKeyStoreParser.test.js +6 -6
  99. package/build/jsonParser.js +8 -8
  100. package/build/lazyMessageError.d.ts +48 -0
  101. package/build/lazyMessageError.js +53 -0
  102. package/build/lazyMessageError.test.d.ts +1 -0
  103. package/build/lazyMessageError.test.js +15 -0
  104. package/build/leb128Parser.d.ts +1 -1
  105. package/build/leb128Parser.js +10 -10
  106. package/build/leb128Parser.test.js +7 -7
  107. package/build/negativeLookaheadParser.js +2 -2
  108. package/build/negativeLookaheadParser.test.js +4 -4
  109. package/build/noStackCaptureOverheadError.d.ts +4 -0
  110. package/build/noStackCaptureOverheadError.js +9 -0
  111. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  112. package/build/noStackCaptureOverheadError.test.js +15 -0
  113. package/build/nonEmptyArrayParser.js +2 -2
  114. package/build/nonEmptyArrayParser.test.js +2 -1
  115. package/build/optionalParser.js +2 -2
  116. package/build/parser.d.ts +2 -1
  117. package/build/parser.js +23 -8
  118. package/build/parser.test.js +78 -29
  119. package/build/parserConsumedSequenceParser.d.ts +1 -1
  120. package/build/parserConsumedSequenceParser.js +2 -2
  121. package/build/parserContext.d.ts +8 -6
  122. package/build/parserContext.js +60 -33
  123. package/build/parserContext.test.js +7 -3
  124. package/build/parserError.d.ts +603 -44
  125. package/build/parserError.js +98 -53
  126. package/build/parserImplementationInvariant.d.ts +1 -1
  127. package/build/parserImplementationInvariant.js +2 -2
  128. package/build/parserInputCompanion.js +2 -2
  129. package/build/promiseCompose.js +1 -2
  130. package/build/regexpParser.d.ts +2 -0
  131. package/build/regexpParser.js +71 -0
  132. package/build/regexpParser.test.d.ts +1 -0
  133. package/build/regexpParser.test.js +83 -0
  134. package/build/regularExpression.d.ts +63 -0
  135. package/build/regularExpression.js +1 -0
  136. package/build/regularExpressionParser.d.ts +3 -0
  137. package/build/regularExpressionParser.js +580 -0
  138. package/build/regularExpressionParser.test.d.ts +1 -0
  139. package/build/regularExpressionParser.test.js +89 -0
  140. package/build/separatedArrayParser.js +2 -2
  141. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  142. package/build/separatedNonEmptyArrayParser.js +40 -0
  143. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  144. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  145. package/build/sequenceBuffer.js +1 -1
  146. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  147. package/build/sequenceTerminatedSequenceParser.js +3 -3
  148. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  149. package/build/sequenceUnparser.d.ts +1 -1
  150. package/build/skipToParser.d.ts +1 -1
  151. package/build/skipToParser.js +2 -2
  152. package/build/sliceBoundedParser.test.js +4 -9
  153. package/build/smali.d.ts +1 -1
  154. package/build/smali.js +6 -2
  155. package/build/smaliParser.d.ts +62 -6
  156. package/build/smaliParser.js +1721 -296
  157. package/build/smaliParser.test.js +338 -43
  158. package/build/stringFromAsyncIterable.d.ts +1 -0
  159. package/build/stringFromAsyncIterable.js +7 -0
  160. package/build/terminatedArrayParser.js +4 -4
  161. package/build/terminatedArrayParser.test.js +7 -7
  162. package/build/toAsyncIterator.js +4 -4
  163. package/build/unionParser.d.ts +1 -1
  164. package/build/unionParser.js +2 -2
  165. package/build/unionParser.test.js +3 -3
  166. package/build/unparser.d.ts +3 -3
  167. package/build/unparser.js +6 -4
  168. package/build/unparser.test.js +7 -19
  169. package/build/unparserContext.d.ts +2 -2
  170. package/build/unparserContext.js +2 -3
  171. package/build/unparserError.d.ts +2 -1
  172. package/build/unparserError.js +2 -1
  173. package/build/unparserImplementationInvariant.d.ts +1 -1
  174. package/build/unparserOutputCompanion.d.ts +1 -1
  175. package/build/unparserOutputCompanion.js +1 -1
  176. package/build/zipParser.js +1 -1
  177. package/build/zipUnparser.d.ts +3 -3
  178. package/build/zipUnparser.js +9 -19
  179. package/build/zipUnparser.test.js +1 -1
  180. package/package.json +20 -26
  181. package/src/allSettledStream.test.ts +2 -2
  182. package/src/allSettledStream.ts +3 -3
  183. package/src/androidPackageParser.test.ts +17 -19
  184. package/src/androidPackageParser.ts +129 -171
  185. package/src/androidPackageUnparser.test.ts +19 -21
  186. package/src/androidPackageUnparser.ts +23 -17
  187. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  188. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  189. package/src/arbitraryDalvikBytecode.ts +992 -0
  190. package/src/arbitraryDalvikExecutable.ts +434 -0
  191. package/src/arbitraryDosDateTime.ts +1 -0
  192. package/src/arbitraryZipStream.ts +1 -1
  193. package/src/arrayParser.ts +2 -2
  194. package/src/arrayUnparser.ts +2 -2
  195. package/src/backsmali.ts +48 -4
  196. package/src/bash.ts +120 -0
  197. package/src/bashParser.test.ts +332 -0
  198. package/src/bashParser.ts +461 -0
  199. package/src/bsonParser.test.ts +12 -14
  200. package/src/customInvariant.ts +8 -12
  201. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  202. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  203. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  204. package/src/dalvikBytecodeParser.ts +1042 -243
  205. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  206. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  207. package/src/dalvikBytecodeUnparser.ts +758 -0
  208. package/src/dalvikExecutable.ts +110 -48
  209. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  210. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  211. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  212. package/src/dalvikExecutableParser.test.ts +60 -60
  213. package/src/dalvikExecutableParser.test.ts.md +6 -6
  214. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  215. package/src/dalvikExecutableParser.ts +911 -434
  216. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  217. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  218. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  219. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  220. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  221. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  222. package/src/dalvikExecutableUnparser.test.ts +57 -0
  223. package/src/dalvikExecutableUnparser.ts +581 -0
  224. package/src/debugLogInputParser.ts +1 -1
  225. package/src/disjunctionParser.ts +5 -5
  226. package/src/elementTerminatedArrayParser.test.ts +8 -8
  227. package/src/elementTerminatedArrayParser.ts +2 -2
  228. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  229. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  230. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  231. package/src/elementTerminatedSequenceParser.ts +2 -2
  232. package/src/endOfInputParser.ts +1 -1
  233. package/src/exactElementSwitchParser.ts +41 -0
  234. package/src/fetchCid.test.ts +20 -0
  235. package/src/fetchCid.ts +3 -7
  236. package/src/fixedLengthSequenceParser.test.ts +10 -12
  237. package/src/hasExecutable.ts +2 -2
  238. package/src/highResolutionTimer.ts +1 -1
  239. package/src/index.ts +113 -2
  240. package/src/inputReader.test.ts +39 -52
  241. package/src/inputReader.ts +2 -4
  242. package/src/inputReaderState.ts +1 -1
  243. package/src/inspect.ts +1 -1
  244. package/src/javaKeyStoreParser.test.ts +12 -14
  245. package/src/javaKeyStoreParser.ts +2 -6
  246. package/src/jsonParser.test.ts +2 -4
  247. package/src/jsonParser.ts +34 -38
  248. package/src/lazyMessageError.test.ts +21 -0
  249. package/src/lazyMessageError.ts +88 -0
  250. package/src/leb128Parser.test.ts +25 -23
  251. package/src/leb128Parser.ts +19 -19
  252. package/src/negativeLookaheadParser.test.ts +7 -11
  253. package/src/negativeLookaheadParser.ts +2 -2
  254. package/src/noStackCaptureOverheadError.test.ts +17 -0
  255. package/src/noStackCaptureOverheadError.ts +12 -0
  256. package/src/nonEmptyArrayParser.test.ts +3 -2
  257. package/src/nonEmptyArrayParser.ts +2 -2
  258. package/src/optionalParser.ts +2 -2
  259. package/src/parser.test.ts +96 -43
  260. package/src/parser.test.ts.md +13 -6
  261. package/src/parser.test.ts.snap +0 -0
  262. package/src/parser.ts +35 -12
  263. package/src/parserAccessorParser.ts +1 -1
  264. package/src/parserConsumedSequenceParser.ts +3 -3
  265. package/src/parserContext.test.ts +7 -3
  266. package/src/parserContext.ts +82 -48
  267. package/src/parserError.ts +143 -63
  268. package/src/parserImplementationInvariant.ts +3 -3
  269. package/src/parserInputCompanion.ts +2 -2
  270. package/src/promiseCompose.ts +2 -2
  271. package/src/regexpParser.test.ts +186 -0
  272. package/src/regexpParser.ts +94 -0
  273. package/src/regularExpression.ts +24 -0
  274. package/src/regularExpressionParser.test.ts +102 -0
  275. package/src/regularExpressionParser.ts +921 -0
  276. package/src/separatedArrayParser.ts +3 -3
  277. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  278. package/src/separatedNonEmptyArrayParser.ts +61 -0
  279. package/src/sequenceBuffer.test.ts +9 -9
  280. package/src/sequenceBuffer.ts +4 -4
  281. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  282. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  283. package/src/sequenceUnparser.ts +2 -2
  284. package/src/skipToParser.ts +2 -2
  285. package/src/sliceBoundedParser.test.ts +4 -12
  286. package/src/sliceBoundedParser.ts +2 -2
  287. package/src/smali.ts +8 -3
  288. package/src/smaliParser.test.ts +377 -66
  289. package/src/smaliParser.test.ts.md +1635 -48
  290. package/src/smaliParser.test.ts.snap +0 -0
  291. package/src/smaliParser.ts +2751 -569
  292. package/src/stringFromAsyncIterable.ts +9 -0
  293. package/src/terminatedArrayParser.test.ts +11 -11
  294. package/src/terminatedArrayParser.ts +5 -7
  295. package/src/toAsyncIterator.ts +8 -8
  296. package/src/uint8Array.ts +2 -3
  297. package/src/unionParser.test.ts +22 -23
  298. package/src/unionParser.ts +6 -8
  299. package/src/unparser.test.ts +18 -34
  300. package/src/unparser.ts +13 -9
  301. package/src/unparserContext.ts +9 -13
  302. package/src/unparserError.ts +2 -1
  303. package/src/unparserImplementationInvariant.ts +1 -1
  304. package/src/unparserOutputCompanion.ts +1 -1
  305. package/src/zip.ts +2 -6
  306. package/src/zipParser.ts +10 -18
  307. package/src/zipUnparser.test.ts +1 -1
  308. package/src/zipUnparser.ts +52 -64
  309. package/tsconfig.json +7 -1
  310. package/xo.config.ts +15 -0
  311. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -2,10 +2,12 @@ import test from 'ava';
2
2
  import { stringParserInputCompanion } from './parserInputCompanion.js';
3
3
  import { getParserName, runParser } from './parser.js';
4
4
  import { fetchCid } from './fetchCid.js';
5
- import { smaliAnnotationParser, smaliCodeParameterParser, smaliFieldParser, smaliParser } from './smaliParser.js';
5
+ import { smaliAnnotationParser, smaliCodeOperationParser, smaliCodeParameterParser, smaliCommentParser, smaliFieldParser, smaliMethodParser, smaliParser, } from './smaliParser.js';
6
6
  import { hasExecutable } from './hasExecutable.js';
7
7
  import { baksmaliClass } from './backsmali.js';
8
8
  const hasBaksmaliPromise = hasExecutable('baksmali');
9
+ const stringParserTestSnapshot = Symbol('stringParserTestSnapshot');
10
+ const stringParserTestIgnore = Symbol('stringParserTestIgnore');
9
11
  function stringParserTest(parser, examples) {
10
12
  const parserName = getParserName(parser);
11
13
  for (const [input, expected] of examples) {
@@ -13,23 +15,63 @@ function stringParserTest(parser, examples) {
13
15
  const actual = await runParser(parser, input, stringParserInputCompanion, {
14
16
  errorJoinMode: 'all',
15
17
  });
16
- t.deepEqual(actual, expected);
18
+ if (expected === stringParserTestIgnore) {
19
+ t.pass('skipping test because expected is stringParserTestIgnore');
20
+ }
21
+ else if (expected === stringParserTestSnapshot) {
22
+ t.snapshot(actual);
23
+ }
24
+ else {
25
+ t.deepEqual(actual, expected);
26
+ }
17
27
  });
18
28
  }
19
29
  }
30
+ stringParserTest(smaliCommentParser, [
31
+ [
32
+ '# this is a comment \n',
33
+ ' this is a comment ',
34
+ ],
35
+ ]);
20
36
  stringParserTest(smaliCodeParameterParser, [
21
37
  [
22
38
  ' .param p1\n',
23
39
  {
24
- index: 1,
25
- prefix: 'p',
40
+ register: {
41
+ index: 1,
42
+ prefix: 'p',
43
+ },
44
+ name: undefined,
45
+ annotation: undefined,
26
46
  },
27
47
  ],
28
48
  [
29
49
  ' .param p1, "savedInstanceState" # Landroid/os/Bundle;\n',
30
50
  {
31
- index: 1,
32
- prefix: 'p',
51
+ register: {
52
+ index: 1,
53
+ prefix: 'p',
54
+ },
55
+ name: 'savedInstanceState',
56
+ annotation: undefined,
57
+ },
58
+ ],
59
+ [
60
+ ` .param p1 # Ljava/lang/ClassLoader;
61
+ .annotation build Landroid/annotation/NonNull;
62
+ .end annotation
63
+ .end param\n`,
64
+ {
65
+ register: {
66
+ index: 1,
67
+ prefix: 'p',
68
+ },
69
+ name: undefined,
70
+ annotation: {
71
+ visibility: 'build',
72
+ type: 'Landroid/annotation/NonNull;',
73
+ elements: [],
74
+ },
33
75
  },
34
76
  ],
35
77
  ]);
@@ -37,32 +79,98 @@ stringParserTest(smaliFieldParser, [
37
79
  [
38
80
  '.field private barcodeScannerView:Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;\n',
39
81
  {
40
- accessFlags: {
41
- abstract: false,
42
- annotation: false,
43
- bridge: false,
44
- constructor: false,
45
- declaredSynchronized: false,
46
- enum: false,
47
- final: false,
48
- interface: false,
49
- native: false,
50
- private: true,
51
- protected: false,
52
- public: false,
53
- static: false,
54
- strict: false,
55
- synchronized: false,
56
- synthetic: false,
57
- transient: false,
58
- varargs: false,
59
- volatile: false,
82
+ field: {
83
+ accessFlags: {
84
+ abstract: false,
85
+ annotation: false,
86
+ bridge: false,
87
+ constructor: false,
88
+ declaredSynchronized: false,
89
+ enum: false,
90
+ final: false,
91
+ interface: false,
92
+ native: false,
93
+ private: true,
94
+ protected: false,
95
+ public: false,
96
+ static: false,
97
+ strict: false,
98
+ synchronized: false,
99
+ synthetic: false,
100
+ transient: false,
101
+ varargs: false,
102
+ volatile: false,
103
+ },
104
+ field: {
105
+ class: 'FILLED_LATER',
106
+ name: 'barcodeScannerView',
107
+ type: 'Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;',
108
+ },
60
109
  },
110
+ annotations: [],
111
+ },
112
+ ],
113
+ [
114
+ `.field public final g:Lo/b;
115
+ .annotation system Ldalvik/annotation/Signature;
116
+ value = {
117
+ "Lo/b<",
118
+ "Ljava/lang/Float;",
119
+ "Lo/i;",
120
+ ">;"
121
+ }
122
+ .end annotation
123
+ .end field
124
+ `,
125
+ {
61
126
  field: {
62
- class: 'FILLED_LATER',
63
- name: 'barcodeScannerView',
64
- type: 'Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;',
127
+ accessFlags: {
128
+ abstract: false,
129
+ annotation: false,
130
+ bridge: false,
131
+ constructor: false,
132
+ declaredSynchronized: false,
133
+ enum: false,
134
+ final: true,
135
+ interface: false,
136
+ native: false,
137
+ private: false,
138
+ protected: false,
139
+ public: true,
140
+ static: false,
141
+ strict: false,
142
+ synchronized: false,
143
+ synthetic: false,
144
+ transient: false,
145
+ varargs: false,
146
+ volatile: false,
147
+ },
148
+ field: {
149
+ class: 'FILLED_LATER',
150
+ name: 'g',
151
+ type: 'Lo/b;',
152
+ },
65
153
  },
154
+ annotations: [
155
+ {
156
+ visibility: 'system',
157
+ type: 'Ldalvik/annotation/Signature;',
158
+ elements: [
159
+ {
160
+ name: 'value',
161
+ value: {
162
+ kind: 'string',
163
+ value: [
164
+ 'Lo/b<',
165
+ 'Ljava/lang/Float;',
166
+ 'Lo/i;',
167
+ '>;',
168
+ ],
169
+ },
170
+ },
171
+ ],
172
+ },
173
+ ],
66
174
  },
67
175
  ],
68
176
  ]);
@@ -77,22 +185,177 @@ stringParserTest(smaliAnnotationParser, [
77
185
  .end annotation
78
186
  `,
79
187
  {
188
+ visibility: 'system',
189
+ type: 'Ldalvik/annotation/Signature;',
190
+ elements: [
191
+ {
192
+ name: 'value',
193
+ value: {
194
+ kind: 'string',
195
+ value: [
196
+ '<T:',
197
+ 'Landroid/view/View;',
198
+ '>(I)TT;',
199
+ ],
200
+ },
201
+ },
202
+ ],
203
+ },
204
+ ],
205
+ [
206
+ ` .annotation build Landroid/annotation/NonNull;
207
+ .end annotation
208
+ `,
209
+ {
210
+ visibility: 'build',
211
+ type: 'Landroid/annotation/NonNull;',
212
+ elements: [],
213
+ },
214
+ ],
215
+ [
216
+ ` .annotation system Ldalvik/annotation/Signature;
217
+ value = {
218
+ "Lo/b<",
219
+ "Ljava/lang/Float;",
220
+ "Lo/i;",
221
+ ">;"
222
+ }
223
+ .end annotation
224
+ `,
225
+ {
226
+ visibility: 'system',
80
227
  type: 'Ldalvik/annotation/Signature;',
81
- value: [
82
- '<T:',
83
- 'Landroid/view/View;',
84
- '>(I)TT;',
228
+ elements: [
229
+ {
230
+ name: 'value',
231
+ value: {
232
+ kind: 'string',
233
+ value: [
234
+ 'Lo/b<',
235
+ 'Ljava/lang/Float;',
236
+ 'Lo/i;',
237
+ '>;',
238
+ ],
239
+ },
240
+ },
85
241
  ],
86
242
  },
87
243
  ],
88
244
  ]);
89
- for (const [dexCid, smaliFilePath, shouldSnapshot] of [
90
- ['bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', 'pl/czak/minimal/MainActivity', true],
91
- ['bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', 'd/m', true],
92
- // [ 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', 'com/journeyapps/barcodescanner/CaptureActivity', true ],
93
- // [ 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false ],
94
- ]) {
95
- test.serial('smali from dex ' + dexCid + ' ' + smaliFilePath, async (t) => {
245
+ stringParserTest(smaliMethodParser, [
246
+ [
247
+ `.method public native synthetic instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
248
+ .param p1 # Ljava/lang/ClassLoader;
249
+ .annotation build Landroid/annotation/NonNull;
250
+ .end annotation
251
+ .end param
252
+ .end method
253
+ `,
254
+ stringParserTestSnapshot,
255
+ ],
256
+ [
257
+ `.method public native synthetic instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
258
+ .param p1 # Ljava/lang/ClassLoader;
259
+ .annotation build Landroid/annotation/NonNull;
260
+ .end annotation
261
+ .end param
262
+ .param p2 # Ljava/lang/String;
263
+ .annotation build Landroid/annotation/NonNull;
264
+ .end annotation
265
+ .end param
266
+ .annotation build Landroid/annotation/NonNull;
267
+ .end annotation
268
+
269
+ .annotation system Ldalvik/annotation/Throws;
270
+ value = {
271
+ Ljava/lang/ClassNotFoundException;,
272
+ Ljava/lang/IllegalAccessException;,
273
+ Ljava/lang/InstantiationException;
274
+ }
275
+ .end annotation
276
+ .end method
277
+ `,
278
+ stringParserTestSnapshot,
279
+ ],
280
+ ]);
281
+ stringParserTest(smaliCodeOperationParser, [
282
+ [
283
+ ` invoke-static {}, Le4/k;->c()Le4/k;
284
+ `,
285
+ {
286
+ operation: 'invoke-static',
287
+ registers: [],
288
+ method: {
289
+ class: 'Le4/k;',
290
+ name: 'c',
291
+ prototype: {
292
+ parameters: [],
293
+ returnType: 'Le4/k;',
294
+ shorty: 'L',
295
+ },
296
+ },
297
+ },
298
+ ],
299
+ [
300
+ ` .packed-switch 0x0
301
+ :pswitch_5
302
+ .end packed-switch
303
+ `,
304
+ stringParserTestSnapshot,
305
+ ],
306
+ ]);
307
+ stringParserTest(smaliCodeOperationParser, [
308
+ [
309
+ ` .sparse-switch
310
+ -0x7073f927 -> :sswitch_47
311
+ -0x3465cce -> :sswitch_3e
312
+ 0x388694fe -> :sswitch_33
313
+ 0x3cbf870b -> :sswitch_28
314
+ .end sparse-switch
315
+ `,
316
+ stringParserTestSnapshot,
317
+ ],
318
+ ]);
319
+ stringParserTest(smaliCodeOperationParser, [
320
+ [
321
+ ` .array-data 4
322
+ 0x10100a7
323
+ 0x101009e
324
+ .end array-data
325
+ `,
326
+ stringParserTestSnapshot,
327
+ ],
328
+ ]);
329
+ stringParserTest(smaliMethodParser, [
330
+ [
331
+ `.method public final a()Landroid/os/Bundle;
332
+ .registers 2
333
+
334
+ iget v0, p0, Landroidx/lifecycle/b0;->a:I
335
+
336
+ packed-switch v0, :pswitch_data_c
337
+
338
+ :pswitch_5
339
+ iget-object v0, p0, Landroidx/lifecycle/b0;->b:Landroidx/lifecycle/c0;
340
+
341
+ invoke-static {v0}, Landroidx/lifecycle/c0;->a(Landroidx/lifecycle/c0;)Landroid/os/Bundle;
342
+
343
+ move-result-object v0
344
+
345
+ return-object v0
346
+
347
+ :pswitch_data_c
348
+ .packed-switch 0x0
349
+ :pswitch_5
350
+ .end packed-switch
351
+ .end method
352
+ `,
353
+ stringParserTestSnapshot,
354
+ ],
355
+ ]);
356
+ const smaliFromDexMacro = test.macro({
357
+ title: (providedTitle, dexCid, smaliFilePath) => providedTitle ?? `smali from dex ${dexCid} ${smaliFilePath}`,
358
+ async exec(t, dexCid, smaliFilePath, shouldSnapshot) {
96
359
  const hasBaksmali = await hasBaksmaliPromise;
97
360
  if (!hasBaksmali) {
98
361
  t.pass('skipping test because baksmali is not available');
@@ -103,13 +366,45 @@ for (const [dexCid, smaliFilePath, shouldSnapshot] of [
103
366
  const actual = await runParser(smaliParser, smali, stringParserInputCompanion, {
104
367
  errorJoinMode: 'all',
105
368
  });
106
- // console.dir(actual, { depth: null });
369
+ // Console.dir(actual, { depth: null });
107
370
  if (shouldSnapshot) {
108
371
  t.snapshot(actual);
109
372
  }
110
373
  else {
111
- //console.dir(actual, { depth: null });
374
+ // Console.dir(actual, { depth: null });
112
375
  t.pass();
113
376
  }
377
+ },
378
+ });
379
+ test.serial(smaliFromDexMacro, 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', 'pl/czak/minimal/MainActivity', true);
380
+ test.serial(smaliFromDexMacro, 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', 'd/m', true);
381
+ test.serial(smaliFromDexMacro, 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', 'com/journeyapps/barcodescanner/CaptureActivity', true);
382
+ test.serial.skip(smaliFromDexMacro, 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', '', false);
383
+ // Minimal failing test case reproducing the a0/n parsing issue
384
+ test('parse smali with virtual method after direct methods (a0/n issue)', async (t) => {
385
+ const smali = `.class public final La0/n;
386
+ .super Landroid/view/View;
387
+ .source "SourceFile"
388
+
389
+ # direct methods
390
+ .method public static constructor <clinit>()V
391
+ .registers 1
392
+
393
+ return-void
394
+ .end method
395
+
396
+ # virtual methods
397
+ .method public final b(Lr/o;ZJIJFLa0/a;)V
398
+ .registers 21
399
+
400
+ invoke-virtual/range {v0 .. v6}, La0/n;->e(JIJF)V
401
+
402
+ return-void
403
+ .end method
404
+ `;
405
+ const actual = await runParser(smaliParser, smali, stringParserInputCompanion, {
406
+ errorJoinMode: 'all',
114
407
  });
115
- }
408
+ t.truthy(actual);
409
+ t.is(actual.classData?.virtualMethods.length, 1);
410
+ });
@@ -0,0 +1 @@
1
+ export declare function stringFromAsyncIterable(asyncIterable: AsyncIterable<string>): Promise<string>;
@@ -0,0 +1,7 @@
1
+ export async function stringFromAsyncIterable(asyncIterable) {
2
+ let string = '';
3
+ for await (const chunk of asyncIterable) {
4
+ string += chunk;
5
+ }
6
+ return string;
7
+ }
@@ -1,5 +1,5 @@
1
1
  import { getParserName, setParserName } from './parser.js';
2
- import { ParserParsingFailedError } from './parserError.js';
2
+ import { isParserParsingFailedError } from './parserError.js';
3
3
  import { parserImplementationInvariant } from './parserImplementationInvariant.js';
4
4
  import { promiseCompose } from './promiseCompose.js';
5
5
  import { createUnionParser } from './unionParser.js';
@@ -50,7 +50,7 @@ export const createTerminatedArrayParser = (elementParser, terminatorParser) =>
50
50
  ], getParserName(elementParser, 'anonymousElement'), getParserName(terminatorParser, 'anonymousTerminator'));
51
51
  }
52
52
  catch (error) {
53
- if (!(error instanceof ParserParsingFailedError)) {
53
+ if (!(isParserParsingFailedError(error))) {
54
54
  throw error;
55
55
  }
56
56
  }
@@ -61,7 +61,7 @@ export const createTerminatedArrayParser = (elementParser, terminatorParser) =>
61
61
  return [elements, terminatorValue];
62
62
  }
63
63
  catch (error) {
64
- if (!(error instanceof ParserParsingFailedError)) {
64
+ if (!(isParserParsingFailedError(error))) {
65
65
  throw error;
66
66
  }
67
67
  }
@@ -88,7 +88,7 @@ export const createTerminatedArrayParserUnsafe = (elementParser, terminatorParse
88
88
  return [elements, terminatorValue];
89
89
  }
90
90
  catch (error) {
91
- if (!(error instanceof ParserParsingFailedError)) {
91
+ if (!(isParserParsingFailedError(error))) {
92
92
  throw error;
93
93
  }
94
94
  }
@@ -55,9 +55,9 @@ testProp.serial('terminatedArrayParser', [
55
55
  })
56
56
  .map(string => ({
57
57
  string,
58
- terminator: string.slice(0 - terminatorLength)
58
+ terminator: string.slice(0 - terminatorLength),
59
59
  }))
60
- .filter(({ string, terminator }) => string.split(terminator).length === 2)))
60
+ .filter(({ string, terminator }) => string.split(terminator).length === 2))),
61
61
  ], async (t, { string, terminator }) => {
62
62
  const terminatedArrayParserNaive = createTerminatedArrayParserNaive(promiseCompose(createTupleParser([
63
63
  createNegativeLookaheadParser(createExactSequenceParser(terminator)),
@@ -76,9 +76,9 @@ testProp.serial('terminatedArrayParser', [
76
76
  position: parserContext.position,
77
77
  };
78
78
  };
79
- const actualNaive = await naiveTotalTimer.measureAsync(() => runParser(createTestWrapperParser(terminatedArrayParserNaive), string, stringParserInputCompanion));
79
+ const actualNaive = await naiveTotalTimer.measureAsync(async () => runParser(createTestWrapperParser(terminatedArrayParserNaive), string, stringParserInputCompanion));
80
80
  t.is(actualNaive.string.length + actualNaive.terminator.length, string.length);
81
- const actual = await optimizedTotalTimer.measureAsync(() => runParser(createTestWrapperParser(terminatedArrayParser), string, stringParserInputCompanion));
81
+ const actual = await optimizedTotalTimer.measureAsync(async () => runParser(createTestWrapperParser(terminatedArrayParser), string, stringParserInputCompanion));
82
82
  t.deepEqual(actual, actualNaive);
83
83
  }, {
84
84
  verbose: true,
@@ -98,9 +98,9 @@ testProp.serial('terminatedArrayParserUnsafe', [
98
98
  })
99
99
  .map(string => ({
100
100
  string,
101
- terminator: string.slice(0 - terminatorLength)
101
+ terminator: string.slice(0 - terminatorLength),
102
102
  }))
103
- .filter(({ string, terminator }) => string.split(terminator).length === 2)))
103
+ .filter(({ string, terminator }) => string.split(terminator).length === 2))),
104
104
  ], async (t, { string, terminator }) => {
105
105
  const terminatedArrayParserNaive = createTerminatedArrayParserNaive(promiseCompose(createTupleParser([
106
106
  createNegativeLookaheadParser(createExactSequenceParser(terminator)),
@@ -121,7 +121,7 @@ testProp.serial('terminatedArrayParserUnsafe', [
121
121
  };
122
122
  const actualNaive = await runParser(createTestWrapperParser(terminatedArrayParserNaive), string, stringParserInputCompanion);
123
123
  t.is(actualNaive.string.length + actualNaive.terminator.length, string.length);
124
- const actual = await unsafeTotalTimer.measureAsync(() => runParser(createTestWrapperParser(terminatedArrayParserUnsafe), string, stringParserInputCompanion));
124
+ const actual = await unsafeTotalTimer.measureAsync(async () => runParser(createTestWrapperParser(terminatedArrayParserUnsafe), string, stringParserInputCompanion));
125
125
  t.deepEqual(actual, actualNaive);
126
126
  }, {
127
127
  verbose: true,
@@ -1,12 +1,12 @@
1
- import invariant from "invariant";
1
+ import invariant from 'invariant';
2
2
  function isAsyncIterable(value) {
3
- return value && typeof value[Symbol.asyncIterator] === 'function';
3
+ return typeof value === 'object' && value !== null && Symbol.asyncIterator in value && typeof value[Symbol.asyncIterator] === 'function';
4
4
  }
5
5
  function isIterable(value) {
6
- return value && typeof value[Symbol.iterator] === 'function';
6
+ return typeof value === 'object' && value !== null && Symbol.iterator in value && typeof value[Symbol.iterator] === 'function';
7
7
  }
8
8
  function isIterator(value) {
9
- return value && typeof value.next === 'function';
9
+ return typeof value === 'object' && value !== null && 'next' in value && typeof value.next === 'function';
10
10
  }
11
11
  function iteratorToAsyncIterator(iterator) {
12
12
  return {
@@ -1,3 +1,3 @@
1
1
  import { type Parser } from './parser.js';
2
- import { DeriveSequenceElement } from './sequence.js';
2
+ import { type DeriveSequenceElement } from './sequence.js';
3
3
  export declare const createUnionParser: <Output, Sequence, Element = DeriveSequenceElement<Sequence>>(childParsers: Array<Parser<unknown, Sequence, Element>>) => Parser<Output, Sequence, Element>;
@@ -1,6 +1,6 @@
1
1
  import { allSettledStream } from './allSettledStream.js';
2
2
  import { getParserName, setParserName } from './parser.js';
3
- import { ParserParsingFailedError } from './parserError.js';
3
+ import { isParserParsingFailedError } from './parserError.js';
4
4
  import { parserImplementationInvariant } from './parserImplementationInvariant.js';
5
5
  const bigintReplacer = (_key, value) => {
6
6
  if (typeof value === 'bigint') {
@@ -41,7 +41,7 @@ export const createUnionParser = (childParsers) => {
41
41
  }
42
42
  else {
43
43
  const error = childParserResult.reason;
44
- if (error instanceof ParserParsingFailedError) {
44
+ if (isParserParsingFailedError(error)) {
45
45
  parserParsingFailedErrors.push(error);
46
46
  }
47
47
  else {
@@ -5,7 +5,6 @@ import { stringParserInputCompanion } from './parserInputCompanion.js';
5
5
  import { createArrayParser } from './arrayParser.js';
6
6
  import { createExactElementParser } from './exactElementParser.js';
7
7
  import { createExactSequenceParser } from './exactSequenceParser.js';
8
- import { ParserError } from './parserError.js';
9
8
  test('union of union of union', async (t) => {
10
9
  const parser = createUnionParser([
11
10
  createExactElementParser('a'),
@@ -42,7 +41,7 @@ test('sync and async child parsers', async (t) => {
42
41
  const result = await runParser(parser, 'a?c?', stringParserInputCompanion, {
43
42
  errorJoinMode: 'all',
44
43
  });
45
- t.deepEqual(result, 'aBcD'.split(''));
44
+ t.deepEqual(result, [...'aBcD']);
46
45
  });
47
46
  test('multiple parsers succeeded error', async (t) => {
48
47
  const parser = createUnionParser([
@@ -52,7 +51,8 @@ test('multiple parsers succeeded error', async (t) => {
52
51
  const error = await t.throwsAsync(runParser(parser, 'foo', stringParserInputCompanion, {
53
52
  errorJoinMode: 'all',
54
53
  }), {
55
- instanceOf: ParserError,
54
+ any: true,
55
+ name: 'ParserImplementationInvariantError',
56
56
  });
57
57
  t.true(error.message.includes('foo'));
58
58
  t.true(error.message.includes('foo1'));
@@ -1,6 +1,6 @@
1
- import { DeriveSequenceElement } from "./sequence.js";
2
- import { UnparserContext, WriteEarlier, WriteLater } from "./unparserContext.js";
3
- import { UnparserOutputCompanion } from "./unparserOutputCompanion.js";
1
+ import { type DeriveSequenceElement } from './sequence.js';
2
+ import { type UnparserContext, WriteEarlier, WriteLater } from './unparserContext.js';
3
+ import { type UnparserOutputCompanion } from './unparserOutputCompanion.js';
4
4
  type UnparserIterableValue<Sequence, Element> = Sequence | Element | WriteLater<Sequence, Element> | WriteEarlier<Sequence, Element>;
5
5
  export type UnparserResult<Sequence, Element> = AsyncIterable<UnparserIterableValue<Sequence, Element>>;
6
6
  export type Unparser<Input, Sequence, Element = DeriveSequenceElement<Sequence>> = (input: Input, unparserContext: UnparserContext<Sequence, Element>) => UnparserResult<Sequence, Element>;
package/build/unparser.js CHANGED
@@ -1,6 +1,6 @@
1
- import invariant from "invariant";
2
- import { UnparserContextImplementation, WriteEarlier, WriteLater } from "./unparserContext.js";
3
- import { unparserImplementationInvariant } from "./unparserImplementationInvariant.js";
1
+ import invariant from 'invariant';
2
+ import { UnparserContextImplementation, WriteEarlier, WriteLater, } from './unparserContext.js';
3
+ import { unparserImplementationInvariant } from './unparserImplementationInvariant.js';
4
4
  async function* onYield(asyncIterable, onYield) {
5
5
  for await (const value of asyncIterable) {
6
6
  onYield(value);
@@ -40,7 +40,9 @@ async function* elementsToSequences(values, unparserOutputCompanion) {
40
40
  }
41
41
  }
42
42
  function wrapUnparserResult(unparserResult, unparserContext, unparserOutputCompanion) {
43
- return onYield(elementsToSequences(unparserResult, unparserOutputCompanion), value => unparserContext.handleYield(value));
43
+ return onYield(elementsToSequences(unparserResult, unparserOutputCompanion), value => {
44
+ unparserContext.handleYield(value);
45
+ });
44
46
  }
45
47
  export async function* runUnparser(unparser, input, unparserOutputCompanion) {
46
48
  const unparserContext = new UnparserContextImplementation(unparserOutputCompanion);