Permalink
Browse files

Allow linter to suggest more than one alternative for a suspicious call

  • Loading branch information...
pmoura committed Feb 9, 2019
1 parent 202a3f3 commit 5e65f77ecb6b40f00f749a53a29b33e684184cee
Showing with 234 additions and 218 deletions.
  1. +3 −0 RELEASE_NOTES.md
  2. +1 −1 VERSION.txt
  3. +10 −5 core/core.pl
  4. +12 −4 core/core_messages.lgt
  5. +2 −2 docs/_sources/core_messages_0.rst.txt
  6. +1 −1 docs/_sources/index.rst.txt
  7. +1 −1 docs/_static/documentation_options.js
  8. +1 −1 docs/a_star_interpreter_1.html
  9. +1 −1 docs/after_event_registry_0.html
  10. +1 −1 docs/arbitrary_0.html
  11. +1 −1 docs/assertions_0.html
  12. +1 −1 docs/assertions_1.html
  13. +1 −1 docs/assertions_messages_0.html
  14. +1 −1 docs/assignvars_0.html
  15. +1 −1 docs/assignvarsp_0.html
  16. +1 −1 docs/atom_0.html
  17. +1 −1 docs/atomic_0.html
  18. +1 −1 docs/backend_random_0.html
  19. +1 −1 docs/before_event_registry_0.html
  20. +1 −1 docs/benchmark_generators_0.html
  21. +1 −1 docs/best_first_0.html
  22. +1 −1 docs/bfs_interpreter_0.html
  23. +1 −1 docs/bintree_0.html
  24. +1 −1 docs/bup_interpreter_0.html
  25. +1 −1 docs/callable_0.html
  26. +1 −1 docs/cc_metric_0.html
  27. +1 −1 docs/character_0.html
  28. +1 −1 docs/characterp_0.html
  29. +1 −1 docs/class_hierarchy_0.html
  30. +1 −1 docs/class_hierarchyp_0.html
  31. +1 −1 docs/code_metric_0.html
  32. +1 −1 docs/code_metrics_0.html
  33. +1 −1 docs/code_metrics_messages_0.html
  34. +1 −1 docs/code_metrics_utilities_0.html
  35. +1 −1 docs/comparingp_0.html
  36. +1 −1 docs/compound_0.html
  37. +3 −3 docs/core_messages_0.html
  38. +1 −1 docs/coroutining_0.html
  39. +1 −1 docs/counter_0.html
  40. +1 −1 docs/counters_0.html
  41. +1 −1 docs/coupling_metric_0.html
  42. +1 −1 docs/coverage_report_0.html
  43. +1 −1 docs/databasep_0.html
  44. +1 −1 docs/date_0.html
  45. +1 −1 docs/datep_0.html
  46. +1 −1 docs/dead_code_scanner_0.html
  47. +1 −1 docs/dead_code_scanner_messages_0.html
  48. +1 −1 docs/debug_expansion_1.html
  49. +1 −1 docs/debug_messages_0.html
  50. +1 −1 docs/debugger_0.html
  51. +1 −1 docs/debugger_messages_0.html
  52. +1 −1 docs/debuggerp_0.html
  53. +1 −1 docs/demodb_0.html
  54. +1 −1 docs/dfs_interpreter_0.html
  55. +1 −1 docs/diagram_1.html
  56. +1 −1 docs/diagrams_0.html
  57. +1 −1 docs/diagrams_1.html
  58. +1 −1 docs/dictionaryp_0.html
  59. +1 −1 docs/difflist_0.html
  60. +1 −1 docs/directory_index.html
  61. +1 −1 docs/dit_metric_0.html
  62. +1 −1 docs/doc_metric_0.html
  63. +1 −1 docs/doclet_0.html
  64. +1 −1 docs/dot_graph_language_0.html
  65. +1 −1 docs/edcg_0.html
  66. +1 −1 docs/either_0.html
  67. +1 −1 docs/entity_diagram_0.html
  68. +1 −1 docs/entity_diagram_1.html
  69. +1 −1 docs/entity_index.html
  70. +1 −1 docs/event_registry_0.html
  71. +1 −1 docs/event_registryp_0.html
  72. +1 −1 docs/expand_library_alias_paths_0.html
  73. +1 −1 docs/expanding_0.html
  74. +1 −1 docs/expected_0.html
  75. +1 −1 docs/expected_1.html
  76. +1 −1 docs/fast_random_0.html
  77. +1 −1 docs/file_dependency_diagram_0.html
  78. +1 −1 docs/file_dependency_diagram_1.html
  79. +1 −1 docs/file_diagram_1.html
  80. +1 −1 docs/file_load_diagram_0.html
  81. +1 −1 docs/file_load_diagram_1.html
  82. +1 −1 docs/flags_0.html
  83. +1 −1 docs/flags_validator_0.html
  84. +1 −1 docs/flatting_0.html
  85. +1 −1 docs/float_0.html
  86. +1 −1 docs/forwarding_0.html
  87. +1 −1 docs/genindex.html
  88. +1 −1 docs/gensym_0.html
  89. +1 −1 docs/graph_language_protocol_0.html
  90. +1 −1 docs/graph_language_registry_0.html
  91. +1 −1 docs/halstead_metric_0.html
  92. +1 −1 docs/halstead_metric_1.html
  93. +1 −1 docs/heap_1.html
  94. +1 −1 docs/heapp_0.html
  95. +1 −1 docs/help_0.html
  96. +1 −1 docs/heuristic_expansion_1.html
  97. +1 −1 docs/hierarchyp_0.html
  98. +1 −1 docs/hook_pipeline_1.html
  99. +1 −1 docs/hook_set_1.html
  100. +1 −1 docs/iddfs_interpreter_1.html
  101. +2 −2 docs/index.html
  102. +1 −1 docs/inheritance_diagram_0.html
  103. +1 −1 docs/inheritance_diagram_1.html
  104. +1 −1 docs/integer_0.html
  105. +1 −1 docs/interpreterp_0.html
  106. +1 −1 docs/interval_0.html
  107. +1 −1 docs/intervalp_0.html
  108. +1 −1 docs/iso8601_0.html
  109. +1 −1 docs/java_0.html
  110. +1 −1 docs/java_1.html
  111. +1 −1 docs/java_2.html
  112. +1 −1 docs/java_access_protocol_0.html
  113. +1 −1 docs/java_hook_0.html
  114. +1 −1 docs/java_utils_protocol_0.html
  115. +1 −1 docs/lgtdoc_0.html
  116. +1 −1 docs/lgtdocp_0.html
  117. +1 −1 docs/lgtunit_0.html
  118. +1 −1 docs/lgtunit_messages_0.html
  119. +1 −1 docs/library_dependency_diagram_0.html
  120. +1 −1 docs/library_dependency_diagram_1.html
  121. +1 −1 docs/library_diagram_1.html
  122. +1 −1 docs/library_index.html
  123. +1 −1 docs/library_load_diagram_0.html
  124. +1 −1 docs/library_load_diagram_1.html
  125. +1 −1 docs/list_0.html
  126. +1 −1 docs/list_1.html
  127. +1 −1 docs/listp_0.html
  128. +1 −1 docs/logger_0.html
  129. +1 −1 docs/logging_0.html
  130. +1 −1 docs/loggingp_0.html
  131. +1 −1 docs/logtalk_0.html
  132. +1 −1 docs/loop_0.html
  133. +1 −1 docs/loopp_0.html
  134. +1 −1 docs/magic_0.html
  135. +1 −1 docs/magic_expansion_1.html
  136. +1 −1 docs/maxheap_0.html
  137. +1 −1 docs/maybe_0.html
  138. +1 −1 docs/meta_0.html
  139. +1 −1 docs/meta_compiler_0.html
  140. +1 −1 docs/metagol_0.html
  141. +1 −1 docs/metap_0.html
  142. +1 −1 docs/minheap_0.html
  143. +1 −1 docs/modules_diagram_support_0.html
  144. +1 −1 docs/monitor_0.html
  145. +1 −1 docs/monitoring_0.html
  146. +1 −1 docs/monitorp_0.html
  147. +1 −1 docs/natural_0.html
  148. +1 −1 docs/noc_metric_0.html
  149. +1 −1 docs/nor_metric_0.html
  150. +1 −1 docs/number_0.html
  151. +1 −1 docs/numberlist_0.html
  152. +1 −1 docs/numberlistp_0.html
  153. +1 −1 docs/observer_0.html
  154. +1 −1 docs/optional_0.html
  155. +1 −1 docs/optional_1.html
  156. +1 −1 docs/os_0.html
  157. +1 −1 docs/os_types_0.html
  158. +1 −1 docs/osp_0.html
  159. +1 −1 docs/pairs_0.html
  160. +1 −1 docs/pddl_0.html
  161. +1 −1 docs/population_0.html
  162. +1 −1 docs/ports_profiler_0.html
  163. +1 −1 docs/predicate_index.html
  164. +1 −1 docs/proto_hierarchy_0.html
  165. +1 −1 docs/proto_hierarchyp_0.html
  166. +1 −1 docs/queue_0.html
  167. +1 −1 docs/queuep_0.html
  168. +1 −1 docs/random_0.html
  169. +1 −1 docs/randomp_0.html
  170. +1 −1 docs/rbtree_0.html
  171. +1 −1 docs/read_file_0.html
  172. +1 −1 docs/redis_0.html
  173. +1 −1 docs/rule_expansion_1.html
  174. +1 −1 docs/sample_0.html
  175. +1 −1 docs/search.html
  176. +1 −1 docs/set_0.html
  177. +1 −1 docs/set_1.html
  178. +1 −1 docs/setp_0.html
  179. +1 −1 docs/shell_1.html
  180. +1 −1 docs/shell_expansion_1.html
  181. +1 −1 docs/size_metric_0.html
  182. +1 −1 docs/sources/_conf.py
  183. +1 −1 docs/statistics_0.html
  184. +1 −1 docs/statisticsp_0.html
  185. +1 −1 docs/streamvars_0.html
  186. +1 −1 docs/subject_0.html
  187. +1 −1 docs/tap_output_0.html
  188. +1 −1 docs/tap_report_0.html
  189. +1 −1 docs/term_0.html
  190. +1 −1 docs/termp_0.html
  191. +1 −1 docs/time_0.html
  192. +1 −1 docs/timep_0.html
  193. +1 −1 docs/type_0.html
  194. +1 −1 docs/upn_metric_0.html
  195. +1 −1 docs/user_0.html
  196. +1 −1 docs/uses_diagram_0.html
  197. +1 −1 docs/uses_diagram_1.html
  198. +1 −1 docs/varlist_0.html
  199. +1 −1 docs/varlistp_0.html
  200. +1 −1 docs/wrapper_0.html
  201. +1 −1 docs/xml_0.html
  202. +1 −1 docs/xref_diagram_0.html
  203. +1 −1 docs/xref_diagram_1.html
  204. +1 −1 docs/xunit_output_0.html
  205. +1 −1 docs/xunit_report_0.html
  206. +1 −1 docs/zipperp_0.html
  207. +1 −1 docs/zlist_0.html
  208. +1 −1 manuals/sources/conf.py
