Skip to content

Commit 2666826

Browse files
author
mgricken
committed
Fixes treatment of hexadecimal literals. Adds tests for _isNum.
git-svn-id: file:///tmp/test-svn/trunk@4772 fe72c1cf-3628-48e9-8b72-1c46755d3cff
1 parent 9ff0bbc commit 2666826

2 files changed

Lines changed: 146 additions & 9 deletions

File tree

drjava/src/edu/rice/cs/drjava/model/AbstractDJDocument.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,22 +370,37 @@ else if (_isNum(token)) {
370370
/** Checks to see if the current string is a number
371371
* @return true if x is a parseable number, i.e. either parsable as a double or as a long after chopping off a possible trailing 'L' or 'l'
372372
*/
373-
private boolean _isNum(String x) {
373+
static boolean _isNum(String x) {
374374
try {
375375
Double.parseDouble(x);
376376
return true;
377377
}
378378
catch (NumberFormatException e) {
379-
if (x.endsWith("l")||x.endsWith("L")) {
380-
try {
381-
Long.parseLong(x.substring(0,x.length()-1));
382-
return true;
383-
}
384-
catch (NumberFormatException e2) {
385-
return false;
379+
int begin = 0;
380+
int end = x.length();
381+
if (end-begin>1) {
382+
// string is not empty
383+
char ch = x.charAt(end-1);
384+
if ((ch=='l')||(ch=='L')) --end; // skip trailing 'l' or 'L'
385+
if (end-begin>1) {
386+
// string is not empty
387+
if (x.charAt(0)=='0') { // skip leading '0' of octal or hexadecimal literal
388+
++begin;
389+
if (end-begin>1) {
390+
// string is not empty
391+
ch = x.charAt(1);
392+
if ((ch=='x')||(ch=='X')) ++begin; // skip 'x' or 'X' from hexadecimal literal
393+
}
394+
}
386395
}
387396
}
388-
return false;
397+
try {
398+
Long.parseLong(x.substring(begin,end));
399+
return true;
400+
}
401+
catch (NumberFormatException e2) {
402+
return false;
403+
}
389404
}
390405
}
391406

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*BEGIN_COPYRIGHT_BLOCK
2+
*
3+
* Copyright (c) 2001-2008, JavaPLT group at Rice University (drjava@rice.edu)
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions are met:
8+
* * Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* * Redistributions in binary form must reproduce the above copyright
11+
* notice, this list of conditions and the following disclaimer in the
12+
* documentation and/or other materials provided with the distribution.
13+
* * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
14+
* names of its contributors may be used to endorse or promote products
15+
* derived from this software without specific prior written permission.
16+
*
17+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25+
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26+
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
*
29+
* This software is Open Source Initiative approved Open Source Software.
30+
* Open Source Initative Approved is a trademark of the Open Source Initiative.
31+
*
32+
* This file is part of DrJava. Download the current version of this project
33+
* from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
34+
*
35+
* END_COPYRIGHT_BLOCK*/
36+
37+
package edu.rice.cs.drjava.model;
38+
39+
import edu.rice.cs.drjava.DrJavaTestCase;
40+
41+
/** This class contains tests for AbstractDJDocument.
42+
*/
43+
public class AbstractDJDocumentTest extends DrJavaTestCase {
44+
public void testIsNum() {
45+
assertTrue(AbstractDJDocument._isNum("0"));
46+
assertTrue(AbstractDJDocument._isNum("1"));
47+
assertTrue(AbstractDJDocument._isNum("12"));
48+
49+
assertTrue(AbstractDJDocument._isNum("0l"));
50+
assertTrue(AbstractDJDocument._isNum("1l"));
51+
assertTrue(AbstractDJDocument._isNum("12l"));
52+
assertTrue(AbstractDJDocument._isNum("0L"));
53+
assertTrue(AbstractDJDocument._isNum("1L"));
54+
assertTrue(AbstractDJDocument._isNum("12L"));
55+
56+
assertTrue(AbstractDJDocument._isNum("00"));
57+
assertTrue(AbstractDJDocument._isNum("01"));
58+
assertTrue(AbstractDJDocument._isNum("012"));
59+
assertTrue(AbstractDJDocument._isNum("00l"));
60+
assertTrue(AbstractDJDocument._isNum("01l"));
61+
assertTrue(AbstractDJDocument._isNum("012l"));
62+
assertTrue(AbstractDJDocument._isNum("00L"));
63+
assertTrue(AbstractDJDocument._isNum("01L"));
64+
assertTrue(AbstractDJDocument._isNum("012L"));
65+
66+
assertTrue(AbstractDJDocument._isNum("0x0"));
67+
assertTrue(AbstractDJDocument._isNum("0x1"));
68+
assertTrue(AbstractDJDocument._isNum("0x12"));
69+
assertTrue(AbstractDJDocument._isNum("0x0l"));
70+
assertTrue(AbstractDJDocument._isNum("0x1l"));
71+
assertTrue(AbstractDJDocument._isNum("0x12l"));
72+
assertTrue(AbstractDJDocument._isNum("0x0L"));
73+
assertTrue(AbstractDJDocument._isNum("0x1L"));
74+
assertTrue(AbstractDJDocument._isNum("0x12L"));
75+
76+
assertTrue(AbstractDJDocument._isNum("1.0"));
77+
assertTrue(AbstractDJDocument._isNum("12.0"));
78+
assertTrue(AbstractDJDocument._isNum("12.3"));
79+
assertTrue(AbstractDJDocument._isNum("12.34"));
80+
81+
assertTrue(AbstractDJDocument._isNum("1.0f"));
82+
assertTrue(AbstractDJDocument._isNum("12.0f"));
83+
assertTrue(AbstractDJDocument._isNum("12.3f"));
84+
assertTrue(AbstractDJDocument._isNum("12.34f"));
85+
assertTrue(AbstractDJDocument._isNum("1.0F"));
86+
assertTrue(AbstractDJDocument._isNum("12.0F"));
87+
assertTrue(AbstractDJDocument._isNum("12.3F"));
88+
assertTrue(AbstractDJDocument._isNum("12.34F"));
89+
90+
assertTrue(AbstractDJDocument._isNum("1.0d"));
91+
assertTrue(AbstractDJDocument._isNum("12.0d"));
92+
assertTrue(AbstractDJDocument._isNum("12.3d"));
93+
assertTrue(AbstractDJDocument._isNum("12.34d"));
94+
assertTrue(AbstractDJDocument._isNum("1.0D"));
95+
assertTrue(AbstractDJDocument._isNum("12.0D"));
96+
assertTrue(AbstractDJDocument._isNum("12.3D"));
97+
assertTrue(AbstractDJDocument._isNum("12.34D"));
98+
99+
assertTrue(AbstractDJDocument._isNum("1.0e2"));
100+
assertTrue(AbstractDJDocument._isNum("12.0e2"));
101+
assertTrue(AbstractDJDocument._isNum("12.3e2"));
102+
assertTrue(AbstractDJDocument._isNum("12.34e2"));
103+
104+
assertTrue(AbstractDJDocument._isNum("1.0e2f"));
105+
assertTrue(AbstractDJDocument._isNum("12.0e2f"));
106+
assertTrue(AbstractDJDocument._isNum("12.3e2f"));
107+
assertTrue(AbstractDJDocument._isNum("12.34e2f"));
108+
assertTrue(AbstractDJDocument._isNum("1.0e2F"));
109+
assertTrue(AbstractDJDocument._isNum("12.0e2F"));
110+
assertTrue(AbstractDJDocument._isNum("12.3e2F"));
111+
assertTrue(AbstractDJDocument._isNum("12.34e2F"));
112+
113+
assertTrue(AbstractDJDocument._isNum("1.0e2d"));
114+
assertTrue(AbstractDJDocument._isNum("12.0e2d"));
115+
assertTrue(AbstractDJDocument._isNum("12.3e2d"));
116+
assertTrue(AbstractDJDocument._isNum("12.34e2d"));
117+
assertTrue(AbstractDJDocument._isNum("1.0e2D"));
118+
assertTrue(AbstractDJDocument._isNum("12.0e2D"));
119+
assertTrue(AbstractDJDocument._isNum("12.3e2D"));
120+
assertTrue(AbstractDJDocument._isNum("12.34e2D"));
121+
}
122+
}

0 commit comments

Comments
 (0)