Documentation ¶
Overview ¶
native package is used to parse AST using an external binary.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrEmptyAST = errors.NewKind("input AST was empty") ErrTwoTokensSameNode = errors.NewKind("token was already set (%s != %s)") ErrTwoTypesSameNode = errors.NewKind("internal type was already set (%s != %s)") ErrUnexpectedObject = errors.NewKind("expected object of type %s, got: %#v") ErrUnexpectedObjectSize = errors.NewKind("expected object of size %d, got %d") ErrUnsupported = errors.NewKind("unsupported: %s") )
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a wrapper of the native command.
func ExecClient ¶
ExecNative executes the given command and returns a *Client for it.
func (*Client) ParseNative ¶
func (c *Client) ParseNative(req *ParseNativeRequest) (*ParseNativeResponse, error)
ParseNative sends a request to the native client and returns its response.
type ObjectToNoder ¶
type ObjectToNoder struct { // InternalTypeKey is the name of the key that the native AST uses // to differentiate the type of the AST nodes. This internal key will then be // checkable in the AnnotationRules with the `HasInternalType` predicate. This // field is mandatory. InternalTypeKey string // OffsetKey is the key used in the native AST to indicate the absolute offset, // from the file start position, where the code mapped to the AST node starts. OffsetKey string // EndOffsetKey is the key used in the native AST to indicate the absolute offset, // from the file start position, where the code mapped to the AST node ends. EndOffsetKey string // LineKey is the key used in the native AST to indicate // the line number where the code mapped to the AST node starts. LineKey string // EndLineKey is the key used in the native AST to indicate // the line number where the code mapped to the AST node ends. EndLineKey string // ColumnKey is a key that indicates the column inside the line ColumnKey string // EndColumnKey is a key that indicates the column inside the line where the node ends. EndColumnKey string // TokenKeys establishes what properties (as in JSON // keys) in the native AST nodes can be mapped to Tokens in the UAST. If the // InternalTypeKey is the "type" of a node, the Token could be tough of as the // "value" representation; this could be a specific value for string/numeric // literals or the symbol name for others. E.g.: if a native AST represents a // numeric literal as: `{"ast_type": NumLiteral, "value": 2}` then you should have // to add `"value": true` to the TokenKeys map. Some native ASTs will use several // different fields as tokens depending on the node type; in that case, all should // be added to this map to ensure a correct UAST generation. TokenKeys map[string]bool // SyntheticTokens is a map of InternalType to string used to add // synthetic tokens to nodes depending on its InternalType; sometimes native ASTs just use an // InternalTypeKey for some node but we need to add a Token to the UAST node to // improve the representation. In this case we can add both the InternalKey and // what token it should generate. E.g.: an InternalTypeKey called "NullLiteral" in // Java should be mapped using this map to "null" adding “`"NullLiteral": // "null"“` to this map. SyntheticTokens map[string]string // PromotedPropertyLists allows to convert some properties in the native AST with a list value // to its own node with the list elements as children. By default the UAST // generation will set as children of a node any object that hangs from any of the // original native AST node properties. In this process, object key serving as // the parent is lost and its name is added as the "internalRole" key of the children. // This is usually fine since the InternalTypeKey of the parent AST node will // usually provide enough context and the node won't any other children. This map // allows you to change this default behavior for specific nodes so the properties // are "promoted" to a new node (with an InternalTypeKey named "Parent.KeyName") // and the objects in its list will be shown in the UAST as children. E.g.: if you // have a native AST where an "If" node has the JSON keys "body", "else" and // "condition" each with its own list of children, you could add an entry to // PromotedPropertyLists like // // "If": {"body": true, "orelse": true, "condition": true}, // // In this case, the new nodes will have the InternalTypeKey "If.body", "If.orelse" // and "If.condition" and with these names you should be able to write specific // matching rules in the annotation.go file. PromotedPropertyLists map[string]map[string]bool // If this option is set, all properties mapped to a list will be promoted to its own node. Setting // this option to true will ignore the PromotedPropertyLists settings. PromoteAllPropertyLists bool // PromotedPropertyStrings allows to convert some properties which value is a string // in the native AST as a full node with the string value as Token like: // // "SomeKey": "SomeValue" // // that would be converted to a child node like: // // {"internalType": "SomeKey", "Token": "SomeValue"} PromotedPropertyStrings map[string]map[string]bool // TopLevelIsRootNode tells ToNode where to find the root node of // the AST. If true, the root will be its input argument. If false, // the root will be the value of the only key present in its input // argument. TopLevelIsRootNode bool // PositionFill specifies if the noder has to fill missing positions (col, line, offset) // from ones that the native AST fills. The possible values are "None" (don't fill // anything), "OffsetFromLineCol" (fill the offset from the line and column values) and // "LineColFromOffset" (fill line and col from the offset). PositionFill FillType }
ObjectToNoder is a ToNoder for trees that are represented as nested JSON objects. That is, an interface{} containing maps, slices, strings and integers. It then converts from that structure to *Node.
type ParseNativeRequest ¶
type ParseNativeRequest struct { Content string `json:"content"` Encoding protocol.Encoding `json:"encoding"` }
ParseNativeRequest to use with the native parser. This is for internal use.
type ParseNativeResponse ¶
type ParseNativeResponse struct { Status protocol.Status `json:"status"` Errors []string `json:"errors"` AST interface{} `json:"ast"` }
ParseNativeResponse is the reply to ParseNativeRequest by the native parser.
type Parser ¶
Parser uses a *Client to parse source code and a ToNoder to convert it to a *uast.Node.
func ExecParser ¶
ExecParser constructs a uast.Parser based on a native parser binary.
func (*Parser) Parse ¶
func (p *Parser) Parse(req *protocol.ParseRequest) *protocol.ParseResponse