Skip to content

Commit 575963e

Browse files
authoredJul 18, 2023
parse binary literal const (#1593)
* support binary const Signed-off-by: sdghchj <sdghchj@qq.com> * add test Signed-off-by: sdghchj <sdghchj@qq.com> --------- Signed-off-by: sdghchj <sdghchj@qq.com>
1 parent 4536bf2 commit 575963e

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed
 

‎enums_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ func TestParseGlobalEnums(t *testing.T) {
2828
assert.Equal(t, 15, p.packages.packages[constsPath].ConstTable["octnum"].Value)
2929
assert.Equal(t, `aa\nbb\u8888cc`, p.packages.packages[constsPath].ConstTable["nonescapestr"].Value)
3030
assert.Equal(t, "aa\nbb\u8888cc", p.packages.packages[constsPath].ConstTable["escapestr"].Value)
31-
assert.Equal(t, '\u8888', p.packages.packages[constsPath].ConstTable["escapechar"].Value)
31+
assert.Equal(t, 1_000_000, p.packages.packages[constsPath].ConstTable["underscored"].Value)
32+
assert.Equal(t, 0b10001000, p.packages.packages[constsPath].ConstTable["binaryInteger"].Value)
3233
}

‎package.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,22 @@ func (pkg *PackageDefinitions) evaluateConstValue(file *ast.File, iota int, expr
9999
if strings.ContainsRune(valueExpr.Value, '_') {
100100
valueExpr.Value = strings.Replace(valueExpr.Value, "_", "", -1)
101101
}
102-
// hexadecimal
103-
if len(valueExpr.Value) > 2 && valueExpr.Value[0] == '0' && valueExpr.Value[1] == 'x' {
104-
if x, err := strconv.ParseInt(valueExpr.Value[2:], 16, 64); err == nil {
105-
return int(x), nil
106-
} else if x, err := strconv.ParseUint(valueExpr.Value[2:], 16, 64); err == nil {
107-
return x, nil
108-
} else {
109-
panic(err)
102+
if len(valueExpr.Value) >= 2 && valueExpr.Value[0] == '0' {
103+
var start, base = 2, 8
104+
switch valueExpr.Value[1] {
105+
case 'x', 'X':
106+
//hex
107+
base = 16
108+
case 'b', 'B':
109+
//binary
110+
base = 2
111+
default:
112+
//octet
113+
start = 1
110114
}
111-
}
112-
113-
//octet
114-
if len(valueExpr.Value) > 1 && valueExpr.Value[0] == '0' {
115-
if x, err := strconv.ParseInt(valueExpr.Value[1:], 8, 64); err == nil {
115+
if x, err := strconv.ParseInt(valueExpr.Value[start:], base, 64); err == nil {
116116
return int(x), nil
117-
} else if x, err := strconv.ParseUint(valueExpr.Value[1:], 8, 64); err == nil {
117+
} else if x, err := strconv.ParseUint(valueExpr.Value[start:], base, 64); err == nil {
118118
return x, nil
119119
} else {
120120
panic(err)

‎testdata/enums/consts/const.go

+1
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ const nonescapestr = `aa\nbb\u8888cc`
1111
const escapestr = "aa\nbb\u8888cc"
1212
const escapechar = '\u8888'
1313
const underscored = 1_000_000
14+
const binaryInteger = 0b10001000

0 commit comments

Comments
 (0)
Please sign in to comment.