1212 * limitations under the License.
1313 */
1414
15- import { ClassDeclaration , ModelFile , Property } from '@accordproject/concerto-core' ;
15+ import { ClassDeclaration , MapDeclaration , ModelFile , Property } from '@accordproject/concerto-core' ;
1616import { CompareConfig , CompareResult , defaultCompareConfig } from './compare-config' ;
1717import { CompareFinding } from './compare-message' ;
1818import { CompareResults } from './compare-results' ;
@@ -65,6 +65,18 @@ export class Compare {
6565 removed . forEach ( a => comparers . forEach ( comparer => comparer . compareProperty ?.( a , undefined ) ) ) ;
6666 }
6767
68+ private getAddedMapDeclarations ( a : MapDeclaration [ ] , b : MapDeclaration [ ] ) : MapDeclaration [ ] {
69+ return b . filter ( bItem => ! a . some ( aItem => bItem . getName ( ) === aItem . getName ( ) ) ) ;
70+ }
71+
72+ private getMatchingMapDeclarations ( a : MapDeclaration [ ] , b : MapDeclaration [ ] ) : [ a : MapDeclaration , b : MapDeclaration ] [ ] {
73+ return a . map ( aItem => [ aItem , b . find ( bItem => aItem . getName ( ) === bItem . getName ( ) ) ] ) . filter ( ( [ , b ] ) => ! ! b ) as [ MapDeclaration , MapDeclaration ] [ ] ;
74+ }
75+
76+ private getRemovedMapDeclarations ( a : MapDeclaration [ ] , b : MapDeclaration [ ] ) : MapDeclaration [ ] {
77+ return a . filter ( aItem => ! b . some ( bItem => aItem . getName ( ) === bItem . getName ( ) ) ) ;
78+ }
79+
6880 private getAddedClassDeclarations ( a : ClassDeclaration [ ] , b : ClassDeclaration [ ] ) : ClassDeclaration [ ] {
6981 return b . filter ( bItem => ! a . some ( aItem => bItem . getName ( ) === aItem . getName ( ) ) ) ;
7082 }
@@ -77,8 +89,21 @@ export class Compare {
7789 return a . filter ( aItem => ! b . some ( bItem => aItem . getName ( ) === bItem . getName ( ) ) ) ;
7890 }
7991
92+ private compareMapDeclarations ( comparers : Comparer [ ] , a : MapDeclaration [ ] , b : MapDeclaration [ ] ) {
93+ const added = this . getAddedMapDeclarations ( a , b ) ;
94+ const matching = this . getMatchingMapDeclarations ( a , b ) ;
95+ const removed = this . getRemovedMapDeclarations ( a , b ) ;
96+ added . forEach ( b => comparers . forEach ( comparer => comparer . compareMapDeclaration ?.( undefined , b ) ) ) ;
97+ matching . forEach ( ( [ a , b ] ) => comparers . forEach ( comparer => comparer . compareMapDeclaration ?.( a , b ) ) ) ;
98+ removed . forEach ( a => comparers . forEach ( comparer => comparer . compareMapDeclaration ?.( a , undefined ) ) ) ;
99+ }
100+
80101 private compareClassDeclaration ( comparers : Comparer [ ] , a : ClassDeclaration , b : ClassDeclaration ) {
81102 comparers . forEach ( comparer => comparer . compareClassDeclaration ?.( a , b ) ) ;
103+ // MapDeclarations do not contain properties, nothing to compare.
104+ if ( a instanceof MapDeclaration || b instanceof MapDeclaration ) {
105+ return ;
106+ }
82107 this . compareProperties ( comparers , a . getOwnProperties ( ) , b . getOwnProperties ( ) ) ;
83108 }
84109
@@ -94,6 +119,7 @@ export class Compare {
94119 private compareModelFiles ( comparers : Comparer [ ] , a : ModelFile , b : ModelFile ) {
95120 comparers . forEach ( comparer => comparer . compareModelFiles ?.( a , b ) ) ;
96121 this . compareClassDeclarations ( comparers , a . getAllDeclarations ( ) , b . getAllDeclarations ( ) ) ;
122+ this . compareMapDeclarations ( comparers , a . getMapDeclarations ( ) , b . getMapDeclarations ( ) ) ;
97123 }
98124
99125 private buildResults ( findings : CompareFinding [ ] ) {
0 commit comments