@@ -27,6 +27,9 @@ RELEASE NOTES
Logtalk compiler and runtime
----------------------------

* IMPROVED: Allow the compiler linter to suggest more than one alternative for
a suspicious call.

* FIXED: The compiler now throws a permission error when attempting to create
an entity that is both built-in and dynamic.

@@ -1 +1 @@
3.24.0-b01
3.24.0-b02
@@ -3384,7 +3384,7 @@
% versions, 'rcN' for release candidates (with N being a natural number),
% and 'stable' for stable versions

'$lgt_version_data'(logtalk(3, 24, 0, b01)).
'$lgt_version_data'(logtalk(3, 24, 0, b02)).



@@ -11156,7 +11156,7 @@
% % call to a standard Prolog predicate that is not being locally redefined
% '$lgt_increment_compiling_warnings_counter',
% '$lgt_source_file_context'(File, Lines, Type, Entity),
% '$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, {Pred}, Pred)),
% '$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, {Pred}, [Pred])),
% fail.

'$lgt_compile_body'({Pred}, TPred, '$lgt_debug'(goal({Pred}, TPred), ExCtx), Ctx) :-
%
% this predicate fails if the closure can only be extended at runtime

'$lgt_extend_closure'(Closure, _, _) :-
var(Closure),
!,
fail.

