blob: 623d5c3953a10d82560e07266a2f3e385e28dbab [file] [log] [blame]
// Copyright 2021 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package fix
import (
"cuelang.org/go/cue/ast"
"cuelang.org/go/cue/ast/astutil"
"cuelang.org/go/cue/token"
)
func simplify(f *ast.File) *ast.File {
// Rewrite disjunctions with _ to _.
f = astutil.Apply(f, nil, func(c astutil.Cursor) bool {
if x, ok := c.Node().(ast.Expr); ok {
if y := elideTop(x); x != y {
c.Replace(y)
}
}
return true
}).(*ast.File)
return f
}
func elideTop(x ast.Expr) ast.Expr {
switch x := x.(type) {
case *ast.BinaryExpr:
switch x.Op {
case token.OR:
if isTop(x.X) {
return x.X
}
if isTop(x.Y) {
ast.SetRelPos(x.Y, token.NoRelPos)
return x.Y
}
case token.AND:
if isTop(x.X) {
ast.SetRelPos(x.Y, token.NoRelPos)
return x.Y
}
if isTop(x.Y) {
return x.X
}
}
case *ast.ParenExpr:
switch x.X.(type) {
case *ast.BinaryExpr, *ast.UnaryExpr:
default:
return x.X
}
}
return x
}
func isTop(x ast.Expr) bool {
v, ok := x.(*ast.Ident)
return ok && v.Name == "_"
}