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)