1616 */
1717package org .sonar .python .index ;
1818
19+ import com .google .common .annotations .VisibleForTesting ;
1920import java .util .ArrayList ;
2021import java .util .HashSet ;
2122import java .util .List ;
2223import java .util .Set ;
24+ import javax .annotation .CheckForNull ;
2325import org .sonar .plugins .python .api .LocationInFile ;
2426import org .sonar .python .types .protobuf .DescriptorsProtos ;
27+ import org .sonar .python .types .protobuf .SymbolsProtos ;
2528
2629public class DescriptorsToProtobuf {
2730
28- private DescriptorsToProtobuf () {}
31+ private DescriptorsToProtobuf () {
32+ }
2933
3034 public static DescriptorsProtos .ModuleDescriptor toProtobufModuleDescriptor (Set <Descriptor > descriptors ) {
3135 List <DescriptorsProtos .ClassDescriptor > classDescriptors = new ArrayList <>();
@@ -52,7 +56,7 @@ public static DescriptorsProtos.ModuleDescriptor toProtobufModuleDescriptor(Set<
5256 .build ();
5357 }
5458
55- public static DescriptorsProtos .AmbiguousDescriptor toProtobuf (AmbiguousDescriptor ambiguousDescriptor ) {
59+ private static DescriptorsProtos .AmbiguousDescriptor toProtobuf (AmbiguousDescriptor ambiguousDescriptor ) {
5660 List <DescriptorsProtos .FunctionDescriptor > functionDescriptors = new ArrayList <>();
5761 List <DescriptorsProtos .VarDescriptor > variableDescriptors = new ArrayList <>();
5862 List <DescriptorsProtos .ClassDescriptor > classDescriptors = new ArrayList <>();
@@ -78,7 +82,7 @@ public static DescriptorsProtos.AmbiguousDescriptor toProtobuf(AmbiguousDescript
7882 return builder .build ();
7983 }
8084
81- public static DescriptorsProtos .ClassDescriptor toProtobuf (ClassDescriptor classDescriptor ) {
85+ private static DescriptorsProtos .ClassDescriptor toProtobuf (ClassDescriptor classDescriptor ) {
8286 List <DescriptorsProtos .FunctionDescriptor > functionMembers = new ArrayList <>();
8387 List <DescriptorsProtos .VarDescriptor > variableMembers = new ArrayList <>();
8488 List <DescriptorsProtos .AmbiguousDescriptor > ambiguousMembers = new ArrayList <>();
@@ -118,7 +122,7 @@ public static DescriptorsProtos.ClassDescriptor toProtobuf(ClassDescriptor class
118122 return builder .build ();
119123 }
120124
121- public static DescriptorsProtos .FunctionDescriptor toProtobuf (FunctionDescriptor functionDescriptor ) {
125+ private static DescriptorsProtos .FunctionDescriptor toProtobuf (FunctionDescriptor functionDescriptor ) {
122126 DescriptorsProtos .FunctionDescriptor .Builder builder = DescriptorsProtos .FunctionDescriptor .newBuilder ()
123127 .setName (functionDescriptor .name ())
124128 .setFullyQualifiedName (functionDescriptor .fullyQualifiedName ())
@@ -138,7 +142,7 @@ public static DescriptorsProtos.FunctionDescriptor toProtobuf(FunctionDescriptor
138142 return builder .build ();
139143 }
140144
141- public static DescriptorsProtos .ParameterDescriptor toProtobuf (FunctionDescriptor .Parameter parameterDescriptor ) {
145+ private static DescriptorsProtos .ParameterDescriptor toProtobuf (FunctionDescriptor .Parameter parameterDescriptor ) {
142146 DescriptorsProtos .ParameterDescriptor .Builder builder = DescriptorsProtos .ParameterDescriptor .newBuilder ()
143147 .setHasDefaultValue (parameterDescriptor .hasDefaultValue ())
144148 .setIsKeywordVariadic (parameterDescriptor .isKeywordVariadic ())
@@ -152,14 +156,19 @@ public static DescriptorsProtos.ParameterDescriptor toProtobuf(FunctionDescripto
152156 if (annotatedType != null ) {
153157 builder .setAnnotatedType (annotatedType );
154158 }
159+ TypeAnnotationDescriptor typeDescriptor = parameterDescriptor .descriptor ();
160+ if (typeDescriptor != null ) {
161+ builder .setTypeAnnotationDescriptor (toProtobuf (typeDescriptor ));
162+ }
155163 LocationInFile location = parameterDescriptor .location ();
156164 if (location != null ) {
157165 builder .setDefinitionLocation (toProtobuf (location ));
158166 }
159167 return builder .build ();
160168 }
161169
162- public static DescriptorsProtos .VarDescriptor toProtobuf (VariableDescriptor variableDescriptor ) {
170+ @ VisibleForTesting
171+ static DescriptorsProtos .VarDescriptor toProtobuf (VariableDescriptor variableDescriptor ) {
163172 DescriptorsProtos .VarDescriptor .Builder builder = DescriptorsProtos .VarDescriptor .newBuilder ();
164173 builder .setName (variableDescriptor .name ());
165174 String fullyQualifiedName = variableDescriptor .fullyQualifiedName ();
@@ -173,7 +182,7 @@ public static DescriptorsProtos.VarDescriptor toProtobuf(VariableDescriptor vari
173182 return builder .build ();
174183 }
175184
176- public static DescriptorsProtos .LocationInFile toProtobuf (LocationInFile locationInFile ) {
185+ private static DescriptorsProtos .LocationInFile toProtobuf (LocationInFile locationInFile ) {
177186 return DescriptorsProtos .LocationInFile .newBuilder ()
178187 .setFileId (locationInFile .fileId ())
179188 .setStartLine (locationInFile .startLine ())
@@ -183,6 +192,19 @@ public static DescriptorsProtos.LocationInFile toProtobuf(LocationInFile locatio
183192 .build ();
184193 }
185194
195+ private static SymbolsProtos .Type toProtobuf (TypeAnnotationDescriptor typeAnnotationDescriptor ) {
196+ SymbolsProtos .Type .Builder builder = SymbolsProtos .Type .newBuilder ()
197+ .setPrettyPrintedName (typeAnnotationDescriptor .prettyPrintedName ())
198+ .setKind (DescriptorUtils .typeAnnotationKindToSymbolKind (typeAnnotationDescriptor .kind ()))
199+ .addAllArgs (typeAnnotationDescriptor .args ().stream ().map (DescriptorsToProtobuf ::toProtobuf ).toList ())
200+ .setIsSelf (typeAnnotationDescriptor .isSelf ());
201+ String fullyQualifiedName = typeAnnotationDescriptor .fullyQualifiedName ();
202+ if (fullyQualifiedName != null ) {
203+ builder .setFullyQualifiedName (fullyQualifiedName );
204+ }
205+ return builder .build ();
206+ }
207+
186208 public static Set <Descriptor > fromProtobuf (DescriptorsProtos .ModuleDescriptor moduleDescriptorProto ) {
187209 Set <Descriptor > descriptors = new HashSet <>();
188210 moduleDescriptorProto .getClassDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
@@ -192,7 +214,7 @@ public static Set<Descriptor> fromProtobuf(DescriptorsProtos.ModuleDescriptor mo
192214 return descriptors ;
193215 }
194216
195- public static AmbiguousDescriptor fromProtobuf (DescriptorsProtos .AmbiguousDescriptor ambiguousDescriptor ) {
217+ private static AmbiguousDescriptor fromProtobuf (DescriptorsProtos .AmbiguousDescriptor ambiguousDescriptor ) {
196218 String fullyQualifiedName = ambiguousDescriptor .hasFullyQualifiedName () ? ambiguousDescriptor .getFullyQualifiedName () : null ;
197219 Set <Descriptor > descriptors = new HashSet <>();
198220 ambiguousDescriptor .getClassDescriptorsList ().forEach (proto -> descriptors .add (fromProtobuf (proto )));
@@ -201,11 +223,10 @@ public static AmbiguousDescriptor fromProtobuf(DescriptorsProtos.AmbiguousDescri
201223 return new AmbiguousDescriptor (
202224 ambiguousDescriptor .getName (),
203225 fullyQualifiedName ,
204- descriptors
205- );
226+ descriptors );
206227 }
207228
208- public static ClassDescriptor fromProtobuf (DescriptorsProtos .ClassDescriptor classDescriptorProto ) {
229+ private static ClassDescriptor fromProtobuf (DescriptorsProtos .ClassDescriptor classDescriptorProto ) {
209230 String metaclassFQN = classDescriptorProto .hasMetaClassFQN () ? classDescriptorProto .getMetaClassFQN () : null ;
210231 LocationInFile definitionLocation = classDescriptorProto .hasDefinitionLocation () ? fromProtobuf (classDescriptorProto .getDefinitionLocation ()) : null ;
211232 String fullyQualifiedName = classDescriptorProto .getFullyQualifiedName ();
@@ -228,7 +249,7 @@ public static ClassDescriptor fromProtobuf(DescriptorsProtos.ClassDescriptor cla
228249 .build ();
229250 }
230251
231- public static FunctionDescriptor fromProtobuf (DescriptorsProtos .FunctionDescriptor functionDescriptorProto ) {
252+ private static FunctionDescriptor fromProtobuf (DescriptorsProtos .FunctionDescriptor functionDescriptorProto ) {
232253 String fullyQualifiedName = functionDescriptorProto .getFullyQualifiedName ();
233254 List <FunctionDescriptor .Parameter > parameters = new ArrayList <>();
234255 functionDescriptorProto .getParametersList ().forEach (proto -> parameters .add (fromProtobuf (proto )));
@@ -243,43 +264,63 @@ public static FunctionDescriptor fromProtobuf(DescriptorsProtos.FunctionDescript
243264 new ArrayList <>(functionDescriptorProto .getDecoratorsList ()),
244265 functionDescriptorProto .getHasDecorators (),
245266 definitionLocation ,
246- annotatedReturnTypeName
247- );
267+ annotatedReturnTypeName ,
268+ // TypeAnnotationDescriptor is not serialized in protobuf
269+ null );
248270 }
249271
250- public static FunctionDescriptor .Parameter fromProtobuf (DescriptorsProtos .ParameterDescriptor parameterDescriptorProto ) {
272+ private static FunctionDescriptor .Parameter fromProtobuf (DescriptorsProtos .ParameterDescriptor parameterDescriptorProto ) {
251273 String name = parameterDescriptorProto .hasName () ? parameterDescriptorProto .getName () : null ;
252274 String annotatedType = parameterDescriptorProto .hasAnnotatedType () ? parameterDescriptorProto .getAnnotatedType () : null ;
253275 LocationInFile location = parameterDescriptorProto .hasDefinitionLocation () ? fromProtobuf (parameterDescriptorProto .getDefinitionLocation ()) : null ;
276+ TypeAnnotationDescriptor typeAnnotationDescriptor = parameterDescriptorProto .hasTypeAnnotationDescriptor ()
277+ ? fromProtobuf (parameterDescriptorProto .getTypeAnnotationDescriptor ())
278+ : null ;
254279 return new FunctionDescriptor .Parameter (
255280 name ,
256281 annotatedType ,
282+ typeAnnotationDescriptor ,
257283 parameterDescriptorProto .getHasDefaultValue (),
258284 parameterDescriptorProto .getIsKeywordOnly (),
259285 parameterDescriptorProto .getIsPositionalOnly (),
260286 parameterDescriptorProto .getIsPositionalVariadic (),
261287 parameterDescriptorProto .getIsKeywordVariadic (),
262- location
263- );
288+ location );
264289 }
265290
266- public static VariableDescriptor fromProtobuf (DescriptorsProtos .VarDescriptor varDescriptorProto ) {
291+ @ VisibleForTesting
292+ static VariableDescriptor fromProtobuf (DescriptorsProtos .VarDescriptor varDescriptorProto ) {
267293 String fullyQualifiedName = varDescriptorProto .hasFullyQualifiedName () ? varDescriptorProto .getFullyQualifiedName () : null ;
268294 String annotatedType = varDescriptorProto .hasAnnotatedType () ? varDescriptorProto .getAnnotatedType () : null ;
269295 return new VariableDescriptor (
270296 varDescriptorProto .getName (),
271297 fullyQualifiedName ,
272- annotatedType
273- );
298+ annotatedType );
274299 }
275300
276- public static LocationInFile fromProtobuf (DescriptorsProtos .LocationInFile locationInFileProto ) {
301+ private static LocationInFile fromProtobuf (DescriptorsProtos .LocationInFile locationInFileProto ) {
277302 return new LocationInFile (
278303 locationInFileProto .getFileId (),
279304 locationInFileProto .getStartLine (),
280305 locationInFileProto .getStartLineOffset (),
281306 locationInFileProto .getEndLine (),
282- locationInFileProto .getEndLineOffset ()
283- );
307+ locationInFileProto .getEndLineOffset ());
308+ }
309+
310+ @ CheckForNull
311+ private static TypeAnnotationDescriptor fromProtobuf (SymbolsProtos .Type typeProto ) {
312+ String fullyQualifiedName = typeProto .hasFullyQualifiedName () ? typeProto .getFullyQualifiedName () : null ;
313+ var kind = DescriptorUtils .symbolTypeKindToTypeAnnotationKind (typeProto .getKind ());
314+ if (kind == null ) {
315+ return null ;
316+ }
317+ List <TypeAnnotationDescriptor > args = new ArrayList <>();
318+ typeProto .getArgsList ().forEach (proto -> args .add (fromProtobuf (proto )));
319+ return new TypeAnnotationDescriptor (
320+ typeProto .getPrettyPrintedName (),
321+ kind ,
322+ args ,
323+ fullyQualifiedName ,
324+ typeProto .getIsSelf ());
284325 }
285326}
0 commit comments