natural / java2python

Simple but effective library to translate Java source code to Python.
GNU Lesser General Public License v2.1
564 stars 243 forks source link

Else if conversion fails #70

Open ferchault opened 3 years ago

ferchault commented 3 years ago

When converting an existing code base I found that else-if apparently is not supported. Here's an example:

   public static void main(String[] args) {
        int a = 0;
        if (a == 1) {
                System.out.println("a=1");
        } else if (a == 2) {
                System.out.println("a=2");
        }
    }

which fails with the output

$ j2py HelloWorld.java
Traceback (most recent call last):
  File "/usr/local/bin/j2py", line 258, in <module>
    sys.exit(runMain(configScript(sys.argv[1:])))
  File "/usr/local/bin/j2py", line 57, in runMain
    return runOneOrMany(options)
  File "/usr/local/bin/j2py", line 82, in runOneOrMany
    return runTransform(options)
  File "/usr/local/bin/j2py", line 134, in runTransform
    module.walk(tree)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 86, in walk
    visitor.walk(child, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 86, in walk
    visitor.walk(child, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 86, in walk
    visitor.walk(child, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 86, in walk
    visitor.walk(child, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 86, in walk
    visitor.walk(child, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 83, in walk
    visitor = self.accept(tree, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 43, in accept
    return call(node, memo)
  File "/usr/local/lib/python2.7/dist-packages/java2python/compiler/visitor.py", line 474, in acceptIf
    nextNode = nextNode.children[2]

With the obvious workaround of separating the if statements, the conversion is successful:

    public static void main(String[] args) {
        int a = 0;
        if (a == 1) {
                System.out.println("a=1");
        }
        if (a == 2) {
                System.out.println("a=2");
        }
    }

converts to


#!/usr/bin/env python
""" generated source for module HelloWorld """
class HelloWorld(object):
    """ generated source for class HelloWorld """
    @classmethod
    def main(cls, args):
        """ generated source for method main """
        a = 0
        if a == 1:
            print "a=1"
        if a == 2:
            print "a=2"

if __name__ == '__main__':
    import sys
    HelloWorld.main(sys.argv)