Thanks!

Can you make this a pull request on GitHub? It's much easier to manage
patches from there.

- Jeff

On Wed, Oct 12, 2011 at 7:44 AM, Markus Schaber
<m.scha...@3s-software.com> wrote:
> Hi,
>
> Von: Markus Schaber
>> Von: Dino Viehland [mailto:di...@microsoft.com]
>> > So you want to warn if the file contains a print statement w/o from
>> > __future__ import print_function?  What if it's a call to print such
>> > as
>> > print('foo')  which is valid in both 2.x and 3.x?
>>
>> Considering our user base, I could ignore this corner case, as the user can
>> simply get rid of the warning by adding the import statement.
>>
>> > Either way you should be able to just update ParsePrintStmt in Parser.cs.
>> > But dealing w/ the case of the parens would be a little more difficult
>> > - but I think you can just peek at the next token after print and see
>> > if it's a parenthesis right after we eat the print keyword.
>>
>> Ok, I'll see whether I can do that.
>
> The patch below emits a warning during Compilation for print statements whose 
> argument list does not start with a '(' if Py3k warnings are enabled.
>
> Best regards
>
> Markus Schaber
>
> 944eab0d7da3660001f1dabf473f48d5ddd4ee25
>  Languages/IronPython/IronPython/Compiler/Parser.cs |   18 ++++++++++++++++--
>  .../IronPython/IronPython/Resources.Designer.cs    |    9 +++++++++
>  Languages/IronPython/IronPython/Resources.resx     |    3 +++
>  3 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/Languages/IronPython/IronPython/Compiler/Parser.cs 
> b/Languages/IronPython/IronPython/Compiler/Parser.cs
> index bdef897..d756593 100644
> --- a/Languages/IronPython/IronPython/Compiler/Parser.cs
> +++ b/Languages/IronPython/IronPython/Compiler/Parser.cs
> @@ -38,6 +38,7 @@ namespace IronPython.Compiler {
>     public class Parser : IDisposable { // TODO: remove IDisposable
>         // immutable properties:
>         private readonly Tokenizer _tokenizer;
> +        private readonly bool _warnPython30;
>
>         // mutable properties:
>         private ErrorSink _errors;
> @@ -70,7 +71,7 @@ namespace IronPython.Compiler {
>
>         #region Construction
>
> -        private Parser(CompilerContext context, Tokenizer tokenizer, 
> ErrorSink errorSink, ParserSink parserSink, ModuleOptions languageFeatures) {
> +        private Parser(CompilerContext context, Tokenizer tokenizer, 
> ErrorSink errorSink, ParserSink parserSink, ModuleOptions languageFeatures, 
> bool warnPython30) {
>             ContractUtils.RequiresNotNull(tokenizer, "tokenizer");
>             ContractUtils.RequiresNotNull(errorSink, "errorSink");
>             ContractUtils.RequiresNotNull(parserSink, "parserSink");
> @@ -79,6 +80,7 @@ namespace IronPython.Compiler {
>
>             _tokenizer = tokenizer;
>             _errors = errorSink;
> +            _warnPython30 = warnPython30;
>             if (parserSink != ParserSink.Null) {
>                 _sink = parserSink;
>             }
> @@ -123,7 +125,7 @@ namespace IronPython.Compiler {
>             tokenizer.Initialize(null, reader, context.SourceUnit, 
> SourceLocation.MinValue);
>             tokenizer.IndentationInconsistencySeverity = 
> options.IndentationInconsistencySeverity;
>
> -            Parser result = new Parser(context, tokenizer, context.Errors, 
> context.ParserSink, compilerOptions.Module);
> +            Parser result = new Parser(context, tokenizer, context.Errors, 
> context.ParserSink, compilerOptions.Module, options.WarnPython30);
>             result._sourceReader = reader;
>             return result;
>         }
> @@ -379,6 +381,13 @@ namespace IronPython.Compiler {
>                 Severity.FatalError);
>         }
>
> +        private void ReportWarning(string message)
> +        {
> +            SourceLocation start = 
> _tokenizer.IndexToLocation(_lookahead.Span.Start);
> +            SourceLocation end = 
> _tokenizer.IndexToLocation(_lookahead.Span.End);
> +            _errors.Add(_sourceUnit, message, new SourceSpan(start, end), 0, 
> Severity.Warning);
> +        }
> +
>         #endregion
>
>         #region LL(1) Parsing
> @@ -1017,6 +1026,11 @@ namespace IronPython.Compiler {
>         //print_stmt: 'print' ( [ expression (',' expression)* [','] ] | '>>' 
> expression [ (',' expression)+ [','] ] )
>         private PrintStatement ParsePrintStmt() {
>             Eat(TokenKind.KeywordPrint);
> +
> +            if (_warnPython30 && PeekToken().Kind != 
> TokenKind.LeftParenthesis) {
> +                ReportWarning(Resources.UsingPrintStatementWarning);
> +            }
> +
>             var start = GetStart();
>             Expression dest = null;
>             PrintStatement ret;
> diff --git a/Languages/IronPython/IronPython/Resources.Designer.cs 
> b/Languages/IronPython/IronPython/Resources.Designer.cs
> index b564a8e..4a5d5fe 100644
> --- a/Languages/IronPython/IronPython/Resources.Designer.cs
> +++ b/Languages/IronPython/IronPython/Resources.Designer.cs
> @@ -419,5 +419,14 @@ namespace IronPython {
>                 return ResourceManager.GetString("UnknownFutureFeature", 
> resourceCulture);
>             }
>         }
> +
> +        /// <summary>
> +        ///   Looks up a localized string similar to Python 2 print 
> statement found. For Python 3 compatibility, use &quot;from __future__ import 
> print_function&quot; and the print() function instead..
> +        /// </summary>
> +        internal static string UsingPrintStatementWarning {
> +            get {
> +                return 
> ResourceManager.GetString("UsingPrintStatementWarning", resourceCulture);
> +            }
> +        }
>     }
>  }
> diff --git a/Languages/IronPython/IronPython/Resources.resx 
> b/Languages/IronPython/IronPython/Resources.resx
> index 3d89b3d..f666b1f 100644
> --- a/Languages/IronPython/IronPython/Resources.resx
> +++ b/Languages/IronPython/IronPython/Resources.resx
> @@ -238,4 +238,7 @@
>   <data name="UnknownFutureFeature" xml:space="preserve">
>     <value>future feature is not defined:</value>
>   </data>
> +  <data name="UsingPrintStatementWarning" xml:space="preserve">
> +    <value>Python 2 print statement found. For Python 3 compatibility, use 
> "from __future__ import print_function" and the print() function 
> instead.</value>
> +  </data>
>  </root>
> \ No newline at end of file
> _______________________________________________
> Ironpython-users mailing list
> Ironpython-users@python.org
> http://mail.python.org/mailman/listinfo/ironpython-users
>
_______________________________________________
Ironpython-users mailing list
Ironpython-users@python.org
http://mail.python.org/mailman/listinfo/ironpython-users

Reply via email to