'$lgt_extend_closure'(Obj::Closure, ExtArgs, Goal) :-
Obj == user,
!,
Self == Obj,
'$lgt_increment_compiling_warnings_counter',
'$lgt_source_file_context'(File, Lines, Type, Entity),
'$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, Obj::Pred, ::Pred)),
'$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, Obj::Pred, [::Pred])),
fail.

% suspicious use of ::/2 in objects to call a local predicate
This == Obj,
'$lgt_increment_compiling_warnings_counter',
'$lgt_source_file_context'(File, Lines, Type, Entity),
'$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, Obj::Pred, Pred)),
'$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, Obj::Pred, [Pred])),
fail.

% translation performed at runtime
functor(Head, Functor, Arity),
'$lgt_increment_compiling_warnings_counter',
'$lgt_source_file_context'(File, Lines, Type, Entity),
'$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, ::Pred, Pred)),
'$lgt_print_message'(warning(suspicious_calls), core, suspicious_call(File, Lines, Type, Entity, ::Pred, [Pred, ^^Pred])),
fail.

% broadcasting control constructs
@@ -21,9 +21,9 @@
:- category(core_messages).

:- info([
version is 1.44,
version is 1.45,
author is 'Paulo Moura',
date is 2019/01/01,
date is 2019/02/09,
comment is 'Logtalk core (compiler and runtime) default message translations.'
]).

