mirror of
https://github.com/golang/go
synced 2024-11-26 11:48:03 -07:00
[dev.typeparams] cmd/compile/internal/types2: translate syntax to token constants via tables
This makes the respective files match the respective go/types files a tad more. Change-Id: Ie555e18ed23c493379a1e56b96276867190106f0 Reviewed-on: https://go-review.googlesource.com/c/go/+/287492 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
f7d1c5990b
commit
c0bf904ddf
@ -83,61 +83,6 @@ func (check *Checker) op(m opPredicates, x *operand, op syntax.Operator) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func op2token(op syntax.Operator) token.Token {
|
|
||||||
switch op {
|
|
||||||
case syntax.Def: // :
|
|
||||||
unreachable()
|
|
||||||
case syntax.Not: // !
|
|
||||||
return token.NOT
|
|
||||||
case syntax.Recv: // <-
|
|
||||||
unreachable()
|
|
||||||
|
|
||||||
case syntax.OrOr: // ||
|
|
||||||
return token.LOR
|
|
||||||
case syntax.AndAnd: // &&
|
|
||||||
return token.LAND
|
|
||||||
|
|
||||||
case syntax.Eql: // ==
|
|
||||||
return token.EQL
|
|
||||||
case syntax.Neq: // !=
|
|
||||||
return token.NEQ
|
|
||||||
case syntax.Lss: // <
|
|
||||||
return token.LSS
|
|
||||||
case syntax.Leq: // <=
|
|
||||||
return token.LEQ
|
|
||||||
case syntax.Gtr: // >
|
|
||||||
return token.GTR
|
|
||||||
case syntax.Geq: // >=
|
|
||||||
return token.GEQ
|
|
||||||
|
|
||||||
case syntax.Add: // +
|
|
||||||
return token.ADD
|
|
||||||
case syntax.Sub: // -
|
|
||||||
return token.SUB
|
|
||||||
case syntax.Or: // |
|
|
||||||
return token.OR
|
|
||||||
case syntax.Xor: // ^
|
|
||||||
return token.XOR
|
|
||||||
|
|
||||||
case syntax.Mul: // *
|
|
||||||
return token.MUL
|
|
||||||
case syntax.Div: // /
|
|
||||||
return token.QUO
|
|
||||||
case syntax.Rem: // %
|
|
||||||
return token.REM
|
|
||||||
case syntax.And: // &
|
|
||||||
return token.AND
|
|
||||||
case syntax.AndNot: // &^
|
|
||||||
return token.AND_NOT
|
|
||||||
case syntax.Shl: // <<
|
|
||||||
return token.SHL
|
|
||||||
case syntax.Shr: // >>
|
|
||||||
return token.SHR
|
|
||||||
}
|
|
||||||
|
|
||||||
return token.ILLEGAL
|
|
||||||
}
|
|
||||||
|
|
||||||
// The unary expression e may be nil. It's passed in for better error messages only.
|
// The unary expression e may be nil. It's passed in for better error messages only.
|
||||||
func (check *Checker) unary(x *operand, e *syntax.Operation, op syntax.Operator) {
|
func (check *Checker) unary(x *operand, e *syntax.Operation, op syntax.Operator) {
|
||||||
switch op {
|
switch op {
|
||||||
@ -182,7 +127,7 @@ func (check *Checker) unary(x *operand, e *syntax.Operation, op syntax.Operator)
|
|||||||
if isUnsigned(typ) {
|
if isUnsigned(typ) {
|
||||||
prec = uint(check.conf.sizeof(typ) * 8)
|
prec = uint(check.conf.sizeof(typ) * 8)
|
||||||
}
|
}
|
||||||
x.val = constant.UnaryOp(op2token(op), x.val, prec)
|
x.val = constant.UnaryOp(op2tok[op], x.val, prec)
|
||||||
// Typed constants must be representable in
|
// Typed constants must be representable in
|
||||||
// their type after each constant operation.
|
// their type after each constant operation.
|
||||||
if isTyped(typ) {
|
if isTyped(typ) {
|
||||||
@ -738,7 +683,7 @@ func (check *Checker) comparison(x, y *operand, op syntax.Operator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if x.mode == constant_ && y.mode == constant_ {
|
if x.mode == constant_ && y.mode == constant_ {
|
||||||
x.val = constant.MakeBool(constant.Compare(x.val, op2token(op), y.val))
|
x.val = constant.MakeBool(constant.Compare(x.val, op2tok[op], y.val))
|
||||||
// The operands are never materialized; no need to update
|
// The operands are never materialized; no need to update
|
||||||
// their types.
|
// their types.
|
||||||
} else {
|
} else {
|
||||||
@ -819,7 +764,7 @@ func (check *Checker) shift(x, y *operand, e *syntax.Operation, op syntax.Operat
|
|||||||
x.typ = Typ[UntypedInt]
|
x.typ = Typ[UntypedInt]
|
||||||
}
|
}
|
||||||
// x is a constant so xval != nil and it must be of Int kind.
|
// x is a constant so xval != nil and it must be of Int kind.
|
||||||
x.val = constant.Shift(xval, op2token(op), uint(s))
|
x.val = constant.Shift(xval, op2tok[op], uint(s))
|
||||||
// Typed constants must be representable in
|
// Typed constants must be representable in
|
||||||
// their type after each constant operation.
|
// their type after each constant operation.
|
||||||
if isTyped(x.typ) {
|
if isTyped(x.typ) {
|
||||||
@ -965,7 +910,7 @@ func (check *Checker) binary(x *operand, e *syntax.Operation, lhs, rhs syntax.Ex
|
|||||||
yval := y.val
|
yval := y.val
|
||||||
typ := x.typ.Basic()
|
typ := x.typ.Basic()
|
||||||
// force integer division of integer operands
|
// force integer division of integer operands
|
||||||
tok := op2token(op)
|
tok := op2tok[op]
|
||||||
if op == syntax.Div && isInteger(typ) {
|
if op == syntax.Div && isInteger(typ) {
|
||||||
tok = token.QUO_ASSIGN
|
tok = token.QUO_ASSIGN
|
||||||
}
|
}
|
||||||
@ -1951,3 +1896,33 @@ func (check *Checker) singleValue(x *operand) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// op2tok translates syntax.Operators into token.Tokens.
|
||||||
|
var op2tok = [...]token.Token{
|
||||||
|
syntax.Def: token.ILLEGAL,
|
||||||
|
syntax.Not: token.NOT,
|
||||||
|
syntax.Recv: token.ILLEGAL,
|
||||||
|
|
||||||
|
syntax.OrOr: token.LOR,
|
||||||
|
syntax.AndAnd: token.LAND,
|
||||||
|
|
||||||
|
syntax.Eql: token.EQL,
|
||||||
|
syntax.Neq: token.NEQ,
|
||||||
|
syntax.Lss: token.LSS,
|
||||||
|
syntax.Leq: token.LEQ,
|
||||||
|
syntax.Gtr: token.GTR,
|
||||||
|
syntax.Geq: token.GEQ,
|
||||||
|
|
||||||
|
syntax.Add: token.ADD,
|
||||||
|
syntax.Sub: token.SUB,
|
||||||
|
syntax.Or: token.OR,
|
||||||
|
syntax.Xor: token.XOR,
|
||||||
|
|
||||||
|
syntax.Mul: token.MUL,
|
||||||
|
syntax.Div: token.QUO,
|
||||||
|
syntax.Rem: token.REM,
|
||||||
|
syntax.And: token.AND,
|
||||||
|
syntax.AndNot: token.AND_NOT,
|
||||||
|
syntax.Shl: token.SHL,
|
||||||
|
syntax.Shr: token.SHR,
|
||||||
|
}
|
||||||
|
@ -206,29 +206,23 @@ func (x *operand) String() string {
|
|||||||
|
|
||||||
// setConst sets x to the untyped constant for literal lit.
|
// setConst sets x to the untyped constant for literal lit.
|
||||||
func (x *operand) setConst(k syntax.LitKind, lit string) {
|
func (x *operand) setConst(k syntax.LitKind, lit string) {
|
||||||
var tok token.Token
|
|
||||||
var kind BasicKind
|
var kind BasicKind
|
||||||
switch k {
|
switch k {
|
||||||
case syntax.IntLit:
|
case syntax.IntLit:
|
||||||
tok = token.INT
|
|
||||||
kind = UntypedInt
|
kind = UntypedInt
|
||||||
case syntax.FloatLit:
|
case syntax.FloatLit:
|
||||||
tok = token.FLOAT
|
|
||||||
kind = UntypedFloat
|
kind = UntypedFloat
|
||||||
case syntax.ImagLit:
|
case syntax.ImagLit:
|
||||||
tok = token.IMAG
|
|
||||||
kind = UntypedComplex
|
kind = UntypedComplex
|
||||||
case syntax.RuneLit:
|
case syntax.RuneLit:
|
||||||
tok = token.CHAR
|
|
||||||
kind = UntypedRune
|
kind = UntypedRune
|
||||||
case syntax.StringLit:
|
case syntax.StringLit:
|
||||||
tok = token.STRING
|
|
||||||
kind = UntypedString
|
kind = UntypedString
|
||||||
default:
|
default:
|
||||||
unreachable()
|
unreachable()
|
||||||
}
|
}
|
||||||
|
|
||||||
val := constant.MakeFromLiteral(lit, tok, 0)
|
val := constant.MakeFromLiteral(lit, kind2tok[k], 0)
|
||||||
if val.Kind() == constant.Unknown {
|
if val.Kind() == constant.Unknown {
|
||||||
x.mode = invalid
|
x.mode = invalid
|
||||||
x.typ = Typ[Invalid]
|
x.typ = Typ[Invalid]
|
||||||
@ -334,3 +328,12 @@ func (x *operand) assignableTo(check *Checker, T Type, reason *string) bool {
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// kind2tok translates syntax.LitKinds into token.Tokens.
|
||||||
|
var kind2tok = [...]token.Token{
|
||||||
|
syntax.IntLit: token.INT,
|
||||||
|
syntax.FloatLit: token.FLOAT,
|
||||||
|
syntax.ImagLit: token.IMAG,
|
||||||
|
syntax.RuneLit: token.CHAR,
|
||||||
|
syntax.StringLit: token.STRING,
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user