mirror of https://github.com/Wilfred/difftastic/
607 lines
16 KiB
Scheme
607 lines
16 KiB
Scheme
; 3.2 Entity declaration {{{
|
|
(entity_header [
|
|
(generic_map_aspect) @error.illegal.map_aspect.generic
|
|
(port_map_aspect) @error.illegal.map_aspect.port
|
|
])
|
|
|
|
(entity_header
|
|
(port_clause)
|
|
(generic_clause) @error.order.generic_after_port)
|
|
|
|
(entity_header
|
|
(port_clause)
|
|
(port_clause) @error.repeated.clause.port)
|
|
|
|
(entity_header
|
|
(generic_clause)
|
|
(generic_clause) @error.repeated.clause.generic)
|
|
|
|
(entity_header [
|
|
(generic_clause ")" @error.missing.semicolon.after_clause .)
|
|
(port_clause ")" @error.missing.semicolon.after_clause .)
|
|
])
|
|
|
|
(entity_declaration
|
|
(declarative_part [
|
|
(variable_declaration)
|
|
(component_declaration)
|
|
(configuration_specification)
|
|
] @error.illegal.declaration))
|
|
|
|
(entity_declaration
|
|
(concurrent_statement_part [
|
|
(block_statement)
|
|
(component_instantiation_statement)
|
|
(simple_concurrent_signal_assignment)
|
|
(conditional_concurrent_signal_assignment)
|
|
(selected_concurrent_signal_assignment)
|
|
(for_generate_statement)
|
|
(if_generate_statement)
|
|
(case_generate_statement)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.statement))
|
|
|
|
;; tree-sitter-cli
|
|
;; NOTE: Only simple cases
|
|
(entity_declaration
|
|
(concurrent_statement_part
|
|
(process_statement
|
|
(sequence_of_statements [
|
|
(simple_waveform_assignment)
|
|
(simple_force_assignment)
|
|
(simple_release_assignment)
|
|
] @error.illegal.assignment.in_passive_process))
|
|
))
|
|
|
|
;; nvim-tree-sitter
|
|
((simple_waveform_assignment)
|
|
(#has-ancestor?
|
|
@error.illegal.assignment.in_passive_process
|
|
entity_declaration))
|
|
|
|
;; nvim-tree-sitter
|
|
((simple_force_assignment)
|
|
(#has-ancestor?
|
|
@error.illegal.assignment.in_passive_process
|
|
entity_declaration))
|
|
|
|
;; nvim-tree-sitter
|
|
((simple_release_assignment)
|
|
(#has-ancestor?
|
|
@error.illegal.assignment.in_passive_process
|
|
entity_declaration))
|
|
|
|
((entity_declaration
|
|
name: (_) @_h
|
|
at_end: (_) @error.misspeling.name @_t)
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
; 3.3 Architecture bodies {{{
|
|
(architecture_body
|
|
(declarative_part
|
|
(variable_declaration) @error.illegal.declaration))
|
|
|
|
((architecture_body
|
|
name: (_) @_h
|
|
at_end: (_) @error.misspeling.name @_t)
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
; 4.2 Subprogram declaration {{{
|
|
(procedure_declaration
|
|
["pure" "impure"] @error.unexpected.purity)
|
|
|
|
(procedure_declaration
|
|
designator: (operator_symbol) @error.illegal.designator.operator_symbol)
|
|
|
|
(procedure_declaration
|
|
(return) @error.unexpected.return)
|
|
|
|
;;
|
|
(function_declaration
|
|
designator: (_) . (function_parameter_clause)? . ";" @error.missing.return)
|
|
|
|
;;
|
|
(subprogram_header [
|
|
(port_clause) @error.illegal.clause.port
|
|
(port_map_aspect) @error.illegal.map_aspect.port
|
|
])
|
|
|
|
(subprogram_header
|
|
(generic_clause)
|
|
(generic_clause) @error.repeated.clause.generic)
|
|
|
|
(subprogram_header
|
|
(generic_map_aspect)
|
|
(generic_map_aspect) @error.repeated.map_aspect.generic)
|
|
|
|
; FIXME
|
|
; Negation rule not supported yet (tree-sitter version v0.19.4)
|
|
;(subprogram_header
|
|
; . !(generic_clause)*
|
|
; . (generic_map_aspect ["generic" "map"] @error.missing.clause.generic)
|
|
; . !(generic_clause)*)
|
|
|
|
; WORKARROUND
|
|
; Only single common case
|
|
(subprogram_header
|
|
. (generic_map_aspect) @error.missing.clause.generic
|
|
. )
|
|
|
|
(subprogram_header
|
|
(generic_map_aspect)
|
|
(generic_clause) @error.order.clause_after_map_aspect)
|
|
|
|
(subprogram_header [
|
|
(generic_clause (semicolon) @error.unexpected.semicolon.after_clause .)
|
|
(generic_map_aspect (semicolon) @error.unexpected.semicolon.after_map_aspect .)
|
|
])
|
|
; }}}
|
|
; 4.2 Subprogram bodies {{{
|
|
(procedure_body
|
|
["pure" "impure"] @error.unexpected.purity)
|
|
|
|
(procedure_body
|
|
designator: (operator_symbol) @error.illegal.designator.operator_symbol)
|
|
|
|
(procedure_body
|
|
at_end: (operator_symbol) @error.illegal.designator.operator_symbol)
|
|
|
|
(procedure_body
|
|
(return) @error.unexpected.return)
|
|
|
|
(procedure_body
|
|
(declarative_part [
|
|
(incomplete_type_declaration)
|
|
(signal_declaration)
|
|
(component_declaration)
|
|
(configuration_specification)
|
|
(disconnection_specification)
|
|
(PSL_Assert_Directive)
|
|
(PSL_Assume_Directive)
|
|
(PSL_Assume_Guarantee_Directive)
|
|
(PSL_Restrict_Directive)
|
|
(PSL_Restrict_Guarantee_Directive)
|
|
(PSL_Cover_Directive)
|
|
(PSL_Fairness_Directive)
|
|
(PSL_Strong_Fairness_Directive)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration))
|
|
|
|
(procedure_body
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))
|
|
|
|
(procedure_body
|
|
"procedure"
|
|
at_end: "function" @error.misspeling.subprogram_kind)
|
|
|
|
((procedure_body
|
|
designator: (_) @_h
|
|
at_end: (_) @error.misspeling.designator @_t)
|
|
(#not-eq? @_h @_t))
|
|
;;
|
|
(function_body
|
|
designator: (_) . (function_parameter_clause)? . "is" @error.missing.return)
|
|
|
|
(function_body
|
|
at_end: ["pure" "impure"] @error.unexpected.purity.at_end)
|
|
|
|
(function_body
|
|
(declarative_part [
|
|
(signal_declaration)
|
|
(component_declaration)
|
|
(configuration_specification)
|
|
(disconnection_specification)
|
|
(PSL_Assert_Directive)
|
|
(PSL_Assume_Directive)
|
|
(PSL_Assume_Guarantee_Directive)
|
|
(PSL_Restrict_Directive)
|
|
(PSL_Restrict_Guarantee_Directive)
|
|
(PSL_Cover_Directive)
|
|
(PSL_Fairness_Directive)
|
|
(PSL_Strong_Fairness_Directive)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration))
|
|
|
|
(function_body
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))
|
|
|
|
(function_body
|
|
"function"
|
|
at_end: "procedure" @error.misspeling.subprogram_kind)
|
|
|
|
((function_body
|
|
designator: (_) @_h
|
|
at_end: (_) @error.misspeling.designator @_t)
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
; 4.3 Subprogram instantiation {{{
|
|
(procedure_instantiation_declaration
|
|
["pure" "impure"] @error.unexpected.purity)
|
|
|
|
(procedure_instantiation_declaration
|
|
designator: (operator_symbol) @error.illegal.designator.operator_symbol)
|
|
|
|
(procedure_instantiation_declaration
|
|
(signature (return) @error.unexpected.return))
|
|
|
|
;;
|
|
(function_instantiation_declaration
|
|
(signature (type_mark) ("," (type_mark))* . "]" @error.missing.return))
|
|
|
|
;;
|
|
(subprogram_map_aspect [
|
|
(generic_clause) @error.illegal.clause.generic
|
|
(port_clause) @error.illegal.clause.port
|
|
(port_map_aspect) @error.illegal.map_aspect.port
|
|
])
|
|
|
|
(subprogram_map_aspect
|
|
(generic_map_aspect)
|
|
(generic_map_aspect) @error.repeated.map_aspect.generic)
|
|
|
|
(subprogram_map_aspect
|
|
(generic_map_aspect (semicolon) @error.unexpected.semicolon.after_map_aspect .))
|
|
; }}}
|
|
; 4.2.2.1 Formal parameter list {{{
|
|
(procedure_parameter_clause [
|
|
(signal_interface_declaration (mode ["buffer" "linkage"]) @error.illegal.mode)
|
|
(variable_interface_declaration (mode ["buffer" "linkage"]) @error.illegal.mode)
|
|
(signal_interface_declaration (default_expression) @error.illegal.default_expression)
|
|
(type_interface_declaration) @error.illegal.interface.type
|
|
(procedure_interface_declaration) @error.illegal.interface.procedure
|
|
(function_interface_declaration) @error.illegal.interface.function
|
|
(package_interface_declaration) @error.illegal.interface.package
|
|
])
|
|
|
|
(function_parameter_clause [
|
|
(signal_interface_declaration (mode ["out" "inout" "buffer" "linkage"]) @error.illegal.mode)
|
|
(signal_interface_declaration (default_expression) @error.illegal.default_expression)
|
|
(variable_interface_declaration) @error.illegal.interface.variable
|
|
(file_interface_declaration) @error.illegal.interface.file
|
|
(type_interface_declaration) @error.illegal.interface.type
|
|
(procedure_interface_declaration) @error.illegal.interface.procedure
|
|
(function_interface_declaration) @error.illegal.interface.function
|
|
(package_interface_declaration) @error.illegal.interface.package
|
|
])
|
|
; }}}
|
|
; 4.5 Subprogram overloading {{{
|
|
((operator_symbol) @error.illegal.operator_symbol
|
|
(#not-match? @error.illegal.operator_symbol "^\"(and|or|nand|nor|xnor|s[rl]l|s[rl]a|ro[rl]|mod|rem|abs|not|\\+|\\-|&|\\?\\?|\\??[<>/]?=|\\??[<>]|\\*\\??)\"$"))
|
|
; }}}
|
|
; 4.5.3 Signatures {{{
|
|
(signature
|
|
"[" . "]" @error.missing.type_mark)
|
|
|
|
(return
|
|
"," @error.unexpected.comma)
|
|
; }}}
|
|
; 4.7 Package declarations {{{
|
|
(package_header [
|
|
(port_clause) @error.illegal.clause.port
|
|
(port_map_aspect) @error.illegal.map_aspect.port
|
|
])
|
|
|
|
(package_header
|
|
(generic_clause)
|
|
(generic_clause) @error.repeated.clause.generic)
|
|
|
|
(package_header
|
|
(generic_map_aspect)
|
|
(generic_map_aspect) @error.repeated.map_aspect.generic)
|
|
|
|
; FIXME
|
|
; Negation rule not supported yet (tree-sitter version v0.19.4)
|
|
;(package_header
|
|
; . !(generic_clause)*
|
|
; . (generic_map_aspect) @error.missing.clause.generic
|
|
; . !(generic_clause)*)
|
|
|
|
; WORKARROUND
|
|
; Only common case
|
|
(package_header
|
|
. (generic_map_aspect) @error.missing.clause.generic
|
|
. )
|
|
|
|
(package_header
|
|
(generic_map_aspect)
|
|
(generic_clause) @error.order.clause_after_map_aspect)
|
|
|
|
(package_header [
|
|
(generic_clause ")" @error.missing.semicolon.after_clause .)
|
|
(generic_map_aspect ")" @error.missing.semicolon.after_map_aspect .)
|
|
])
|
|
|
|
(package_declaration
|
|
(declarative_part [
|
|
(procedure_body)
|
|
(function_body)
|
|
(configuration_specification)
|
|
] @error.illegal.declaration))
|
|
|
|
(package_declaration
|
|
(declarative_part
|
|
(full_type_declaration
|
|
(protected_type_body) @error.illegal.declaration)))
|
|
|
|
(procedure_body
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part [
|
|
(signal_declaration)
|
|
(disconnection_specification)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration))))
|
|
|
|
(procedure_body
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))))
|
|
|
|
(function_body
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part [
|
|
(signal_declaration)
|
|
(disconnection_specification)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration))))
|
|
|
|
(function_body
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))))
|
|
|
|
(process_statement
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part [
|
|
(signal_declaration)
|
|
(disconnection_specification)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration))))
|
|
|
|
(process_statement
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))))
|
|
|
|
(full_type_declaration
|
|
(protected_type_body
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part [
|
|
(signal_declaration)
|
|
(disconnection_specification)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration)))))
|
|
|
|
(full_type_declaration
|
|
(protected_type_body
|
|
(declarative_part
|
|
(package_declaration
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared))))))
|
|
|
|
((package_declaration
|
|
name: (_) @_h
|
|
at_end: (_) @error.misspeling.name @_t)
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
; 4.8 Package bodies {{{
|
|
(package_body
|
|
(declarative_part [
|
|
(signal_declaration)
|
|
(component_declaration)
|
|
(configuration_specification)
|
|
(disconnection_specification)
|
|
(PSL_Assert_Directive)
|
|
(PSL_Assume_Directive)
|
|
(PSL_Assume_Guarantee_Directive)
|
|
(PSL_Restrict_Directive)
|
|
(PSL_Restrict_Guarantee_Directive)
|
|
(PSL_Cover_Directive)
|
|
(PSL_Fairness_Directive)
|
|
(PSL_Strong_Fairness_Directive)
|
|
(PSL_Property_Declaration)
|
|
(PSL_Sequence_Declaration)
|
|
(PSL_Clock_Declaration)
|
|
] @error.illegal.declaration))
|
|
|
|
(procedure_body
|
|
(declarative_part
|
|
(package_body
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))))
|
|
|
|
(function_body
|
|
(declarative_part
|
|
(package_body
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))))
|
|
|
|
(process_statement
|
|
(declarative_part
|
|
(package_body
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared)))))
|
|
|
|
(full_type_declaration
|
|
(protected_type_body
|
|
(declarative_part
|
|
(package_body
|
|
(declarative_part
|
|
(shared_variable_declaration "shared" @error.unexpected.shared))))))
|
|
|
|
((package_body
|
|
package: (_) @_h
|
|
at_end: (_) @error.misspeling.name @_t)
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
; 4.9 Package instantiation declarations {{{
|
|
(package_map_aspect [
|
|
(generic_clause) @error.illegal.clause.generic
|
|
(port_clause) @error.illegal.clause.port
|
|
(port_map_aspect) @error.illegal.map_aspect.port
|
|
])
|
|
|
|
(package_map_aspect
|
|
(generic_map_aspect)
|
|
(generic_map_aspect) @error.repeated.map_aspect.generic)
|
|
|
|
(package_map_aspect
|
|
(generic_map_aspect (semicolon) @error.unexpected.semicolon.after_map_aspect .))
|
|
; }}}
|
|
; 5.2 Scalar types {{{
|
|
(ascending_range
|
|
low: (simple_expression (integer_decimal))
|
|
high: (simple_expression (real_decimal))) @error.illegal.range
|
|
|
|
(ascending_range
|
|
low: (simple_expression (real_decimal))
|
|
high: (simple_expression (integer_decimal))) @error.illegal.range
|
|
|
|
(descending_range
|
|
high: (simple_expression (integer_decimal))
|
|
low: (simple_expression (real_decimal))) @error.illegal.range
|
|
|
|
(descending_range
|
|
high: (simple_expression (real_decimal))
|
|
low: (simple_expression (integer_decimal))) @error.illegal.range
|
|
; }}}
|
|
; 5.2.2 Enumeration types {{{
|
|
((enumeration_type_definition
|
|
literal: (_) @_a
|
|
literal: (_) @error.repeated.enumerator @_b)
|
|
(#eq? @_a @_b))
|
|
; }}}
|
|
; 5.2.4 Physical types {{{
|
|
((physical_type_definition
|
|
(primary_unit_declaration
|
|
name: (_) @_p)
|
|
(secondary_unit_declaration
|
|
name: (_) @error.repeated.unit @_s))
|
|
(#eq? @_p @_s))
|
|
|
|
((physical_type_definition
|
|
(secondary_unit_declaration
|
|
name: (_) @_a)
|
|
(secondary_unit_declaration
|
|
name: (_) @error.repeated.unit @_b))
|
|
(#eq? @_a @_b))
|
|
|
|
(secondary_unit_declaration
|
|
(physical_literal [ (real_decimal) (based_real) ] @error.illegal.floating_point))
|
|
|
|
((full_type_declaration
|
|
name: (_) @_h
|
|
(physical_type_definition
|
|
at_end: (_) @error.misspeling.name @_t))
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
; 5.3.2 Array types {{{
|
|
(index_constraint
|
|
(subtype_indication
|
|
(resolution_function) @error.unexpected.resolution_function))
|
|
|
|
(parameter_specification
|
|
(subtype_indication
|
|
(resolution_function) @error.unexpected.resolution_function))
|
|
|
|
(full_type_declaration
|
|
name: (_) @_t
|
|
(constrained_array_definition
|
|
(subtype_indication
|
|
(type_mark (_) @error.repeated.type @_e)))
|
|
(#eq? @_t @_e))
|
|
|
|
(full_type_declaration
|
|
name: (_) @_t
|
|
(unbounded_array_definition
|
|
(subtype_indication
|
|
(type_mark (_) @error.repeated.type @_e)))
|
|
(#eq? @_t @_e))
|
|
; }}}
|
|
; 5.3.2.3 Predefined array types {{{
|
|
; Predefine array types shall be one dimensional
|
|
(subtype_indication
|
|
(type_mark
|
|
(simple_name) @_t
|
|
(#match? @_t "^(string|(boolean|bit|integer|real|time)_vector)$"))
|
|
(array_constraint
|
|
(index_constraint
|
|
(_)
|
|
(_) @error.illegal.discrete_range)))
|
|
|
|
; String subtypes shall be indexed by positive numbers
|
|
(subtype_indication
|
|
(type_mark
|
|
(simple_name) @_t
|
|
(#eq? @_t "string"))
|
|
(array_constraint
|
|
(index_constraint
|
|
(_
|
|
(simple_expression
|
|
(integer_decimal) @error.illegal.index.zero @_l
|
|
(#eq? @_l "0"))))))
|
|
|
|
(subtype_indication
|
|
(type_mark
|
|
(simple_name) @_t
|
|
(#eq? @_t "string"))
|
|
(array_constraint
|
|
(index_constraint
|
|
(_
|
|
(simple_expression
|
|
(sign) @error.illegal.index.negative)))))
|
|
|
|
; Others predefined array types are indexed by natural numbers
|
|
(subtype_indication
|
|
(type_mark
|
|
(simple_name) @_t
|
|
(#match? @_t "^(boolean|bit|integer|real|time)_vector$"))
|
|
(array_constraint
|
|
(index_constraint
|
|
(_
|
|
(simple_expression
|
|
(sign) @error.illegal.index.negative)))))
|
|
; }}}
|
|
; 5.3.3 Record types {{{
|
|
((identifier_list
|
|
(_) @_a
|
|
(_) @error.repeated.identifier @_b)
|
|
(#eq? @_a @_b))
|
|
|
|
(record_type_definition
|
|
(element_declaration
|
|
(identifier_list (_) @_a))
|
|
(element_declaration
|
|
(identifier_list (_) @error.repeated.identifier @_b))
|
|
(#eq? @_a @_b))
|
|
|
|
((full_type_declaration
|
|
name: (_) @_h
|
|
(record_type_definition
|
|
at_end: (_) @error.misspeling.name @_t))
|
|
(#not-eq? @_h @_t))
|
|
; }}}
|
|
|