[ 
https://issues.apache.org/jira/browse/GROOVY-8546?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16438915#comment-16438915
 ] 

Daniel Sun commented on GROOVY-8546:
------------------------------------

{{CharStream}} of antlr4 is not a IO stream, so we need not close it.

> Parrot Parser: multiple Reader instances opened from SourceUnit; many left 
> open
> -------------------------------------------------------------------------------
>
>                 Key: GROOVY-8546
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8546
>             Project: Groovy
>          Issue Type: Bug
>          Components: parser
>    Affects Versions: 2.6.0-alpha-3, 3.0.0-alpha-2
>            Reporter: Eric Milles
>            Priority: Major
>
> {{Antlr4ParserPlugin}} makes very inefficient use of 
> {{ReaderSource}}/{{SourceUnit}}.  {{parseCST}} is passed a {{Reader}} with 
> the idea that it is the source of character data -- and this reader is closed 
> from outside.  It ignores this and mines the passed {{SourceUnit}}, which 
> seems unnecessary since the same reference is passed again in {{buildAST}}.  
> Both {{parseCST}} and {{buildAST}} call {{getReader}}, which opens a buffered 
> reader on the source unit file and never closes them.  Lastly, {{AstBuilder}} 
> calls {{getReader}} as well to create a {{CharStream}} and never closes this 
> reader.
> Doing this in a long-running process (like an IDE) is causing numerous 
> problems due to open file handles.
> {code:java}
> public class Antlr4ParserPlugin implements ParserPlugin {
>     private ReaderSource readerSource;
>     @Override
>     public Reduction parseCST(SourceUnit sourceUnit, java.io.Reader reader) 
> throws CompilationFailedException {
>         try {
>             ReaderSource readerSource = sourceUnit.getSource();
>             if (null != readerSource && null != readerSource.getReader()) {
>                 this.readerSource = readerSource;
>             } else {
>                 this.readerSource = new 
> StringReaderSource(IOGroovyMethods.getText(reader), 
> sourceUnit.getConfiguration());
>             }
>         } catch (IOException e) {
>             throw new GroovyBugError("Failed to create StringReaderSource 
> instance", e);
>         }
>         return null;
>     }
>     @Override
>     public ModuleNode buildAST(SourceUnit sourceUnit, ClassLoader 
> classLoader, Reduction cst) throws ParserException {
>         try {
>             ReaderSource readerSource = sourceUnit.getSource();
>             if (null == readerSource || null == readerSource.getReader()) {
>                 sourceUnit.setSource(this.readerSource);
>             }
>         } catch (IOException e) {
>             sourceUnit.setSource(this.readerSource);
>         }
>         AstBuilder builder = new AstBuilder(sourceUnit);
>         return builder.buildAST();
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to