Eric Milles created GROOVY-8546:
-----------------------------------

             Summary: 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: Improvement
          Components: parser
            Reporter: Eric Milles


{{Antlr4ParserPlugin}} makes very inefficient use of 
{{ReaderSource}}/{{SourceUnit}}.  {{parseCST}} is passed a {{Reader}} with the 
idea that it is the source of source character data and 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