HTML5/Javascript Analyser specificities *************************************** .. note:: This documentation applies to CAIP >= 8.3.x and com.castsoftware.html5 >= 2.1.1-funcrel. .. toctree:: :maxdepth: 5 HowTo ===== Create your own UA extension, then react to the "add_quality_rules" event received from HTML5/Javascript extension. With this event, you can send any interpreters of your choice, which will be used by HTML5/Javascript. These interpreters will have "start_XXX" and/or "end_XXX" methods where XXX is the ast node type you are interested in. They must have also a "finish" method. Sample of UA extension code :: import cast.analysers.ua from cast import Event from cast.analysers import log from interpreter import Interpreter class Html5Diag(cast.analysers.ua.Extension): @Event('com.castsoftware.html5', 'add_quality_rules') def add_quality_rules(self, externalQualityRules): interpreter = Interpreter() externalQualityRules.add_interpreter(interpreter, self.get_plugin()) Sample of interpreter code :: class Interpreter: def __init__(self): pass def start_JsContent(self, ast): pass def end_JsContent(self, ast): pass def finish(self): pass A complete sample can be found here : :ref:`starter-kit`. Javascript ast nodes types ========================== .. autoclass:: javascript_parser.symbols.AstToken .. automethod:: javascript_parser.symbols.AstToken.get_children .. automethod:: javascript_parser.symbols.AstToken.get_name .. automethod:: javascript_parser.symbols.AstToken.get_kb_object .. automethod:: javascript_parser.symbols.AstToken.get_first_kb_parent .. automethod:: javascript_parser.symbols.AstToken.get_begin_line .. automethod:: javascript_parser.symbols.AstToken.get_begin_column .. automethod:: javascript_parser.symbols.AstToken.get_end_line .. automethod:: javascript_parser.symbols.AstToken.get_end_column .. automethod:: javascript_parser.symbols.AstToken.get_resolutions .. automethod:: javascript_parser.symbols.AstToken.is_ast_token .. automethod:: javascript_parser.symbols.AstToken.is_try_catch_block .. automethod:: javascript_parser.symbols.AstToken.is_var_declaration .. automethod:: javascript_parser.symbols.AstToken.is_let_declaration .. automethod:: javascript_parser.symbols.AstToken.is_const_declaration .. automethod:: javascript_parser.symbols.AstToken.is_new_statement .. automethod:: javascript_parser.symbols.AstToken.is_export_statement .. automethod:: javascript_parser.symbols.AstToken.is_export_default_statement .. automethod:: javascript_parser.symbols.AstToken.is_return_statement .. automethod:: javascript_parser.symbols.AstToken.is_return_new_statement .. automethod:: javascript_parser.symbols.AstToken.is_continue_statement .. automethod:: javascript_parser.symbols.AstToken.is_import_statement .. automethod:: javascript_parser.symbols.AstToken.is_break_statement .. automethod:: javascript_parser.symbols.AstToken.is_delete_statement .. automethod:: javascript_parser.symbols.AstToken.is_new_expression .. automethod:: javascript_parser.symbols.AstToken.is_loop .. automethod:: javascript_parser.symbols.AstToken.is_for_block .. automethod:: javascript_parser.symbols.AstToken.is_for_in_block .. automethod:: javascript_parser.symbols.AstToken.is_identifier .. automethod:: javascript_parser.symbols.AstToken.is_function .. automethod:: javascript_parser.symbols.AstToken.is_class .. automethod:: javascript_parser.symbols.AstToken.is_arrow_function .. automethod:: javascript_parser.symbols.AstToken.is_js_content .. automethod:: javascript_parser.symbols.AstToken.is_function_call .. automethod:: javascript_parser.symbols.AstToken.is_js_function_call .. automethod:: javascript_parser.symbols.AstToken.is_function_call_part .. automethod:: javascript_parser.symbols.AstToken.is_list .. automethod:: javascript_parser.symbols.AstToken.is_string .. automethod:: javascript_parser.symbols.AstToken.is_assignment .. automethod:: javascript_parser.symbols.AstToken.is_object_value .. automethod:: javascript_parser.symbols.AstToken.is_operator .. automethod:: javascript_parser.symbols.AstToken.is_binary_expression .. automethod:: javascript_parser.symbols.AstToken.is_addition_expression .. automethod:: javascript_parser.symbols.AstToken.is_or_expression .. automethod:: javascript_parser.symbols.AstToken.is_in_expression .. automethod:: javascript_parser.symbols.AstToken.is_unary_expression .. automethod:: javascript_parser.symbols.AstToken.is_jsx_expression .. automethod:: javascript_parser.symbols.AstToken.is_if_ternary_expression .. automethod:: javascript_parser.symbols.AstToken.is_not_expression .. automethod:: javascript_parser.symbols.AstToken.is_equality_expression .. automethod:: javascript_parser.symbols.AstToken.is_switch_block .. automethod:: javascript_parser.symbols.AstToken.is_method .. automethod:: javascript_parser.symbols.AstToken.is_constructor Statements ---------- .. autoclass:: javascript_parser.symbols.StatementList :show-inheritance: .. automethod:: javascript_parser.symbols.StatementList.get_statements .. autoclass:: javascript_parser.symbols.JsContent :show-inheritance: .. automethod:: javascript_parser.symbols.JsContent.get_file .. autoclass:: javascript_parser.symbols.Identifier :show-inheritance: .. automethod:: javascript_parser.symbols.Identifier.get_prefix .. method:: get_fullname() Fullname of identifier. :rtype: str .. autoclass:: javascript_parser.symbols.AstOperator :show-inheritance: .. autoclass:: javascript_parser.symbols.AstString :show-inheritance: .. autoclass:: javascript_parser.symbols.IfStatement :show-inheritance: .. automethod:: javascript_parser.symbols.IfStatement.get_if_block .. automethod:: javascript_parser.symbols.IfStatement.get_else_if_blocks .. automethod:: javascript_parser.symbols.IfStatement.get_else_block .. autoclass:: javascript_parser.symbols.IfBlock :show-inheritance: .. automethod:: javascript_parser.symbols.IfBlock.get_expression .. autoclass:: javascript_parser.symbols.ElseIfBlock :show-inheritance: .. automethod:: javascript_parser.symbols.ElseIfBlock.get_expression .. autoclass:: javascript_parser.symbols.ElseBlock :show-inheritance: .. autoclass:: javascript_parser.symbols.WhileBlock :show-inheritance: .. automethod:: javascript_parser.symbols.WhileBlock.get_expression .. autoclass:: javascript_parser.symbols.ForBlock :show-inheritance: .. automethod:: javascript_parser.symbols.ForBlock.get_start_expressions .. automethod:: javascript_parser.symbols.ForBlock.get_termination_expression .. automethod:: javascript_parser.symbols.ForBlock.get_forward_expression .. autoclass:: javascript_parser.symbols.ForEachBlock :show-inheritance: .. automethod:: javascript_parser.symbols.ForEachBlock.get_expression .. autoclass:: javascript_parser.symbols.DoBlock :show-inheritance: .. automethod:: javascript_parser.symbols.DoBlock.get_expression .. autoclass:: javascript_parser.symbols.SwitchStatement :show-inheritance: .. automethod:: javascript_parser.symbols.SwitchStatement.get_expression .. automethod:: javascript_parser.symbols.SwitchStatement.get_case_blocks .. automethod:: javascript_parser.symbols.SwitchStatement.get_default_block .. autoclass:: javascript_parser.symbols.SwitchCaseBlock :show-inheritance: .. automethod:: javascript_parser.symbols.SwitchCaseBlock.get_expression .. autoclass:: javascript_parser.symbols.SwitchDefaultBlock :show-inheritance: .. autoclass:: javascript_parser.symbols.AstBlock :show-inheritance: .. autoclass:: javascript_parser.symbols.TryCatchBlock :show-inheritance: .. automethod:: javascript_parser.symbols.TryCatchBlock.get_try_block .. automethod:: javascript_parser.symbols.TryCatchBlock.get_catch_blocks .. automethod:: javascript_parser.symbols.TryCatchBlock.get_finally_block .. autoclass:: javascript_parser.symbols.CatchBlock :show-inheritance: .. automethod:: javascript_parser.symbols.CatchBlock.get_expression .. autoclass:: javascript_parser.symbols.FinallyBlock :show-inheritance: .. autoclass:: javascript_parser.symbols.AstList :show-inheritance: .. automethod:: javascript_parser.symbols.AstList.get_values .. autoclass:: javascript_parser.symbols.ObjectValue :show-inheritance: .. automethod:: javascript_parser.symbols.ObjectValue.get_item .. autoclass:: javascript_parser.symbols.Function :show-inheritance: .. automethod:: javascript_parser.symbols.Function.is_anonymous .. automethod:: javascript_parser.symbols.Function.get_prefix .. method:: get_fullname() Fullname of function. :rtype: str .. automethod:: javascript_parser.symbols.Function.get_parameters .. autoclass:: javascript_parser.symbols.ArrowFunction :show-inheritance: .. autoclass:: javascript_parser.symbols.FunctionCall :show-inheritance: .. automethod:: javascript_parser.symbols.FunctionCall.get_function_call_parts .. autoclass:: javascript_parser.symbols.FunctionCallPart :show-inheritance: .. automethod:: javascript_parser.symbols.FunctionCallPart.get_identifier .. automethod:: javascript_parser.symbols.FunctionCallPart.get_parameters .. method:: get_fullname() Fullname. :rtype: str .. autoclass:: javascript_parser.symbols.ImportStatement :show-inheritance: .. automethod:: javascript_parser.symbols.ImportStatement.get_what .. automethod:: javascript_parser.symbols.ImportStatement.get_from .. automethod:: javascript_parser.symbols.ImportStatement.get_from_js_content .. autoclass:: javascript_parser.symbols.AnyStatement :show-inheritance: .. automethod:: javascript_parser.symbols.AnyStatement.get_elements .. automethod:: javascript_parser.symbols.AnyStatement.is_return_statement .. automethod:: javascript_parser.symbols.AnyStatement.is_continue_statement .. automethod:: javascript_parser.symbols.AnyStatement.is_export_statement .. automethod:: javascript_parser.symbols.AnyStatement.is_export_default_statement .. automethod:: javascript_parser.symbols.AnyStatement.is_break_statement .. automethod:: javascript_parser.symbols.AnyStatement.is_return_new_statement .. automethod:: javascript_parser.symbols.AnyStatement.is_delete_statement .. autoclass:: javascript_parser.symbols.VarDeclaration :show-inheritance: .. automethod:: javascript_parser.symbols.VarDeclaration.get_elements .. autoclass:: javascript_parser.symbols.Assignment :show-inheritance: .. method:: is_var() :return: True if the assignment is part of a VarDeclaration :rtype: Boolean .. automethod:: javascript_parser.symbols.Assignment.is_exported .. automethod:: javascript_parser.symbols.Assignment.get_left_operand .. automethod:: javascript_parser.symbols.Assignment.get_right_operand .. autoclass:: javascript_parser.symbols.Class :show-inheritance: .. method:: get_fullname() Fullname. :rtype: str .. automethod:: javascript_parser.symbols.Class.get_methods .. automethod:: javascript_parser.symbols.Class.get_method .. autoclass:: javascript_parser.symbols.Method :show-inheritance: .. automethod:: javascript_parser.symbols.Method.is_static .. automethod:: javascript_parser.symbols.Method.is_constructor .. autoclass:: javascript_parser.symbols.JSFunctionCall :show-inheritance: .. automethod:: javascript_parser.symbols.JSFunctionCall.get_function Expressions ----------- .. autoclass:: javascript_parser.symbols.AnyExpression :show-inheritance: .. automethod:: javascript_parser.symbols.AnyExpression.get_elements .. automethod:: javascript_parser.symbols.AnyExpression.is_new_expression .. autoclass:: javascript_parser.symbols.UnaryExpression :show-inheritance: .. automethod:: javascript_parser.symbols.UnaryExpression.get_operand .. autoclass:: javascript_parser.symbols.BinaryExpression :show-inheritance: .. automethod:: javascript_parser.symbols.BinaryExpression.set_left_operand .. automethod:: javascript_parser.symbols.BinaryExpression.set_right_operand .. autoclass:: javascript_parser.symbols.EqualBinaryExpression :show-inheritance: .. autoclass:: javascript_parser.symbols.NotEqualBinaryExpression :show-inheritance: .. autoclass:: javascript_parser.symbols.IfTernaryExpression :show-inheritance: .. automethod:: javascript_parser.symbols.IfTernaryExpression.get_if_operand .. automethod:: javascript_parser.symbols.IfTernaryExpression.get_then_operand .. automethod:: javascript_parser.symbols.IfTernaryExpression.get_else_operand .. autoclass:: javascript_parser.symbols.AdditionExpression :show-inheritance: .. autoclass:: javascript_parser.symbols.OrExpression :show-inheritance: .. autoclass:: javascript_parser.symbols.InExpression :show-inheritance: .. autoclass:: javascript_parser.symbols.NotExpression :show-inheritance: .. autoclass:: javascript_parser.symbols.JsxExpression :show-inheritance: .. automethod:: javascript_parser.symbols.JsxExpression.get_tag .. automethod:: javascript_parser.symbols.JsxExpression.get_attributes_values_full_ast .. automethod:: javascript_parser.symbols.JsxExpression.get_attributes_values .. automethod:: javascript_parser.symbols.JsxExpression.get_sub_expressions Writing tests ============= Sample of a test :: import unittest import cast.analysers.test import cast.analysers.ua class Test(unittest.TestCase): def test_ok1(self): analysis = cast.analysers.test.UATestAnalysis('HTML5') analysis.add_selection('test1') analysis.add_dependency(r'C:\ProgramData\CAST\CAST\Extensions\com.castsoftware.html5.2.1.1-funcrel') analysis.run() f = analysis.get_object_by_name('f', 'CAST_HTML5_JavaScript_Function') self.assertTrue(f) _value = f.get_value('CAST_Html5Diags_Metric_UseOfBreakInWhile.numberOfBreakInWhile') self.assertEqual('1', _value) if __name__ == '__main__': unittest.main() .. note:: You need to add a dependency to the folder containing com.castsoftware.html5, for example :: analysis.add_dependency(r'C:\ProgramData\CAST\CAST\Extensions\com.castsoftware.html5.2.1.1-funcrel') For that you need to have downloaded the extension through CAST ExtensionDowloader: see https://doc.castsoftware.com/display/EXTEND/CAST+Extension+Downloader .. _HTML5_categories: Categories and types for quality rules ====================================== For adding a quality rule on * Category `CAST_HTML5_JavaScript_Metrics_Category` .. _HTML5_scopes: Quality rule scopes =================== Existing quality rule scopes are : +---------+-------------------------------------------------------------------------------------------------------------+ | 1020000 | HTML5 artifacts (Javascript functions, methods, constructors, javascript source code, source code fragments)| +---------+-------------------------------------------------------------------------------------------------------------+ | 1020001 | Javascript functions, methods and constructors | +---------+-------------------------------------------------------------------------------------------------------------+ | 1020005 | HTML5 source code, JSP, ASP, ASPX, HTC contents, Jade source code | +---------+-------------------------------------------------------------------------------------------------------------+ | 1020006 | CSS source code, CSS source code fragments | +---------+-------------------------------------------------------------------------------------------------------------+ | 1020007 | Javascript class | +---------+-------------------------------------------------------------------------------------------------------------+ HTML5 technologies ====================== Values for technology to be used in IMPLTechnologies.xml for filter value +-------+---------+ | HTML5 | 1020000 | +-------+---------+