@@ -8,28 +8,60 @@ import (
88 "github.com/xaionaro-go/binder/tools/pkg/javaparser"
99)
1010
11+ // JavaExtractor reuses an ANTLR lexer/parser across multiple files.
12+ // The DFA cache built by the ATN simulator persists across calls,
13+ // dramatically reducing allocation and GC pressure.
14+ type JavaExtractor struct {
15+ lexer * javaparser.JavaLexer
16+ stream * antlr.CommonTokenStream
17+ parser * javaparser.JavaParser
18+ }
19+
20+ // NewJavaExtractor creates a reusable extractor.
21+ func NewJavaExtractor () * JavaExtractor {
22+ // Initialize with empty input; will be reset per file.
23+ input := antlr .NewInputStream ("" )
24+ lexer := javaparser .NewJavaLexer (input )
25+ stream := antlr .NewCommonTokenStream (lexer , antlr .TokenDefaultChannel )
26+ parser := javaparser .NewJavaParser (stream )
27+ parser .RemoveErrorListeners ()
28+
29+ return & JavaExtractor {
30+ lexer : lexer ,
31+ stream : stream ,
32+ parser : parser ,
33+ }
34+ }
35+
1136// ExtractSpecs parses a Java source file and returns ParcelableSpecs
1237// for each class that contains a writeToParcel method.
13- func ExtractSpecs (
38+ // Reuses the internal lexer/parser for DFA cache efficiency.
39+ func (e * JavaExtractor ) ExtractSpecs (
1440 javaSrc string ,
1541 packageName string ,
1642) []ParcelableSpec {
1743 input := antlr .NewInputStream (javaSrc )
18- lexer := javaparser . NewJavaLexer (input )
19- stream := antlr . NewCommonTokenStream ( lexer , antlr . TokenDefaultChannel )
20- parser := javaparser . NewJavaParser ( stream )
44+ e . lexer . SetInputStream (input )
45+ e . stream . SetTokenSource ( e . lexer )
46+ e . parser . SetTokenStream ( e . stream )
2147
22- // Suppress ANTLR error output during parsing.
23- parser .RemoveErrorListeners ()
24-
25- tree := parser .CompilationUnit ()
48+ tree := e .parser .CompilationUnit ()
2649
2750 listener := newParcelableListener (packageName )
2851 antlr .ParseTreeWalkerDefault .Walk (listener , tree )
2952
3053 return listener .specs
3154}
3255
56+ // ExtractSpecs is a convenience function that creates a one-shot extractor.
57+ // For batch processing, use NewJavaExtractor() and call its ExtractSpecs method.
58+ func ExtractSpecs (
59+ javaSrc string ,
60+ packageName string ,
61+ ) []ParcelableSpec {
62+ return NewJavaExtractor ().ExtractSpecs (javaSrc , packageName )
63+ }
64+
3365// javaWriteMethodToSpecType maps Java Parcel write method names
3466// to their corresponding spec type strings.
3567var javaWriteMethodToSpecType = map [string ]string {
0 commit comments