Skip to content

Commit 45018d2

Browse files
Seppli11sonartech
authored andcommitted
SONARPY-3628 Serialize all ObjectType fields (#830)
GitOrigin-RevId: 490b408f47786d3f1d74ef6742b5518bb7beb426
1 parent efd4142 commit 45018d2

12 files changed

Lines changed: 380 additions & 92 deletions

python-frontend/src/main/java/org/sonar/python/index/DescriptorsToProtobuf.java

Lines changed: 52 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,45 @@
1818

1919
import com.google.common.annotations.VisibleForTesting;
2020
import java.util.ArrayList;
21+
import java.util.Collection;
2122
import java.util.HashSet;
2223
import java.util.List;
2324
import java.util.Set;
2425
import javax.annotation.CheckForNull;
26+
27+
import org.slf4j.Logger;
28+
import org.slf4j.LoggerFactory;
2529
import org.sonar.plugins.python.api.LocationInFile;
2630
import org.sonar.python.types.protobuf.DescriptorsProtos;
2731
import org.sonar.python.types.protobuf.SymbolsProtos;
2832

2933
public 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) {

python-frontend/src/main/java/org/sonar/python/index/VariableDescriptor.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.sonar.python.index;
1818

19+
import java.util.List;
1920
import javax.annotation.CheckForNull;
2021
import javax.annotation.Nullable;
2122

@@ -24,16 +25,21 @@ public class VariableDescriptor implements Descriptor {
2425
private final String fullyQualifiedName;
2526
private final String annotatedType;
2627
private final boolean isImportedModule;
28+
private final List<Descriptor> attributes;
29+
private final List<Descriptor> members;
2730

28-
public VariableDescriptor(String name, @Nullable String fullyQualifiedName, @Nullable String annotatedType, boolean isImportedModule) {
31+
public VariableDescriptor(String name, @Nullable String fullyQualifiedName, @Nullable String annotatedType,
32+
boolean isImportedModule, List<Descriptor> attributes, List<Descriptor> members) {
2933
this.name = name;
3034
this.fullyQualifiedName = fullyQualifiedName;
3135
this.annotatedType = annotatedType;
3236
this.isImportedModule = isImportedModule;
37+
this.attributes = attributes;
38+
this.members = members;
3339
}
3440

3541
public VariableDescriptor(String name, @Nullable String fullyQualifiedName, @Nullable String annotatedType) {
36-
this(name, fullyQualifiedName, annotatedType, false);
42+
this(name, fullyQualifiedName, annotatedType, false, List.of(), List.of());
3743
}
3844

3945
@Override
@@ -59,4 +65,12 @@ public String annotatedType() {
5965
public boolean isImportedModule() {
6066
return isImportedModule;
6167
}
68+
69+
public List<Descriptor> attributes() {
70+
return attributes;
71+
}
72+
73+
public List<Descriptor> members() {
74+
return members;
75+
}
6276
}

python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverter.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,43 @@ private static Descriptor convert(String moduleFqn, String parentFqn, String sym
8585
return convert(parentFqn, symbolName, unresolvedImportType);
8686
}
8787
if (type instanceof ObjectType objectType && !moduleFqn.equals(parentFqn)) {
88-
return convert(parentFqn, symbolName, objectType);
88+
return convert(moduleFqn, parentFqn, symbolName, objectType);
8989
}
9090
return new VariableDescriptor(symbolName, symbolFqn(parentFqn, symbolName), null);
9191
}
9292

93-
private static Descriptor convert(String parentFqn, String symbolName, ObjectType objectType) {
94-
return new VariableDescriptor(symbolName, symbolFqn(parentFqn, symbolName), FullyQualifiedNameHelper.getFullyQualifiedName(objectType.unwrappedType()).orElse(null));
93+
private static Descriptor convert(String moduleFqn, String parentFqn, String symbolName, ObjectType objectType) {
94+
String fqn = FullyQualifiedNameHelper.getFullyQualifiedName(objectType.unwrappedType()).orElse(null);
95+
String symbolFqn = symbolFqn(parentFqn, symbolName);
96+
97+
List<Descriptor> attributeDescriptors = objectType.attributes().stream()
98+
.map(attr -> convertTypeParameter(moduleFqn, attr))
99+
.toList();
100+
101+
List<Descriptor> memberDescriptors = objectType.members().stream()
102+
.map(m -> convert(moduleFqn, symbolFqn, m.name(), m.type(), List.of()))
103+
.toList();
104+
105+
return new VariableDescriptor(symbolName, symbolFqn, fqn, false, attributeDescriptors, memberDescriptors);
106+
}
107+
108+
private static Descriptor convertTypeParameter(String moduleFqn, PythonType type) {
109+
String typeFqn = FullyQualifiedNameHelper.getFullyQualifiedName(type.unwrappedType()).orElse(null);
110+
String typeName = type.unwrappedType().displayName().orElse("type_param");
111+
112+
if (type instanceof ObjectType objectType) {
113+
List<Descriptor> nestedAttributes = objectType.attributes().stream()
114+
.map(attr -> convertTypeParameter(moduleFqn, attr))
115+
.toList();
116+
117+
List<Descriptor> nestedMembers = objectType.members().stream()
118+
.map(m -> convert(moduleFqn, typeFqn != null ? typeFqn : moduleFqn, m.name(), m.type(), List.of()))
119+
.toList();
120+
121+
return new VariableDescriptor(typeName, typeFqn, typeFqn, false, nestedAttributes, nestedMembers);
122+
}
123+
124+
return new VariableDescriptor(typeName, typeFqn, typeFqn);
95125
}
96126

97127
private static Descriptor convert(FunctionType type) {
@@ -231,7 +261,7 @@ private static TypeAnnotationDescriptor createTypeAnnotationDescriptor(PythonTyp
231261
} else if (type instanceof FunctionType functionType) {
232262
return new TypeAnnotationDescriptor(functionType.name(), TypeAnnotationDescriptor.TypeKind.CALLABLE, List.of(), functionType.fullyQualifiedName(), false);
233263
} else if (type instanceof UnknownType.UnresolvedImportType importType) {
234-
return new TypeAnnotationDescriptor(importType.importPath(), TypeAnnotationDescriptor.TypeKind.INSTANCE, List.of(),
264+
return new TypeAnnotationDescriptor(importType.importPath(), TypeAnnotationDescriptor.TypeKind.INSTANCE, List.of(),
235265
FullyQualifiedNameHelper.getFullyQualifiedName(importType).orElse(null), false);
236266
}
237267
return null;

python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverter.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
*/
1717
package org.sonar.python.semantic.v2.converter;
1818

19+
import java.util.List;
1920
import java.util.Set;
21+
import org.sonar.plugins.python.api.types.v2.Member;
2022
import org.sonar.plugins.python.api.types.v2.ObjectType;
2123
import org.sonar.plugins.python.api.types.v2.PythonType;
2224
import org.sonar.plugins.python.api.types.v2.TypeWrapper;
@@ -39,7 +41,19 @@ public PythonType convert(ConversionContext ctx, VariableDescriptor from) {
3941
return new SpecialFormType(fullyQualifiedName);
4042
}
4143
TypeWrapper typeWrapper = ctx.lazyTypesContext().getOrCreateLazyTypeWrapper(annotatedType);
42-
return ObjectType.Builder.fromTypeWrapper(typeWrapper).build();
44+
45+
List<PythonType> attributes = from.attributes().stream()
46+
.map(ctx::convert)
47+
.toList();
48+
49+
List<Member> members = from.members().stream()
50+
.map(desc -> new Member(desc.name(), ctx.convert(desc)))
51+
.toList();
52+
53+
return ObjectType.Builder.fromTypeWrapper(typeWrapper)
54+
.withAttributes(attributes)
55+
.withMembers(members)
56+
.build();
4357
}
4458
return PythonType.UNKNOWN;
4559
}

python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.Map;
2828
import java.util.Optional;
2929
import java.util.Set;
30-
import java.util.function.Predicate;
3130
import java.util.stream.Collectors;
3231
import java.util.stream.Stream;
3332
import javax.annotation.CheckForNull;
@@ -622,13 +621,12 @@ public void visitAnnotatedAssignment(AnnotatedAssignment assignmentStatement) {
622621
.map(NameImpl.class::cast)
623622
.ifPresent(lhsName -> {
624623
if (currentType() instanceof ClassType ownerClass) {
625-
Optional.ofNullable(assignmentStatement.annotation())
626-
.map(TypeAnnotation::expression)
627-
.map(Expression::typeV2)
628-
.filter(Predicate.not(PythonType.UNKNOWN::equals))
629-
.map(t -> ObjectType.Builder.fromType(t).withTypeSource(TypeSource.TYPE_HINT).build())
630-
.ifPresent(lhsName::typeV2);
631-
addStaticFieldToClass(ownerClass, lhsName.name(), lhsName.typeV2());
624+
PythonType type = resolveTypeAnnotationExpressionType(assignmentStatement.annotation().expression(), ownerClass);
625+
if (type != PythonType.UNKNOWN) {
626+
var objectType = ObjectType.Builder.fromType(type).withTypeSource(TypeSource.TYPE_HINT).build();
627+
lhsName.typeV2(objectType);
628+
addStaticFieldToClass(ownerClass, lhsName.name(), objectType);
629+
}
632630
}
633631
});
634632
}

python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package org.sonar.python.semantic.v2.typeshed;
1818

19+
import java.util.List;
20+
1921
import javax.annotation.Nullable;
2022
import org.sonar.python.index.Descriptor;
2123
import org.sonar.python.index.VariableDescriptor;
@@ -29,9 +31,9 @@ public Descriptor convert(SymbolsProtos.VarSymbol varSymbol) {
2931
var isImportedModule = varSymbol.getIsImportedModule();
3032
var typeAnnotation = TypeShedUtils.getTypesNormalizedFqn(protoTypeAnnotation);
3133
if (isTypeAnnotationKnownToBeIncorrect(fullyQualifiedName)) {
32-
return new VariableDescriptor(varSymbol.getName(), fullyQualifiedName, null, isImportedModule);
34+
return new VariableDescriptor(varSymbol.getName(), fullyQualifiedName, null, isImportedModule, List.of(), List.of());
3335
}
34-
return new VariableDescriptor(varSymbol.getName(), fullyQualifiedName, typeAnnotation, isImportedModule);
36+
return new VariableDescriptor(varSymbol.getName(), fullyQualifiedName, typeAnnotation, isImportedModule, List.of(), List.of());
3537
}
3638

3739
private static boolean isTypeAnnotationKnownToBeIncorrect(@Nullable String fullyQualifiedName) {

0 commit comments

Comments
 (0)