vendor tsgo
This commit is contained in:
75
tools/tsgo/internal/ast/flow.go
Normal file
75
tools/tsgo/internal/ast/flow.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package ast
|
||||
|
||||
// FlowFlags
|
||||
|
||||
type FlowFlags uint32
|
||||
|
||||
const (
|
||||
FlowFlagsUnreachable FlowFlags = 1 << 0 // Unreachable code
|
||||
FlowFlagsStart FlowFlags = 1 << 1 // Start of flow graph
|
||||
FlowFlagsBranchLabel FlowFlags = 1 << 2 // Non-looping junction
|
||||
FlowFlagsLoopLabel FlowFlags = 1 << 3 // Looping junction
|
||||
FlowFlagsAssignment FlowFlags = 1 << 4 // Assignment
|
||||
FlowFlagsTrueCondition FlowFlags = 1 << 5 // Condition known to be true
|
||||
FlowFlagsFalseCondition FlowFlags = 1 << 6 // Condition known to be false
|
||||
FlowFlagsSwitchClause FlowFlags = 1 << 7 // Switch statement clause
|
||||
FlowFlagsArrayMutation FlowFlags = 1 << 8 // Potential array mutation
|
||||
FlowFlagsCall FlowFlags = 1 << 9 // Potential assertion call
|
||||
FlowFlagsReduceLabel FlowFlags = 1 << 10 // Temporarily reduce antecedents of label
|
||||
FlowFlagsReferenced FlowFlags = 1 << 11 // Referenced as antecedent once
|
||||
FlowFlagsShared FlowFlags = 1 << 12 // Referenced as antecedent more than once
|
||||
FlowFlagsLabel = FlowFlagsBranchLabel | FlowFlagsLoopLabel
|
||||
FlowFlagsCondition = FlowFlagsTrueCondition | FlowFlagsFalseCondition
|
||||
)
|
||||
|
||||
// FlowNode
|
||||
|
||||
type FlowNode struct {
|
||||
Flags FlowFlags
|
||||
Node *Node // Associated AST node
|
||||
Antecedent *FlowNode // Antecedent for all but FlowLabel
|
||||
Antecedents *FlowList // Linked list of antecedents for FlowLabel
|
||||
}
|
||||
|
||||
type FlowList struct {
|
||||
Flow *FlowNode
|
||||
Next *FlowList
|
||||
}
|
||||
|
||||
type FlowLabel = FlowNode
|
||||
|
||||
// FlowSwitchClauseData (synthetic AST node for FlowFlagsSwitchClause)
|
||||
|
||||
type FlowSwitchClauseData struct {
|
||||
NodeBase
|
||||
SwitchStatement *Node
|
||||
ClauseStart int32 // Start index of case/default clause range
|
||||
ClauseEnd int32 // End index of case/default clause range
|
||||
}
|
||||
|
||||
func NewFlowSwitchClauseData(switchStatement *Node, clauseStart int, clauseEnd int) *Node {
|
||||
node := &FlowSwitchClauseData{}
|
||||
node.SwitchStatement = switchStatement
|
||||
node.ClauseStart = int32(clauseStart)
|
||||
node.ClauseEnd = int32(clauseEnd)
|
||||
return newNode(KindUnknown, node, NodeFactoryHooks{})
|
||||
}
|
||||
|
||||
func (node *FlowSwitchClauseData) IsEmpty() bool {
|
||||
return node.ClauseStart == node.ClauseEnd
|
||||
}
|
||||
|
||||
// FlowReduceLabelData (synthetic AST node for FlowFlagsReduceLabel)
|
||||
|
||||
type FlowReduceLabelData struct {
|
||||
NodeBase
|
||||
Target *FlowLabel // Target label
|
||||
Antecedents *FlowList // Temporary antecedent list
|
||||
}
|
||||
|
||||
func NewFlowReduceLabelData(target *FlowLabel, antecedents *FlowList) *Node {
|
||||
node := &FlowReduceLabelData{}
|
||||
node.Target = target
|
||||
node.Antecedents = antecedents
|
||||
return newNode(KindUnknown, node, NodeFactoryHooks{})
|
||||
}
|
||||
Reference in New Issue
Block a user