Paul J. Lucas has proposed merging lp:~zorba-coders/zorba/bug-1189798 into lp:zorba.
Commit message: Relocated and renamed Zorba errors & warnings "modules." Requested reviews: Paul J. Lucas (paul-lucas) Related bugs: Bug #1189798 in Zorba: "Update core module "errors"" https://bugs.launchpad.net/zorba/+bug/1189798 For more details, see: https://code.launchpad.net/~zorba-coders/zorba/bug-1189798/+merge/171183 Relocated and renamed Zorba errors & warnings "modules." -- https://code.launchpad.net/~zorba-coders/zorba/bug-1189798/+merge/171183 Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'modules/CMakeLists.txt' --- modules/CMakeLists.txt 2013-02-07 17:24:36 +0000 +++ modules/CMakeLists.txt 2013-06-24 23:18:30 +0000 @@ -178,4 +178,14 @@ "${CMAKE_BINARY_DIR}/zorba_modules/${module_project}") ENDFOREACH (module_project) +# error and warning modules +DECLARE_ZORBA_MODULE( FILE pregenerated/zorba-errors.xq + URI "http://zorba.io/modules/zorba-errors" ) +DECLARE_ZORBA_MODULE( FILE pregenerated/zorba-warnings.xq + URI "http://zorba.io/modules/zorba-warnings" ) +DECLARE_ZORBA_MODULE( FILE pregenerated/jsoniq-errors.xq + URI "http://jsoniq.org/errors" ) + MESSAGE(STATUS "End modules") + +# vim:set et sw=2 ts=2: === modified file 'modules/com/zorba-xquery/www/modules/CMakeLists.txt' --- modules/com/zorba-xquery/www/modules/CMakeLists.txt 2013-06-15 16:20:18 +0000 +++ modules/com/zorba-xquery/www/modules/CMakeLists.txt 2013-06-24 23:18:30 +0000 @@ -140,12 +140,3 @@ DECLARE_ZORBA_MODULE (FILE debugger/dbgp-message-handler.xq VERSION 1.0 URI "http://www.zorba-xquery.com/modules/debugger/dbgp-message-handler") ENDIF (ZORBA_WITH_DEBUGGER) - - -# error and warning modules -DECLARE_ZORBA_MODULE (FILE pregenerated/errors.xq - URI "http://www.zorba-xquery.com/errors" -) -DECLARE_ZORBA_MODULE (FILE pregenerated/warnings.xq - URI "http://www.zorba-xquery.com/warnings" -) === modified file 'modules/org/jsoniq/www/CMakeLists.txt' --- modules/org/jsoniq/www/CMakeLists.txt 2013-06-15 02:57:08 +0000 +++ modules/org/jsoniq/www/CMakeLists.txt 2013-06-24 23:18:30 +0000 @@ -16,5 +16,3 @@ URI "http://jsoniq.org/functions") DECLARE_ZORBA_MODULE(FILE function-library.xq VERSION 1.0 URI "http://jsoniq.org/function-library") -DECLARE_ZORBA_MODULE (FILE pregenerated/errors.xq - URI "http://jsoniq.org/errors") === removed directory 'modules/org/jsoniq/www/pregenerated' === renamed directory 'modules/com/zorba-xquery/www/modules/pregenerated' => 'modules/pregenerated' === renamed file 'modules/org/jsoniq/www/pregenerated/errors.xq' => 'modules/pregenerated/jsoniq-errors.xq' === renamed file 'modules/com/zorba-xquery/www/modules/pregenerated/errors.xq' => 'modules/pregenerated/zorba-errors.xq' --- modules/com/zorba-xquery/www/modules/pregenerated/errors.xq 2013-06-15 20:57:44 +0000 +++ modules/pregenerated/zorba-errors.xq 2013-06-24 23:18:30 +0000 @@ -18,9 +18,10 @@ : THIS FILE IS GENERATED. : PLEASE DO NOT EDIT. :) + (:~ : This module contains one declaration of a variable for each - : error of the http://www.zorba-xquery.com/errors namespace. + : error of the http://zorba.io/zorba-errors namespace. : The variables serves as documentation for the errors but can also : be used in the code. For example, one useful scenario is to compare : an error caught in the catch clause of a try-catch expression with one of @@ -33,9 +34,9 @@ xquery version '1.0'; -module namespace zerr = 'http://www.zorba-xquery.com/errors'; +module namespace zerr = 'http://zorba.io/zorba-errors'; -declare variable $zerr:NS := 'http://www.zorba-xquery.com/errors'; +declare variable $zerr:NS := 'http://zorba.io/zorba-errors'; (:~ : @@ -992,4 +993,4 @@ (:~ :If an absolute URI is specified with a path that does not start with slash ("/"). :) -declare variable $zerr:ZURI0003 as xs:QName := fn:QName($zerr:NS, "zerr:ZURI0003"); \ No newline at end of file +declare variable $zerr:ZURI0003 as xs:QName := fn:QName($zerr:NS, "zerr:ZURI0003"); === renamed file 'modules/com/zorba-xquery/www/modules/pregenerated/warnings.xq' => 'modules/pregenerated/zorba-warnings.xq' --- modules/com/zorba-xquery/www/modules/pregenerated/warnings.xq 2013-06-15 20:57:44 +0000 +++ modules/pregenerated/zorba-warnings.xq 2013-06-24 23:18:30 +0000 @@ -18,9 +18,10 @@ : THIS FILE IS GENERATED. : PLEASE DO NOT EDIT. :) + (:~ : This module contains one declaration of a variable for each - : error of the http://www.zorba-xquery.com/warnings namespace. + : error of the http://zorba.io/zorba-warnings namespace. : The variables serves as documentation for the errors but can also : be used in the code. For example, one useful scenario is to compare : an error caught in the catch clause of a try-catch expression with one of @@ -33,9 +34,9 @@ xquery version '1.0'; -module namespace zwarn = 'http://www.zorba-xquery.com/warnings'; +module namespace zwarn = 'http://zorba.io/zorba-warnings'; -declare variable $zwarn:NS := 'http://www.zorba-xquery.com/warnings'; +declare variable $zwarn:NS := 'http://zorba.io/zorba-warnings'; (:~ : @@ -88,4 +89,4 @@ : for language features that are not supported by both XQuery and JSONiq grammars. : :) -declare variable $zwarn:ZWST0009 as xs:QName := fn:QName($zwarn:NS, "zwarn:ZWST0009"); \ No newline at end of file +declare variable $zwarn:ZWST0009 as xs:QName := fn:QName($zwarn:NS, "zwarn:ZWST0009"); === modified file 'src/diagnostics/CMakeLists.txt' --- src/diagnostics/CMakeLists.txt 2013-06-15 02:57:08 +0000 +++ src/diagnostics/CMakeLists.txt 2013-06-24 23:18:30 +0000 @@ -29,83 +29,82 @@ ) ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_h.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/include/zorba/diagnostic_list.h" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_cpp.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" - "diagnostic_en.xml" - "${CMAKE_BINARY_DIR}/include/zorba/diagnostic_list.h" - "${CMAKE_BINARY_DIR}/src/diagnostics/diagnostic_list.cpp" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/dict_XX_cpp.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/src/diagnostics/dict_en.cpp" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=err" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/modules/w3c/xqt-errors.xq" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/dict_zed_keys_h.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/src/diagnostics/dict_zed_keys.h" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=jerr" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/modules/org/jsoniq/www/errors.xq" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=zerr" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/modules/com/zorba-xquery/www/modules/errors.xq" -) - -ZORBA_DIAGNOSTIC_GENERATOR( - "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" - "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=zwarn" - "diagnostic_en.xml" - "" - "${CMAKE_BINARY_DIR}/modules/com/zorba-xquery/www/modules/warnings.xq") - -SET(DIAG_MODULES - ${CMAKE_BINARY_DIR}/modules/com/zorba-xquery/www/modules/warnings.xq - ${CMAKE_BINARY_DIR}/modules/com/zorba-xquery/www/modules/errors.xq + "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_h.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/include/zorba/diagnostic_list.h" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_cpp.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" + "diagnostic_en.xml" + "${CMAKE_BINARY_DIR}/include/zorba/diagnostic_list.h" + "${CMAKE_BINARY_DIR}/src/diagnostics/diagnostic_list.cpp" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/dict_XX_cpp.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/src/diagnostics/dict_en.cpp" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=err" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/modules/w3c/xqt-errors.xq" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/dict_zed_keys_h.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/src/diagnostics/dict_zed_keys.h" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=jerr" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/modules/jsoniq-errors.xq" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=zerr" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/modules/zorba-errors.xq" +) + +ZORBA_DIAGNOSTIC_GENERATOR( + "${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_list_xq.xq" + "input=${CMAKE_SOURCE_DIR}/src/diagnostics/diagnostic_en.xml;ns:=zwarn" + "diagnostic_en.xml" + "" + "${CMAKE_BINARY_DIR}/modules/zorba-warnings.xq" +) + +SET( DIAG_MODULES + ${CMAKE_BINARY_DIR}/modules/zorba-errors.xq + ${CMAKE_BINARY_DIR}/modules/zorba-warnings.xq ${CMAKE_BINARY_DIR}/modules/w3c/xqt-errors.xq - ${CMAKE_BINARY_DIR}/modules/org/jsoniq/www/errors.xq -) - -ADD_CUSTOM_TARGET (gen_diag_modules - DEPENDS ${DIAG_MODULES} -) - -SET_TARGET_PROPERTIES (gen_diag_modules PROPERTIES - FOLDER "Modules" -) + ${CMAKE_BINARY_DIR}/modules/jsoniq-errors.xq +) + +ADD_CUSTOM_TARGET( gen_diag_modules DEPENDS ${DIAG_MODULES} ) + +SET_TARGET_PROPERTIES( gen_diag_modules PROPERTIES FOLDER "Modules" ) IF (WIN32) - SET(DIAGNOSTICS_SRCS ${DIAGNOSTICS_SRCS} StackWalker.cpp) + SET( DIAGNOSTICS_SRCS ${DIAGNOSTICS_SRCS} StackWalker.cpp ) ENDIF (WIN32) + +# vim:set et sw=2 ts=2: === modified file 'src/diagnostics/diagnostic_en.xml' --- src/diagnostics/diagnostic_en.xml 2013-06-21 12:54:29 +0000 +++ src/diagnostics/diagnostic_en.xml 2013-06-24 23:18:30 +0000 @@ -3496,8 +3496,8 @@ <comment> This warning is reported if the declaration of a function, variable, collection, or index contains an annotation that is not in the - http://www.zorba-xquery.com/annotations namespace and Zorba doesn't know - how to handle. + http://zorba.io/annotations namespace and Zorba doesn't know how to + handle. </comment> <value>"$1": unknown or unsupported annotation</value> </diagnostic> === modified file 'src/diagnostics/diagnostic_list_xq.xq' --- src/diagnostics/diagnostic_list_xq.xq 2013-06-15 22:34:31 +0000 +++ src/diagnostics/diagnostic_list_xq.xq 2013-06-24 23:18:30 +0000 @@ -18,95 +18,100 @@ : @author Carlos Lopez :) -import module namespace util="http://www.zorba-xquery.com/diagnostic/util" +import module namespace util = "http://zorba.io/diagnostic/util" at "diagnostic_util.xq"; -declare function local:err-doc ($err as element(diagnostic), - $namespace as xs:string) as xs:string +declare function local:err-doc( $err as element(diagnostic), + $namespace as xs:string ) + as xs:string { - let $commentline := concat($util:newline, " : ") - let $commentsec := if(exists($err/comment)) - then concat ($util:newline, " :", - replace(string($err/comment), '\n[ ]*', $commentline)) - else "" + let $comment_line := concat($util:newline, " : ") + let $comment_sec := + if ( exists( $err/comment ) ) + then + concat( + $util:newline, " :", + replace( string( $err/comment ), '\n[ ]*', $comment_line ) + ) + else "" (:TODO: The see section could be a lot better and specific:) - let $seesec := if($namespace = "err") - then concat($commentline, - "@see http://www.w3.org/2005/xqt-errors") - else "" - return if (exists($err/value)) - then concat ("(:~", - $commentsec, $seesec, - $util:newline, ":)") - else "" -}; - -declare function local:err-var ($err as element(diagnostic), - $namespace as xs:string) as xs:string -{ - let $NSStringVar as xs:string := concat("$", $namespace, ":", "NS") - let $code := data($err/@code) - let $qnameArgs := concat('(', $NSStringVar, - ', "', $namespace, ':', $code, '"', - ');') - return concat("declare variable $", $namespace, ":", $code, - " as xs:QName := fn:QName", $qnameArgs) -}; - -declare function local:writeErr($err as element(diagnostic), - $namespace as xs:string) as xs:string -{ - string-join(( - local:err-doc($err, $namespace), local:err-var($err, $namespace) - ), $util:newline) -}; - -declare function local:body($namespace as element(namespace)) as xs:string -{ - string-join(( - let $stringNS := $namespace/@prefix - for $err in - $namespace/diagnostic - return local:writeErr($err, $stringNS) - ), concat($util:newline, $util:newline)) -}; - -declare function local:getNSURI($namespace as xs:string) as xs:string -{ - if ($namespace = "err") + let $see_sec := + if ( $namespace = "err" ) + then concat( $comment_line, "@see http://www.w3.org/2005/xqt-errors" ) + else "" + return + if ( exists( $err/value ) ) + then concat( "(:~", $comment_sec, $see_sec, $util:newline, ":)" ) + else "" +}; + +declare function local:err-var( $err as element(diagnostic), + $namespace as xs:string ) + as xs:string +{ + let $ns_var as xs:string := concat( "$", $namespace, ":", "NS" ) + let $code := data( $err/@code ) + let $qnameArgs := concat( '(', $ns_var, ', "', $namespace, ':', $code, '");' ) + return + concat( + "declare variable $", $namespace, ":", $code, " as xs:QName := fn:QName", + $qnameArgs + ) +}; + +declare function local:writeErr( $err as element(diagnostic), + $namespace as xs:string ) + as xs:string +{ + string-join( + ( + local:err-doc( $err, $namespace ), local:err-var( $err, $namespace ) + ), + $util:newline + ) +}; + +declare function local:body( $namespace as element(namespace) ) + as xs:string +{ + string-join( + ( + let $stringNS := $namespace/@prefix + for $err in $namespace/diagnostic + return local:writeErr( $err, $stringNS ) + ), + concat( $util:newline, $util:newline ) + ) +}; + +declare function local:getNSURI( $namespace as xs:string ) + as xs:string +{ + if ( $namespace = "err" ) then "http://www.w3.org/2005/xqt-errors" - else if ($namespace = "jerr") + else if ( $namespace = "jerr" ) then "http://jsoniq.org/errors" - else if ($namespace = "zerr") - then "http://www.zorba-xquery.com/errors" - else if ($namespace = "zwarn") - then "http://www.zorba-xquery.com/warnings" - else fn:error() -}; - -declare function local:getProject($namespace as xs:string) as xs:string -{ - if ($namespace = "err") - then "W3C/XPath Errors Codes" - else if ($namespace = "jerr") - then "JSONiq/Errors" - else if ($namespace = "zerr") - then "Zorba/Zorba Error Codes" - else if ($namespace = "zwarn") - then "Zorba/Zorba Warning Codes" - else fn:error() - -}; - -declare function local:header ($namespace as xs:string) as xs:string -{ - concat( fn:replace(fn:replace(fn:replace(util:copyright(), - "/\*\*?", "(:"), - "\*/", ":)"), - "\*", ":"), + else if ( $namespace = "zerr" ) + then "http://zorba.io/modules/zorba-errors" + else if ( $namespace = "zwarn" ) + then "http://zorba.io/modules/zorba-warnings" + else + fn:error() +}; + +declare function local:header( $namespace as xs:string ) + as xs:string +{ + let $uri := local:getNSURI($namespace) + return concat( + fn:replace( fn:replace( fn:replace( util:copyright(), + "/\*\*?", "(:" ), + "\*/", ":)" ), + "\*", ":" ), + $util:newline, "(:~", $util:newline, - " : This module contains one declaration of a variable for each", $util:newline, - " : error of the ", local:getNSURI($namespace), " namespace.", $util:newline, + " : This module contains one variable declaration for each diagnostic of the", $util:newline, + " : $uri, " namespace.", $util:newline, " : The variables serves as documentation for the errors but can also", $util:newline, " : be used in the code. For example, one useful scenario is to compare", $util:newline, " : an error caught in the catch clause of a try-catch expression with one of", $util:newline, @@ -114,33 +119,27 @@ " :", $util:newline, " : @author Carlos Lopez", $util:newline, " :", $util:newline, - " : @project ", local:getProject($namespace), $util:newline, " :)", $util:newline, $util:newline, "xquery version '1.0';", $util:newline, $util:newline, - "module namespace ", $namespace, " = '", local:getNSURI($namespace), "';", + "module namespace ", $namespace, " = '", $uri, "';", $util:newline, $util:newline, - "declare variable $", $namespace, ":NS := '", local:getNSURI($namespace), "';" + "declare variable $", $namespace, ":NS := '", $uri, "';" ) }; -declare function local:writeModule($namespace as element(namespace)) - as xs:string +declare function local:writeModule( $namespace as element(namespace) ) + as xs:string { let $stringNS := $namespace/@prefix - return string-join(( - local:header($stringNS), - "", - local:body($namespace) - ), $util:newline) -}; - -declare function local:getFilePath($namespace as xs:string) as xs:string{ - if($namespace = "err") - then "w3/" - else if ($namespace = "jerr" or $namespace = "zerr" or $namespace = "zwarn") - then "com/zorba-xquery/www/modules/" - else "" + return string-join( + ( + local:header($stringNS), + "", + local:body($namespace) + ), + $util:newline + ) }; declare variable $input external; @@ -148,6 +147,6 @@ let $namespace := $input/diagnostic-list/namespace[@prefix=$ns] let $namestring := $namespace/@prefix -let $filepath := concat("../../modules/", local:getFilePath($namestring), - $namestring, ".xq") -return local:writeModule($namespace) +return local:writeModule( $namespace ) + +(: vim:set et sw=2 ts=2: :) === modified file 'src/diagnostics/diagnostic_util.xq' --- src/diagnostics/diagnostic_util.xq 2013-02-07 17:24:36 +0000 +++ src/diagnostics/diagnostic_util.xq 2013-06-24 23:18:30 +0000 @@ -1,5 +1,5 @@ (: - : Copyright 2006-2009 The FLWOR Foundation. + : Copyright 2006-2013 The FLWOR Foundation. : : Licensed under the Apache License, Version 2.0 (the "License"); : you may not use this file except in compliance with the License. @@ -14,16 +14,16 @@ : limitations under the License. :) -module namespace util = "http://www.zorba-xquery.com/diagnostic/util"; - +module namespace util = "http://zorba.io/diagnostic/util"; declare variable $util:newline as xs:string := " "; -declare function util:copyright() as xs:string +declare function util:copyright() + as xs:string { '/** - * Copyright 2006-2011 The FLWOR Foundation. + * Copyright 2006-2013 The FLWOR Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,18 +42,20 @@ * THIS FILE IS GENERATED. * PLEASE DO NOT EDIT. */ - ' +' }; -declare function util:begin_guard( $diagnostic ) as xs:string +declare function util:begin_guard( $diagnostic ) + as xs:string { if ( $diagnostic/@if and not( $diagnostic/preceding-sibling::diagnostic[1]/@if ) ) - then concat( "#if ", data($diagnostic/@if), $util:newline ) + then concat( "#if ", data( $diagnostic/@if ), $util:newline ) else "" }; -declare function util:end_guard( $diagnostic ) as xs:string +declare function util:end_guard( $diagnostic ) + as xs:string { if ( $diagnostic/@if and not( $diagnostic/following-sibling::diagnostic[1]/@if ) )
-- Mailing list: https://launchpad.net/~zorba-coders Post to : zorba-coders@lists.launchpad.net Unsubscribe : https://launchpad.net/~zorba-coders More help : https://help.launchpad.net/ListHelp