mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	* Dropped unused codekit config * Integrated dynamic and static bindata for public * Ignore public bindata * Add a general generate make task * Integrated flexible public assets into web command * Updated vendoring, added all missiong govendor deps * Made the linter happy with the bindata and dynamic code * Moved public bindata definition to modules directory * Ignoring the new bindata path now * Updated to the new public modules import path * Updated public bindata command and drop the new prefix
		
			
				
	
	
		
			171 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2015 PingCAP, Inc.
 | 
						|
//
 | 
						|
// 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,
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
package ast
 | 
						|
 | 
						|
import "fmt"
 | 
						|
 | 
						|
// Cloner is an ast visitor that clones a node.
 | 
						|
type Cloner struct {
 | 
						|
}
 | 
						|
 | 
						|
// Enter implements Visitor Enter interface.
 | 
						|
func (c *Cloner) Enter(node Node) (Node, bool) {
 | 
						|
	return copyStruct(node), false
 | 
						|
}
 | 
						|
 | 
						|
// Leave implements Visitor Leave interface.
 | 
						|
func (c *Cloner) Leave(in Node) (out Node, ok bool) {
 | 
						|
	return in, true
 | 
						|
}
 | 
						|
 | 
						|
// copyStruct copies a node's struct value, if the struct has slice member,
 | 
						|
// make a new slice and copy old slice value to new slice.
 | 
						|
func copyStruct(in Node) (out Node) {
 | 
						|
	switch v := in.(type) {
 | 
						|
	case *ValueExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *BetweenExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *BinaryOperationExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *WhenClause:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *CaseExpr:
 | 
						|
		nv := *v
 | 
						|
		nv.WhenClauses = make([]*WhenClause, len(v.WhenClauses))
 | 
						|
		copy(nv.WhenClauses, v.WhenClauses)
 | 
						|
		out = &nv
 | 
						|
	case *SubqueryExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *CompareSubqueryExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ColumnName:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ColumnNameExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *DefaultExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ExistsSubqueryExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *PatternInExpr:
 | 
						|
		nv := *v
 | 
						|
		nv.List = make([]ExprNode, len(v.List))
 | 
						|
		copy(nv.List, v.List)
 | 
						|
		out = &nv
 | 
						|
	case *IsNullExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *IsTruthExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *PatternLikeExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ParamMarkerExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ParenthesesExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *PositionExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *PatternRegexpExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *RowExpr:
 | 
						|
		nv := *v
 | 
						|
		nv.Values = make([]ExprNode, len(v.Values))
 | 
						|
		copy(nv.Values, v.Values)
 | 
						|
		out = &nv
 | 
						|
	case *UnaryOperationExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ValuesExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *VariableExpr:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *Join:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *TableName:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *TableSource:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *OnCondition:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *WildCardField:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *SelectField:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *FieldList:
 | 
						|
		nv := *v
 | 
						|
		nv.Fields = make([]*SelectField, len(v.Fields))
 | 
						|
		copy(nv.Fields, v.Fields)
 | 
						|
		out = &nv
 | 
						|
	case *TableRefsClause:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *ByItem:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *GroupByClause:
 | 
						|
		nv := *v
 | 
						|
		nv.Items = make([]*ByItem, len(v.Items))
 | 
						|
		copy(nv.Items, v.Items)
 | 
						|
		out = &nv
 | 
						|
	case *HavingClause:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *OrderByClause:
 | 
						|
		nv := *v
 | 
						|
		nv.Items = make([]*ByItem, len(v.Items))
 | 
						|
		copy(nv.Items, v.Items)
 | 
						|
		out = &nv
 | 
						|
	case *SelectStmt:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	case *UnionSelectList:
 | 
						|
		nv := *v
 | 
						|
		nv.Selects = make([]*SelectStmt, len(v.Selects))
 | 
						|
		copy(nv.Selects, v.Selects)
 | 
						|
		out = &nv
 | 
						|
	case *UnionStmt:
 | 
						|
		nv := *v
 | 
						|
		out = &nv
 | 
						|
	default:
 | 
						|
		// We currently only handle expression and select statement.
 | 
						|
		// Will add more when we need to.
 | 
						|
		panic("unknown ast Node type " + fmt.Sprintf("%T", v))
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 |