@@ -67,34 +67,82 @@ public int ChannelCount
6767 }
6868 }
6969
70- private bool MergeParameterTypes ( XmlNode iMergeTarget , XmlNode iMergeSource )
70+ private static bool MergeParameterTypes ( XmlNode iMergeTarget , XmlNode iMergeSource )
7171 {
7272 // check merge preconditions
7373 if ( iMergeTarget == null || iMergeSource == null ) return false ;
7474 XmlNode lSourceChild = iMergeSource . FirstChild ;
7575 XmlNode lTargetChild = iMergeTarget ;
76+ // we only merge restrictions
77+ if ( lSourceChild . Name != "TypeRestriction" ) return false ;
78+ // Size has to be identical
7679 if ( lSourceChild . Name != lTargetChild . Name || lSourceChild . NodeAttr ( "Base" ) != lTargetChild . NodeAttr ( "Base" ) || lSourceChild . NodeAttr ( "SizeInBit" ) != lTargetChild . NodeAttr ( "SizeInBit" ) )
7780 {
7881 // we have to check the parameter types, if they are compatible
7982 // if not, we cannot merge them
8083 Program . Message ( true , "Merging ParameterType {0}: Source and Target are not compatible!" , iMergeTarget . Name ) ;
8184 return false ;
8285 }
83-
86+
87+ bool lResult = false ;
88+ // simple check (speed): If the first child exists in target, merge was done before
89+ string lValue = lSourceChild . ChildNodes [ 0 ] . NodeAttr ( "Value" ) ;
90+ if ( lValue == "" ) return false ;
91+ foreach ( XmlNode lTargetNode in lTargetChild . ChildNodes )
92+ if ( lTargetNode . NodeAttr ( "Value" ) == lValue ) return false ;
93+
8494 // we merge the parameter types of the source into the target
8595 foreach ( XmlNode lChild in lSourceChild . ChildNodes )
8696 {
8797 XmlNode lImportNode = lTargetChild . OwnerDocument . ImportNode ( lChild . Clone ( ) , true ) ;
8898 lTargetChild . AppendChild ( lImportNode ) ;
99+ lResult = true ;
89100 }
90- return true ;
101+ return lResult ;
91102 }
92103
104+ private void MergeParameterTypes ( )
105+ {
106+ List < XmlNode > lMergedList = new ( ) ;
107+ Dictionary < string , XmlNode > lFoundParameterTypes = new ( ) ;
108+ // before we start with template processing, we calculate all Parameter relevant info
109+ XmlNode lParameterTypes = mDocument . SelectSingleNode ( "//ApplicationProgram/Static/ParameterTypes" ) ;
110+ if ( lParameterTypes != null )
111+ {
112+ foreach ( XmlNode lChild in lParameterTypes . ChildNodes )
113+ if ( lChild . NodeType == XmlNodeType . Element )
114+ {
115+ string lParameterTypeId = lChild . SubId ( "Id" , "_PT-" ) ;
116+ if ( lParameterTypeId == "" ) continue ;
117+ if ( lFoundParameterTypes . ContainsKey ( lParameterTypeId ) )
118+ {
119+ // we try to merge parameter types
120+ bool lMerged = MergeParameterTypes ( lFoundParameterTypes [ lParameterTypeId ] , lChild ) ;
121+ if ( lMerged ) lMergedList . Add ( lChild ) ;
122+ }
123+ else
124+ {
125+ // Speed: we don't add the full type node, just the type definition itself
126+ XmlNode lTypeChild = lChild . FirstChild ;
127+ while ( lTypeChild != null && lTypeChild . NodeType == XmlNodeType . Comment ) lTypeChild = lTypeChild . NextSibling ;
128+ lFoundParameterTypes . Add ( lParameterTypeId , lTypeChild ) ;
129+ }
130+ }
131+ // we remove all merged parameter types from the document
132+ // this is necessary, because the parameter types are not allowed to be duplicated
133+ // has to be done after the loop, otherwise we get an exception
134+ if ( lMergedList . Count > 0 )
135+ foreach ( XmlNode lChild in lMergedList )
136+ lChild . ParentNode . RemoveChild ( lChild ) ;
137+ }
138+ mParameterTypesFetched = true ;
139+ }
140+
141+
93142 private void FetchParameterTypes ( )
94143 {
95144 if ( ! mParameterTypesFetched )
96145 {
97- List < XmlNode > lMergedList = new ( ) ;
98146 // before we start with template processing, we calculate all Parameter relevant info
99147 XmlNode lParameterTypes = mDocument . SelectSingleNode ( "//ApplicationProgram/Static/ParameterTypes" ) ;
100148 if ( lParameterTypes != null )
@@ -104,32 +152,21 @@ private void FetchParameterTypes()
104152 {
105153 string lParameterTypeId = lChild . SubId ( "Id" , "_PT-" ) ;
106154 if ( lParameterTypeId == "" ) continue ;
107- if ( sParameterTypes . ContainsKey ( lParameterTypeId ) )
108- {
109- // we try to merge parameter types
110- bool lMerged = MergeParameterTypes ( sParameterTypes [ lParameterTypeId ] , lChild ) ;
111- if ( lMerged ) lMergedList . Add ( lChild ) ;
112- }
113- else
155+ if ( ! sParameterTypes . ContainsKey ( lParameterTypeId ) )
114156 {
115157 // Speed: we don't add the full type node, just the type definition itself
116158 XmlNode lTypeChild = lChild . FirstChild ;
117159 while ( lTypeChild != null && lTypeChild . NodeType == XmlNodeType . Comment ) lTypeChild = lTypeChild . NextSibling ;
118160 sParameterTypes . Add ( lParameterTypeId , lTypeChild ) ;
119161 }
120162 }
121- // we remove all merged parameter types from the document
122- // this is necessary, because the parameter types are not allowed to be duplicated
123- // has to be done after the loop, otherwise we get an exception
124- if ( lMergedList . Count > 0 )
125- foreach ( XmlNode lChild in lMergedList )
126- lChild . ParentNode . RemoveChild ( lChild ) ;
127163 }
128164 mParameterTypesFetched = true ;
129165 }
130166
131167 }
132168
169+
133170 public static XmlNode ParameterType ( string iId , bool iError = true )
134171 {
135172 string lId = "_PT-" ;
@@ -677,7 +714,7 @@ void ProcessTemplate(DefineContent iDefine, int iChannel, XmlNode iTargetNode, P
677714 ProcessUnion ( iDefine , iChannel , iTargetNode , iInclude ) ;
678715 }
679716 else
680- if ( "Channel,ChannelIndependentBlock,ParameterBlock,choose,ParameterCalculations,ParameterValidations,ModuleDef" . Contains ( iTargetNode . Name ) )
717+ if ( "ParameterType, Channel,ChannelIndependentBlock,ParameterBlock,choose,ParameterCalculations,ParameterValidations,ModuleDef" . Contains ( iTargetNode . Name ) )
681718 {
682719 ProcessChannel ( iDefine , iChannel , iTargetNode , iInclude ) ;
683720 }
@@ -691,7 +728,7 @@ static void ReplaceDocumentStrings(XmlNode iNode, string iSourceText, string iTa
691728 foreach ( XmlAttribute lAttribute in lAttributes )
692729 {
693730 XmlNode lNode = lAttribute . OwnerElement ;
694- XmlNode lComment = lNode . OwnerDocument . CreateComment ( "Replaced " + iSourceText + " by " + iTargetText ) ;
731+ XmlNode lComment = lNode . OwnerDocument . CreateComment ( "Replaced " + iSourceText + " by ' " + iTargetText + "'" ) ;
695732 lNode . ParentNode . InsertBefore ( lComment , lNode ) ;
696733 lAttribute . Value = lAttribute . Value . Replace ( iSourceText , iTargetText ) ;
697734 }
@@ -701,6 +738,7 @@ bool ProcessFinish(XmlNode iTargetNode)
701738 {
702739 Console . WriteLine ( "Processing merged file..." ) ;
703740 ProcessConfig ( iTargetNode ) ;
741+ MergeParameterTypes ( ) ;
704742 ReplaceKoTemplateFinal ( iTargetNode ) ;
705743 // ensure, that we found maxKoNumber
706744 XmlNodeList lKoNumbers = iTargetNode . SelectNodes ( "//ComObject/@Number" ) ;
@@ -2053,7 +2091,6 @@ private void ExportHeader(DefineContent iDefine, string iHeaderPrefixName, Proce
20532091 // if (iInclude.IsInnerInclude)
20542092 // return;
20552093 XmlNodeList lParameterNodes ;
2056- // FetchParameterTypes();
20572094 if ( sParameterTypes . Count > 0 )
20582095 {
20592096 // the main document contains necessary ParameterTypes definitions
0 commit comments