private void ProcessCandidates(List <TypeDeclarationSyntax> candidates) { foreach (var candidate in candidates) { SemanticModel classModel = _context.Compilation.GetSemanticModel(candidate.SyntaxTree); var symbol = classModel.GetDeclaredSymbol(candidate); var declmeta = new ClassDeclMeta(symbol); switch (candidate) { case ClassDeclarationSyntax classdecl: { AddMemberIfNeed(declmeta, classdecl); break; } case StructDeclarationSyntax structdecl: { AddMemberIfNeed(declmeta, structdecl); break; } //case RecordDeclarationSyntax recorddecl: // { // AddMemberIfNeed(declmeta, recorddecl); // break; // } } if (declmeta.MemberDeclarations.Count > 0) { meta.Add(declmeta); } } }
private void AddMemberIfNeed(ClassDeclMeta decl, TypeDeclarationSyntax syntax) { foreach (var member in syntax.Members) { switch (member) { case FieldDeclarationSyntax fielddecl: { SemanticModel memberModel = _context.Compilation.GetSemanticModel(fielddecl.SyntaxTree); foreach (var variable in fielddecl.Declaration.Variables) { IFieldSymbol fieldSymbol = memberModel.GetDeclaredSymbol(variable) as IFieldSymbol; if (IsIgnore(fieldSymbol)) { continue; } if (fieldSymbol.DeclaredAccessibility == Accessibility.Public) { decl.MemberDeclarations.Add(new MemberDeclarationMeta(fieldSymbol)); } } break; } case PropertyDeclarationSyntax propdecl: { SemanticModel memberModel = _context.Compilation.GetSemanticModel(propdecl.SyntaxTree); ISymbol propertySymbol = memberModel.GetDeclaredSymbol(propdecl); if (IsIgnore(propertySymbol)) { continue; } if (propertySymbol.DeclaredAccessibility == Accessibility.Public) { decl.MemberDeclarations.Add(new MemberDeclarationMeta(propertySymbol)); } break; } } } }