@@ -133,7 +133,9 @@ const EXCLUDEFROMAUTOCOMPLETE = "excludefromautocomplete";
133133const HELPURL_PARAM = "helpurl" ;
134134const LINKEDENTITYLOADSERVICE = "linkedentityloadservice" ;
135135const REQUIRESADDRESS = "requiresaddress" ;
136+ const REQUIRESSTREAMADDRESS = "requiresstreamaddress" ;
136137const REQUIRESPARAMETERADDRESSES = "requiresparameteraddresses" ;
138+ const REQUIRESSTREAMPARAMETERADDRESSES = "requiresstreamparameteraddresses" ;
137139const STREAMING = "streaming" ;
138140const VOLATILE = "volatile" ;
139141const SUPPORT_SYNC = "supportsync" ;
@@ -688,27 +690,46 @@ function getOptions(
688690 isInvocationFunction : boolean ,
689691 extra : IFunctionExtras
690692) : IFunctionOptions {
693+ const addressRequired = isAddressRequired ( func ) ;
694+ const streamAddressRequired = isStreamAddressRequired ( func ) ;
695+ const parameterAddressesRequired = isRequiresParameterAddresses ( func ) ;
696+ const streamParameterAddressesRequired = isRequiresStreamParameterAddresses ( func ) ;
697+ const hasStreamingTag = hasTag ( func , STREAMING ) ;
698+ const streamEnabled = isStreaming ( func , isStreamingFunction ) ;
699+
691700 const optionsItem : IFunctionOptions = {
692701 cancelable : isCancelableTag ( func , isCancelableFunction ) ,
693- requiresAddress : isAddressRequired ( func ) && ! isStreaming ( func , isStreamingFunction ) ,
694- requiresStreamAddress : isAddressRequired ( func ) && isStreaming ( func , isStreamingFunction ) ,
695- stream : isStreaming ( func , isStreamingFunction ) ,
702+ requiresAddress : addressRequired && ! streamEnabled ,
703+ requiresStreamAddress : streamAddressRequired || ( addressRequired && streamEnabled ) ,
704+ stream : streamEnabled ,
696705 volatile : isVolatile ( func ) ,
697- requiresParameterAddresses :
698- isRequiresParameterAddresses ( func ) && ! isStreaming ( func , isStreamingFunction ) ,
706+ requiresParameterAddresses : parameterAddressesRequired && ! streamEnabled ,
699707 requiresStreamParameterAddresses :
700- isRequiresParameterAddresses ( func ) && isStreaming ( func , isStreamingFunction ) ,
708+ streamParameterAddressesRequired || ( parameterAddressesRequired && streamEnabled ) ,
701709 excludeFromAutoComplete : isExcludedFromAutoComplete ( func ) ,
702710 linkedEntityLoadService : isLinkedEntityLoadService ( func ) ,
703711 capturesCallingObject : capturesCallingObject ( func ) ,
704712 supportSync : supportSync ( func ) ,
705713 action : isAction ( func ) ,
706714 } ;
707715
708- if ( isAddressRequired ( func ) || isRequiresParameterAddresses ( func ) ) {
709- let errorParam : string = isAddressRequired ( func )
710- ? "@requiresAddress"
711- : "@requiresParameterAddresses" ;
716+ if (
717+ addressRequired ||
718+ streamAddressRequired ||
719+ parameterAddressesRequired ||
720+ streamParameterAddressesRequired
721+ ) {
722+ let errorParam : string = "" ;
723+
724+ if ( streamAddressRequired ) {
725+ errorParam = "@requiresStreamAddress" ;
726+ } else if ( addressRequired ) {
727+ errorParam = "@requiresAddress" ;
728+ } else if ( streamParameterAddressesRequired ) {
729+ errorParam = "@requiresStreamParameterAddresses" ;
730+ } else {
731+ errorParam = "@requiresParameterAddresses" ;
732+ }
712733
713734 if ( ! isStreamingFunction && ! isCancelableFunction && ! isInvocationFunction ) {
714735 const functionPosition = getPosition ( func , func . parameters . end ) ;
@@ -717,13 +738,28 @@ function getOptions(
717738 }
718739 }
719740
741+ if ( streamAddressRequired && ! hasStreamingTag ) {
742+ const functionPosition = getPosition ( func , func . parameters . end ) ;
743+ const errorString = "@requiresStreamAddress can only be used with @streaming." ;
744+ extra . errors . push ( logError ( errorString , functionPosition ) ) ;
745+ }
746+
747+ if ( streamParameterAddressesRequired && ! hasStreamingTag ) {
748+ const functionPosition = getPosition ( func , func . parameters . end ) ;
749+ const errorString =
750+ "@requiresStreamParameterAddresses can only be used with @streaming." ;
751+ extra . errors . push ( logError ( errorString , functionPosition ) ) ;
752+ }
753+
720754 if (
721755 optionsItem . linkedEntityLoadService &&
722756 ( optionsItem . excludeFromAutoComplete ||
723757 optionsItem . volatile ||
724758 optionsItem . stream ||
725759 optionsItem . requiresAddress ||
760+ optionsItem . requiresStreamAddress ||
726761 optionsItem . requiresParameterAddresses ||
762+ optionsItem . requiresStreamParameterAddresses ||
727763 optionsItem . capturesCallingObject )
728764 ) {
729765 let errorParam : string = "" ;
@@ -737,8 +773,12 @@ function getOptions(
737773 errorParam = "@streaming" ;
738774 } else if ( optionsItem . requiresAddress ) {
739775 errorParam = "@requiresAddress" ;
776+ } else if ( optionsItem . requiresStreamAddress ) {
777+ errorParam = "@requiresStreamAddress" ;
740778 } else if ( optionsItem . requiresParameterAddresses ) {
741779 errorParam = "@requiresParameterAddresses" ;
780+ } else if ( optionsItem . requiresStreamParameterAddresses ) {
781+ errorParam = "@requiresStreamParameterAddresses" ;
742782 } else if ( optionsItem . capturesCallingObject ) {
743783 errorParam = "@capturesCallingObject" ;
744784 }
@@ -760,7 +800,9 @@ function getOptions(
760800 optionsItem . volatile ||
761801 optionsItem . stream ||
762802 optionsItem . requiresAddress ||
803+ optionsItem . requiresStreamAddress ||
763804 optionsItem . requiresParameterAddresses ||
805+ optionsItem . requiresStreamParameterAddresses ||
764806 optionsItem . capturesCallingObject ||
765807 optionsItem . linkedEntityLoadService ||
766808 optionsItem . supportSync )
@@ -776,8 +818,12 @@ function getOptions(
776818 errorParam = "@streaming" ;
777819 } else if ( optionsItem . requiresAddress ) {
778820 errorParam = "@requiresAddress" ;
821+ } else if ( optionsItem . requiresStreamAddress ) {
822+ errorParam = "@requiresStreamAddress" ;
779823 } else if ( optionsItem . requiresParameterAddresses ) {
780824 errorParam = "@requiresParameterAddresses" ;
825+ } else if ( optionsItem . requiresStreamParameterAddresses ) {
826+ errorParam = "@requiresStreamParameterAddresses" ;
781827 } else if ( optionsItem . capturesCallingObject ) {
782828 errorParam = "@capturesCallingObject" ;
783829 } else if ( optionsItem . linkedEntityLoadService ) {
@@ -1109,6 +1155,14 @@ function isAddressRequired(node: ts.Node): boolean {
11091155 return hasTag ( node , REQUIRESADDRESS ) ;
11101156}
11111157
1158+ /**
1159+ * Returns true if requiresStreamAddress tag found in comments
1160+ * @param node jsDocs node
1161+ */
1162+ function isStreamAddressRequired ( node : ts . Node ) : boolean {
1163+ return hasTag ( node , REQUIRESSTREAMADDRESS ) ;
1164+ }
1165+
11121166/**
11131167 * Returns true if RequiresParameterAddresses tag found in comments
11141168 * @param node jsDocs node
@@ -1117,6 +1171,14 @@ function isRequiresParameterAddresses(node: ts.Node): boolean {
11171171 return hasTag ( node , REQUIRESPARAMETERADDRESSES ) ;
11181172}
11191173
1174+ /**
1175+ * Returns true if requiresStreamParameterAddresses tag found in comments
1176+ * @param node jsDocs node
1177+ */
1178+ function isRequiresStreamParameterAddresses ( node : ts . Node ) : boolean {
1179+ return hasTag ( node , REQUIRESSTREAMPARAMETERADDRESSES ) ;
1180+ }
1181+
11201182/**
11211183 * Returns true if excludedFromAutoComplete tag found in comments
11221184 * @param node jsDocs node
0 commit comments