[jira] [Updated] (GROOVY-8546) Parrot Parser: multiple Reader instances opened from SourceUnit; many left open

2018-04-15 Thread Eric Milles (JIRA)

 [ 
https://issues.apache.org/jira/browse/GROOVY-8546?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eric Milles updated GROOVY-8546:

Issue Type: Bug  (was: Improvement)

> 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)


[jira] [Updated] (GROOVY-8546) Parrot Parser: multiple Reader instances opened from SourceUnit; many left open

2018-04-15 Thread Eric Milles (JIRA)

 [ 
https://issues.apache.org/jira/browse/GROOVY-8546?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eric Milles updated GROOVY-8546:

Affects Version/s: 2.6.0-alpha-3
   3.0.0-alpha-2

> 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
>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)


[jira] [Updated] (GROOVY-8546) Parrot Parser: multiple Reader instances opened from SourceUnit; many left open

2018-04-15 Thread Eric Milles (JIRA)

 [ 
https://issues.apache.org/jira/browse/GROOVY-8546?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eric Milles updated GROOVY-8546:

Description: 
{{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}

  was:
{{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}


> 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
>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