@@ -393,8 +393,9 @@
['Duplicated directive: ~q'-[Directive], nl],
message_context(File, Lines, Type, Entity).

message_tokens(suspicious_call(File, Lines, Type, Entity, Call, AlternativeCall)) -->
['Suspicious call: ~q instead of ~q'-[Call, AlternativeCall], nl],
message_tokens(suspicious_call(File, Lines, Type, Entity, Call, [AlternativeCall| AlternativeCalls])) -->
['Suspicious call: ~q instead of '-[Call]],
alternative_calls(AlternativeCalls, AlternativeCall),
message_context(File, Lines, Type, Entity).

message_tokens(non_standard_predicate_call(File, Lines, Type, Entity, Predicate)) -->
@@ -647,6 +648,13 @@
; [' in file ~w between lines ~w'-[File, Lines], nl]
).

alternative_calls([], AlternativeCall) -->
['~q'-[AlternativeCall], nl].

alternative_calls([NextAlternativeCall| AlternativeCalls], AlternativeCall) -->
['~q or '-[AlternativeCall]],
alternative_calls(AlternativeCalls, NextAlternativeCall).

missing_entities([]) -->
[].
missing_entities([Entity-reference(Kind,From,File,Line)| Entities]) -->
@@ -9,8 +9,8 @@
Logtalk core (compiler and runtime) default message translations.

| **Author:** Paulo Moura
| **Version:** 1.44
| **Date:** 2019/1/1
| **Version:** 1.45
| **Date:** 2019/2/9

| **Compilation flags:**
| ``static``
@@ -17,4 +17,4 @@ Indices and tables
* :ref:`genindex`
* :ref:`search`

Generated on Sat Feb 2 22:24:58 WET 2019
Generated on Sat Feb 9 20:02:45 WET 2019
@@ -1,6 +1,6 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: 'v3.24.0-b01',
VERSION: 'v3.24.0-b02',
LANGUAGE: 'None',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>a_star_interpreter(W) &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>a_star_interpreter(W) &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>after_event_registry &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>after_event_registry &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>arbitrary &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>arbitrary &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>assertions &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>assertions &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>assertions(Mode) &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>assertions(Mode) &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>assertions_messages &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>assertions_messages &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>assignvars &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>assignvars &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>assignvarsp &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>assignvarsp &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>atom &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>atom &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>atomic &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>atomic &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>backend_random &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>backend_random &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>before_event_registry &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>before_event_registry &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>benchmark_generators &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>benchmark_generators &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>best_first &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>best_first &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>bfs_interpreter &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>bfs_interpreter &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>bintree &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>bintree &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>bup_interpreter &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>bup_interpreter &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>callable &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>callable &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>cc_metric &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>cc_metric &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>character &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>character &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>characterp &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>characterp &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>class_hierarchy &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>class_hierarchy &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>class_hierarchyp &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>class_hierarchyp &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>code_metric &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>code_metric &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>code_metrics &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>code_metrics &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>code_metrics_messages &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>code_metrics_messages &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>code_metrics_utilities &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>code_metrics_utilities &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>comparingp &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>comparingp &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



@@ -8,7 +8,7 @@

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>compound &mdash; Logtalk APIs v3.24.0-b01 documentation</title>
<title>compound &mdash; Logtalk APIs v3.24.0-b02 documentation</title>



Oops, something went wrong.

0 comments on commit 5e65f77

Please sign in to comment.