1818
1919import com .google .common .annotations .VisibleForTesting ;
2020import java .util .ArrayList ;
21+ import java .util .Collection ;
2122import java .util .HashSet ;
2223import java .util .List ;
2324import java .util .Set ;
2425import javax .annotation .CheckForNull ;
26+
27+ import org .slf4j .Logger ;
28+ import org .slf4j .LoggerFactory ;
2529import org .sonar .plugins .python .api .LocationInFile ;
2630import org .sonar .python .types .protobuf .DescriptorsProtos ;
2731import org .sonar .python .types .protobuf .SymbolsProtos ;
2832
2933public class DescriptorsToProtobuf {
34+ private static final Logger LOG = LoggerFactory .getLogger (DescriptorsToProtobuf .class );
3035
3136 private DescriptorsToProtobuf () {
3237 }
3338
3439 public static DescriptorsProtos .ModuleDescriptor toProtobufModuleDescriptor (Set <Descriptor > descriptors ) {
40+ return DescriptorsProtos .ModuleDescriptor .newBuilder ()
41+ .setDescriptors (toProtobufDescriptorList (descriptors ))
42+ .build ();
43+ }
44+
45+ private static DescriptorsProtos .DescriptorList toProtobufDescriptorList (Collection <Descriptor > descriptors ) {
3546 List <DescriptorsProtos .ClassDescriptor > classDescriptors = new ArrayList <>();
3647 List <DescriptorsProtos .FunctionDescriptor > functionDescriptors = new ArrayList <>();
3748 List <DescriptorsProtos .VarDescriptor > varDescriptors = new ArrayList <>();
3849 List <DescriptorsProtos .AmbiguousDescriptor > ambiguousDescriptors = new ArrayList <>();
3950 for (Descriptor descriptor : descriptors ) {
40- Descriptor .Kind kind = descriptor .kind ();
41- if (kind == Descriptor .Kind .CLASS ) {
42- classDescriptors .add (toProtobuf (((ClassDescriptor ) descriptor )));
43- } else if (kind == Descriptor .Kind .FUNCTION ) {
44- functionDescriptors .add (toProtobuf ((FunctionDescriptor ) descriptor ));
45- } else if (kind == Descriptor .Kind .VARIABLE ) {
46- varDescriptors .add (toProtobuf ((VariableDescriptor ) descriptor ));
47- } else {
48- ambiguousDescriptors .add (toProtobuf ((AmbiguousDescriptor ) descriptor ));
51+ switch (descriptor .kind ()) {
52+ case CLASS -> classDescriptors .add (toProtobuf ((ClassDescriptor ) descriptor ));
53+ case FUNCTION -> functionDescriptors .add (toProtobuf ((FunctionDescriptor ) descriptor ));
54+ case VARIABLE -> varDescriptors .add (toProtobuf ((VariableDescriptor ) descriptor ));
55+ case AMBIGUOUS -> ambiguousDescriptors .add (toProtobuf ((AmbiguousDescriptor ) descriptor ));
56+ default -> LOG .debug ("Unknown descriptor kind: {}" , descriptor .kind ());
4957 }
5058 }
51- return DescriptorsProtos .ModuleDescriptor .newBuilder ()
59+ return DescriptorsProtos .DescriptorList .newBuilder ()
5260 .addAllClassDescriptors (classDescriptors )
5361 .addAllFunctionDescriptors (functionDescriptors )
5462 .addAllVarDescriptors (varDescriptors )
@@ -57,24 +65,9 @@ public static DescriptorsProtos.ModuleDescriptor toProtobufModuleDescriptor(Set<
5765 }
5866
5967 private static DescriptorsProtos .AmbiguousDescriptor toProtobuf (AmbiguousDescriptor ambiguousDescriptor ) {
60- List <DescriptorsProtos .FunctionDescriptor > functionDescriptors = new ArrayList <>();
61- List <DescriptorsProtos .VarDescriptor > variableDescriptors = new ArrayList <>();
62- List <DescriptorsProtos .ClassDescriptor > classDescriptors = new ArrayList <>();
63- for (Descriptor descriptor : ambiguousDescriptor .alternatives ()) {
64- Descriptor .Kind kind = descriptor .kind ();
65- if (kind == Descriptor .Kind .FUNCTION ) {
66- functionDescriptors .add (toProtobuf ((FunctionDescriptor ) descriptor ));
67- } else if (kind == Descriptor .Kind .VARIABLE ) {
68- variableDescriptors .add (toProtobuf ((VariableDescriptor ) descriptor ));
69- } else {
70- classDescriptors .add (toProtobuf ((ClassDescriptor ) descriptor ));
71- }
72- }
73- DescriptorsProtos .AmbiguousDescriptor .Builder builder = DescriptorsProtos .AmbiguousDescriptor .newBuilder ();
74- builder .setName (ambiguousDescriptor .name ())
75- .addAllClassDescriptors (classDescriptors )
76- .addAllFunctionDescriptors (functionDescriptors )
77- .addAllVarDescriptors (variableDescriptors );
68+ DescriptorsProtos .AmbiguousDescriptor .Builder builder = DescriptorsProtos .AmbiguousDescriptor .newBuilder ()
69+ .setName (ambiguousDescriptor .name ())
70+ .setAlternatives (toProtobufDescriptorList (ambiguousDescriptor .alternatives ()));
7871 String fullyQualifiedName = ambiguousDescriptor .fullyQualifiedName ();
7972 if (fullyQualifiedName != null ) {
8073 builder .setFullyQualifiedName (fullyQualifiedName );
@@ -83,30 +76,11 @@ private static DescriptorsProtos.AmbiguousDescriptor toProtobuf(AmbiguousDescrip
8376 }
8477
8578 private static DescriptorsProtos .ClassDescriptor toProtobuf (ClassDescriptor classDescriptor ) {
86- List <DescriptorsProtos .FunctionDescriptor > functionMembers = new ArrayList <>();
87- List <DescriptorsProtos .VarDescriptor > variableMembers = new ArrayList <>();
88- List <DescriptorsProtos .AmbiguousDescriptor > ambiguousMembers = new ArrayList <>();
89- List <DescriptorsProtos .ClassDescriptor > classMembers = new ArrayList <>();
90- for (Descriptor member : classDescriptor .members ()) {
91- Descriptor .Kind kind = member .kind ();
92- if (kind == Descriptor .Kind .FUNCTION ) {
93- functionMembers .add (toProtobuf (((FunctionDescriptor ) member )));
94- } else if (kind == Descriptor .Kind .VARIABLE ) {
95- variableMembers .add (toProtobuf (((VariableDescriptor ) member )));
96- } else if (kind == Descriptor .Kind .AMBIGUOUS ) {
97- ambiguousMembers .add (toProtobuf ((AmbiguousDescriptor ) member ));
98- } else {
99- classMembers .add (toProtobuf ((ClassDescriptor ) member ));
100- }
101- }
10279 DescriptorsProtos .ClassDescriptor .Builder builder = DescriptorsProtos .ClassDescriptor .newBuilder ()
10380 .setName (classDescriptor .name ())
10481 .setFullyQualifiedName (classDescriptor .fullyQualifiedName ())
10582 .addAllSuperClasses (classDescriptor .superClasses ())
106- .addAllFunctionMembers (functionMembers )
107- .addAllVarMembers (variableMembers )
108- .addAllAmbiguousMembers (ambiguousMembers )
109- .addAllClassMembers (classMembers )
83+ .setMembers (toProtobufDescriptorList (classDescriptor .members ()))
11084 .setHasDecorators (classDescriptor .hasDecorators ())
11185 .setHasSuperClassWithoutDescriptor (classDescriptor .hasSuperClassWithoutDescriptor ())
11286 .setHasMetaClass (classDescriptor .hasMetaClass ())
@@ -174,8 +148,10 @@ private static DescriptorsProtos.ParameterDescriptor toProtobuf(FunctionDescript
174148
175149 @ VisibleForTesting
176150 static DescriptorsProtos .VarDescriptor toProtobuf (VariableDescriptor variableDescriptor ) {
177- DescriptorsProtos .VarDescriptor .Builder builder = DescriptorsProtos .VarDescriptor .newBuilder ();
178- builder .setName (variableDescriptor .name ());
151+ DescriptorsProtos .VarDescriptor .Builder builder = DescriptorsProtos .VarDescriptor .newBuilder ()
152+ .setName (variableDescriptor .name ())
153+ .setAttributes (toProtobufDescriptorList (variableDescriptor .attributes ()))
154+ .setMembers (toProtobufDescriptorList (variableDescriptor .members ()));
179155 String fullyQualifiedName = variableDescriptor .fullyQualifiedName ();
180156 if (fullyQualifiedName != null ) {
181157 builder .setFullyQualifiedName (fullyQualifiedName );
@@ -211,35 +187,41 @@ private static SymbolsProtos.Type toProtobuf(TypeAnnotationDescriptor typeAnnota
211187 }
212188
213189 public static Set <Descriptor > fromProtobuf (DescriptorsProtos .ModuleDescriptor moduleDescriptorProto ) {
190+ return fromProtobufDescriptorList (moduleDescriptorProto .getDescriptors ());
191+ }
192+
193+ private static Set <Descriptor > fromProtobufDescriptorList (DescriptorsProtos .DescriptorList descriptorList ) {
214194 Set <Descriptor > descriptors = new HashSet <>();
215- moduleDescriptorProto .getClassDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
216- moduleDescriptorProto .getFunctionDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
217- moduleDescriptorProto .getAmbiguousDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
218- moduleDescriptorProto .getVarDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
195+ descriptorList .getClassDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
196+ descriptorList .getFunctionDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
197+ descriptorList .getAmbiguousDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
198+ descriptorList .getVarDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
199+ return descriptors ;
200+ }
201+
202+ private static List <Descriptor > fromProtobufDescriptorListAsList (DescriptorsProtos .DescriptorList descriptorList ) {
203+ List <Descriptor > descriptors = new ArrayList <>();
204+ descriptorList .getClassDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
205+ descriptorList .getFunctionDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
206+ descriptorList .getAmbiguousDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
207+ descriptorList .getVarDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
219208 return descriptors ;
220209 }
221210
222211 private static AmbiguousDescriptor fromProtobuf (DescriptorsProtos .AmbiguousDescriptor ambiguousDescriptor ) {
223212 String fullyQualifiedName = ambiguousDescriptor .hasFullyQualifiedName () ? ambiguousDescriptor .getFullyQualifiedName () : null ;
224- Set <Descriptor > descriptors = new HashSet <>();
225- ambiguousDescriptor .getClassDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
226- ambiguousDescriptor .getFunctionDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
227- ambiguousDescriptor .getVarDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
213+ Set <Descriptor > alternatives = fromProtobufDescriptorList (ambiguousDescriptor .getAlternatives ());
228214 return new AmbiguousDescriptor (
229215 ambiguousDescriptor .getName (),
230216 fullyQualifiedName ,
231- descriptors );
217+ alternatives );
232218 }
233219
234220 private static ClassDescriptor fromProtobuf (DescriptorsProtos .ClassDescriptor classDescriptorProto ) {
235221 String metaclassFQN = classDescriptorProto .hasMetaClassFQN () ? classDescriptorProto .getMetaClassFQN () : null ;
236222 LocationInFile definitionLocation = classDescriptorProto .hasDefinitionLocation () ? fromProtobuf (classDescriptorProto .getDefinitionLocation ()) : null ;
237223 String fullyQualifiedName = classDescriptorProto .getFullyQualifiedName ();
238- Set <Descriptor > members = new HashSet <>();
239- classDescriptorProto .getClassMembersList ().forEach (proto -> members .add (fromProtobuf (proto )));
240- classDescriptorProto .getFunctionMembersList ().forEach (proto -> members .add (fromProtobuf (proto )));
241- classDescriptorProto .getAmbiguousMembersList ().forEach (proto -> members .add (fromProtobuf (proto )));
242- classDescriptorProto .getVarMembersList ().forEach (proto -> members .add (fromProtobuf (proto )));
224+ Set <Descriptor > members = fromProtobufDescriptorList (classDescriptorProto .getMembers ());
243225 return new ClassDescriptor .ClassDescriptorBuilder ()
244226 .withName (classDescriptorProto .getName ())
245227 .withFullyQualifiedName (fullyQualifiedName )
@@ -301,10 +283,15 @@ private static FunctionDescriptor.Parameter fromProtobuf(DescriptorsProtos.Param
301283 static VariableDescriptor fromProtobuf (DescriptorsProtos .VarDescriptor varDescriptorProto ) {
302284 String fullyQualifiedName = varDescriptorProto .hasFullyQualifiedName () ? varDescriptorProto .getFullyQualifiedName () : null ;
303285 String annotatedType = varDescriptorProto .hasAnnotatedType () ? varDescriptorProto .getAnnotatedType () : null ;
286+ List <Descriptor > attributes = fromProtobufDescriptorListAsList (varDescriptorProto .getAttributes ());
287+ List <Descriptor > members = fromProtobufDescriptorListAsList (varDescriptorProto .getMembers ());
304288 return new VariableDescriptor (
305289 varDescriptorProto .getName (),
306290 fullyQualifiedName ,
307- annotatedType );
291+ annotatedType ,
292+ false ,
293+ attributes ,
294+ members );
308295 }
309296
310297 private static LocationInFile fromProtobuf (DescriptorsProtos .LocationInFile locationInFileProto ) {
0 commit comments