diff options
| author | Steven Knight <knight@baldmt.com> | 2007-07-14 15:30:04 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2007-07-14 15:30:04 (GMT) |
| commit | c1c5babea02556d1dbf3280d7644aa3323f1b876 (patch) | |
| tree | 0637b8519aaebc4e457f58553899ead8dedb1252 /src/engine/SCons/Tool/JavaCommon.py | |
| parent | 0bef9160a93a51ab9671c0a19d144ca027355e24 (diff) | |
| download | SCons-c1c5babea02556d1dbf3280d7644aa3323f1b876.zip SCons-c1c5babea02556d1dbf3280d7644aa3323f1b876.tar.gz SCons-c1c5babea02556d1dbf3280d7644aa3323f1b876.tar.bz2 | |
Merged revisions 2121-2135 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core
........
r2128 | stevenknight | 2007-07-13 06:27:11 -0500 (Fri, 13 Jul 2007) | 2 lines
Use the "swig -classic" option on pre-2.0 Python versions.
........
r2130 | stevenknight | 2007-07-13 09:42:45 -0500 (Fri, 13 Jul 2007) | 2 lines
Remove left-over cut-and-paste stuff about loadable modules and frameworks.
........
r2131 | stevenknight | 2007-07-13 12:08:37 -0500 (Fri, 13 Jul 2007) | 4 lines
Refactor the structure of the tests to make the java input strings
separate from the parse_java() calls. (Prep for enhancing the parser
for Java 1.5 anonymous class files.)
........
r2132 | stevenknight | 2007-07-13 12:24:09 -0500 (Fri, 13 Jul 2007) | 3 lines
Copy the Java 1.4 nested-anonymous-class test case from test/Java/live.py.
Remove a commented-out unit test already added elsewhere.
........
r2133 | stevenknight | 2007-07-13 16:16:51 -0500 (Fri, 13 Jul 2007) | 4 lines
Support the changed naming of .class files for nested anonymous inner
classes in Java 1.5 by adding a new $JAVAVERSION variable that can be set
to reflect the javac version being used.
........
r2134 | stevenknight | 2007-07-13 20:28:34 -0500 (Fri, 13 Jul 2007) | 5 lines
Add a $SWIGOUTDIR variable.
Add it, when set, to the command line as an argument to -outdir.
Have the emitter use it to figure out where the generated .java
files will be (something we didn't do at all before, -outdir aside).
........
r2135 | stevenknight | 2007-07-13 23:51:21 -0500 (Fri, 13 Jul 2007) | 2 lines
Minor unit test fixes for old Python versions (1.6 and 2.0).
........
Diffstat (limited to 'src/engine/SCons/Tool/JavaCommon.py')
| -rw-r--r-- | src/engine/SCons/Tool/JavaCommon.py | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/src/engine/SCons/Tool/JavaCommon.py b/src/engine/SCons/Tool/JavaCommon.py index d340d5b..5097c67 100644 --- a/src/engine/SCons/Tool/JavaCommon.py +++ b/src/engine/SCons/Tool/JavaCommon.py @@ -36,6 +36,8 @@ import string java_parsing = 1 +default_java_version = '1.4' + if java_parsing: # Parse Java files for class names. # @@ -59,12 +61,20 @@ if java_parsing: class OuterState: """The initial state for parsing a Java file for classes, interfaces, and anonymous inner classes.""" - def __init__(self): + def __init__(self, version=default_java_version): + + if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6'): + msg = "Java version %s not supported" % version + raise NotImplementedError, msg + + self.version = version self.listClasses = [] self.listOutputs = [] self.stackBrackets = [] self.brackets = 0 self.nextAnon = 1 + self.stackAnonClassBrackets = [] + self.anonStacksStack = [[0]] self.package = None def trace(self): @@ -102,6 +112,9 @@ if java_parsing: ret = SkipState(1, self) self.skipState = ret return ret + + def __getAnonStack(self): + return self.anonStacksStack[-1] def openBracket(self): self.brackets = self.brackets + 1 @@ -112,7 +125,12 @@ if java_parsing: self.brackets == self.stackBrackets[-1]: self.listOutputs.append(string.join(self.listClasses, '$')) self.listClasses.pop() + self.anonStacksStack.pop() self.stackBrackets.pop() + if len(self.stackAnonClassBrackets) and \ + self.brackets == self.stackAnonClassBrackets[-1]: + self.__getAnonStack().pop() + self.stackAnonClassBrackets.pop() def parseToken(self, token): if token[:2] == '//': @@ -146,9 +164,20 @@ if java_parsing: def addAnonClass(self): """Add an anonymous inner class""" - clazz = self.listClasses[0] - self.listOutputs.append('%s$%d' % (clazz, self.nextAnon)) + if self.version in ('1.1', '1.2', '1.3', '1.4'): + clazz = self.listClasses[0] + self.listOutputs.append('%s$%d' % (clazz, self.nextAnon)) + elif self.version in ('1.5', '1.6'): + self.stackAnonClassBrackets.append(self.brackets) + className = [] + className.extend(self.listClasses) + self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1 + for anon in self.__getAnonStack(): + className.append(str(anon)) + self.listOutputs.append(string.join(className, '$')) + self.nextAnon = self.nextAnon + 1 + self.__getAnonStack().append(0) def setPackage(self, package): self.package = package @@ -208,6 +237,7 @@ if java_parsing: if token == '\n': return self self.outer_state.listClasses.append(token) + self.outer_state.anonStacksStack.append([0]) return self.outer_state class IgnoreState: @@ -231,15 +261,15 @@ if java_parsing: self.outer_state.setPackage(token) return self.outer_state - def parse_java_file(fn): - return parse_java(open(fn, 'r').read()) + def parse_java_file(fn, version=default_java_version): + return parse_java(open(fn, 'r').read(), version) - def parse_java(contents, trace=None): + def parse_java(contents, version=default_java_version, trace=None): """Parse a .java file and return a double of package directory, plus a list of .class files that compiling that .java file will produce""" package = None - initial = OuterState() + initial = OuterState(version) currstate = initial for token in _reToken.findall(contents): # The regex produces a bunch of groups, but only one will |
