Java parser fix for // comments. (Charles Crain)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 9 May 2003 22:07:35 +0000 (22:07 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 9 May 2003 22:07:35 +0000 (22:07 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@676 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Tool/JavaCommon.py
src/engine/SCons/Tool/JavaCommonTests.py

index 3348bc016d965edb8ada9ba4f166eeecc1888beb..6b69c7367cfa73d2d14ba1fff3e1907be2e1f6d5 100644 (file)
@@ -42,12 +42,12 @@ if java_parsing:
     # This is a really cool parser from Charles Crain
     # that finds appropriate class names in Java source.
 
-    # A regular expression that will find, in a java file,
+    # A regular expression that will find, in a java file:  newlines;
     # any alphanumeric token (keyword, class name, specifier); open or
     # close brackets; a single-line comment "//"; the multi-line comment
     # begin and end tokens /* and */; single or double quotes; and
     # single or double quotes preceeded by a backslash.
-    _reToken = re.compile(r'(//[^\r\n]*|\\[\'"]|[\'"\{\}]|[A-Za-z_][\w\.]*|' +
+    _reToken = re.compile(r'(\n|//|\\[\'"]|[\'"\{\}]|[A-Za-z_][\w\.]*|' +
                           r'/\*|\*/)')
 
     class OuterState:
@@ -95,7 +95,7 @@ if java_parsing:
 
         def parseToken(self, token):
             if token[:2] == '//':
-                pass # ignore comment
+                return IgnoreState('\n', self)
             elif token == '/*':
                 return IgnoreState('*/', self)
             elif token == '{':
@@ -163,7 +163,9 @@ if java_parsing:
             # outer_state is always an instance of OuterState
             self.outer_state = outer_state
         def parseToken(self, token):
-            # the only token we get should be the name of the class.
+            # the next non-whitespace token should be the name of the class
+            if token == '\n':
+                return self
             self.outer_state.listClasses.append(token)
             return self.outer_state
 
index 96bd31df5fd8729c473671a96c9ff6924b24eb30..1b5421ca237296c565dee5d7c766084a86e02732 100644 (file)
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
+import sys
 import unittest
 
 import SCons.Tool.JavaCommon
 
 class parse_javaTestCase(unittest.TestCase):
 
-    def test_empty(self):
+    def test_bare_bones(self):
         """Test a bare-bones class"""
 
         pkg_dir, classes = SCons.Tool.JavaCommon.parse_java("""\
@@ -123,6 +124,49 @@ class Private {
                  ]
         assert classes == expect, classes
 
+    def test_comments(self):
+        """Test a class with comments"""
+
+        pkg_dir, classes = SCons.Tool.JavaCommon.parse_java("""\
+package com.sub.foo;
+
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.RMISecurityManager;
+import java.rmi.server.UnicastRemoteObject;
+
+public class Example1 extends UnicastRemoteObject implements Hello {
+
+    public Example1() throws RemoteException {
+        super();
+    }
+
+    public String sayHello() {
+        return "Hello World!";
+    }
+
+    public static void main(String args[]) {
+        if (System.getSecurityManager() == null) {
+            System.setSecurityManager(new RMISecurityManager());
+        }
+        // a comment
+        try {
+            Example1 obj = new Example1();
+
+            Naming.rebind("//myhost/HelloServer", obj);
+
+            System.out.println("HelloServer bound in registry");
+        } catch (Exception e) {
+            System.out.println("Example1 err: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+}
+""")
+
+        assert pkg_dir == 'com/sub/foo', pkg_dir
+        assert classes == ['Example1'], classes
+
 if __name__ == "__main__":
     suite = unittest.TestSuite()
     tclasses = [ parse_javaTestCase ]