@@ -36,6 +36,11 @@ public TypeDefinitionModel(IEntityModelContext context, IUnresolvedTypeDefinitio
3636 this . fullTypeName = firstPart . FullTypeName ;
3737 }
3838
39+ public IEntityModelContext Context
40+ {
41+ get { return context ; }
42+ }
43+
3944 public IReadOnlyList < IUnresolvedTypeDefinition > Parts {
4045 get { return parts ; }
4146 }
@@ -139,14 +144,14 @@ public void UpdatePart(int partIndex, IUnresolvedTypeDefinition newPart)
139144 var newMembers = newPart . Members ;
140145 int startPos = 0 ;
141146 // Look at the initial members and update them if they're matching
142- while ( startPos < list . Count && startPos < newMembers . Count && IsMatch ( list [ startPos ] , newMembers [ startPos ] ) ) {
147+ while ( startPos < list . Count && startPos < newMembers . Count && IsMatch ( parent . Context , list [ startPos ] , newMembers [ startPos ] ) ) {
143148 list [ startPos ] . Update ( newMembers [ startPos ] ) ;
144149 startPos ++ ;
145150 }
146151 // Look at the final members
147152 int endPosOld = list . Count - 1 ;
148153 int endPosNew = newMembers . Count - 1 ;
149- while ( endPosOld >= startPos && endPosNew >= startPos && IsMatch ( list [ endPosOld ] , newMembers [ endPosNew ] ) ) {
154+ while ( endPosOld >= startPos && endPosNew >= startPos && IsMatch ( parent . Context , list [ endPosOld ] , newMembers [ endPosNew ] ) ) {
150155 list [ endPosOld -- ] . Update ( newMembers [ endPosNew -- ] ) ;
151156 }
152157 // [startPos, endPos] is the middle portion that contains all the changes
@@ -172,9 +177,32 @@ public void UpdatePart(int partIndex, IUnresolvedTypeDefinition newPart)
172177 }
173178 }
174179
175- static bool IsMatch ( MemberModel memberModel , IUnresolvedMember newMember )
180+ static bool IsMatch ( IEntityModelContext context , MemberModel memberModel , IUnresolvedMember newMember )
176181 {
177- return memberModel . SymbolKind == newMember . SymbolKind && memberModel . Name == newMember . Name ;
182+ bool isSymbolOfTypeAndName = memberModel . SymbolKind == newMember . SymbolKind && memberModel . Name == newMember . Name ;
183+ if ( isSymbolOfTypeAndName ) {
184+ var parametrizedNewMember = newMember as IUnresolvedParameterizedMember ;
185+ var parametrizedModelMember = memberModel . UnresolvedMember as IUnresolvedParameterizedMember ;
186+ if ( ( parametrizedNewMember != null ) && ( parametrizedModelMember != null ) ) {
187+ // For methods and constructors additionally check the parameters and their types to handle overloading properly
188+ int treeNodeParamsCount = parametrizedModelMember . Parameters != null ? parametrizedModelMember . Parameters . Count : 0 ;
189+ int entityParamsCount = parametrizedNewMember . Parameters != null ? parametrizedNewMember . Parameters . Count : 0 ;
190+ if ( treeNodeParamsCount == entityParamsCount ) {
191+ for ( int i = 0 ; i < entityParamsCount ; i ++ ) {
192+ if ( ! parametrizedNewMember . Parameters [ i ] . Type . Resolve ( context . GetCompilation ( ) ) . Equals ( parametrizedModelMember . Parameters [ i ] . Type . Resolve ( context . GetCompilation ( ) ) ) ) {
193+ return false ;
194+ }
195+ }
196+
197+ // All parameters were equal
198+ return true ;
199+ }
200+ } else {
201+ return true ;
202+ }
203+ }
204+
205+ return false ;
178206 }
179207
180208 public event ModelCollectionChangedEventHandler < MemberModel > CollectionChanged {
0 commit comments